Skip to content

Commit

Permalink
Merge pull request #4 from katsumasa/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
katsumasa authored Sep 28, 2022
2 parents ef8a223 + c3aec03 commit 09d7ebf
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 74 deletions.
7 changes: 5 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# Changelog

## [0.1.0] - 2021-10-27
## [0.1.1] - 2022-09-28

- [FIXED] shiftとfilterModeが実行時にリセットされていた不具合を修正
- [Changed] プロパティ名を一部変更

### Changes
## [0.1.0] - 2021-10-27

- 1st Release
7 changes: 7 additions & 0 deletions CODE_OF_CONDUCT.md.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 20 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
UIなどの2Dのレンダリング解像度はそのままに、3Dのレンダリング解像度を下げることで、見た目のクオリティを維持したまま、処理負荷を軽減することが期待できます。
本コンポーネントは特定のカメラのレンダリング解像度を動的に変更する事が可能です。


## Dynamic Resolutionとの比較

Unity2018以降のバージョンでは[Dynamic Resolution](https://docs.unity3d.com/ja/2018.4/Manual/DynamicResolution.html)が実装されています。
Expand All @@ -21,29 +20,41 @@ Dynamic Resolutionの使用サンプルは[こちら](https://github.com/katsuma

## 使い方

[RenderTextureCamera.cs](https://github.com/katsumasa/RenderTextureCamera/blob/master/Runtime/Scripts/RenderTextureCamera.cs)をレンダリング解像度を変更したいCameraのGameObjectにADDして下さい。
1. レンダリング解像度を変更する為のCameraを生成します。(既に描画対象毎にCameraが別れている場合は、新たに生成する必要はありません。)
2. このCameraが何をレンダリングするかを明示的に指定する為に[cullingMask](https://docs.unity3d.com/ja/current/ScriptReference/Camera-cullingMask.html)を設定します。
3. このCamera Objectへ[RenderTextureCamera Component](https://github.com/katsumasa/RenderTextureCamera/blob/master/Runtime/Scripts/RenderTextureCamera.cs)をにADDして下さい。
4. RenderTextureCamer Componentの`renderTextureCamera` プロパティへ1で生成したCamera Objectを設定します。
5. 同じく`blitCamera`プロパティへRenderTexure Cameraでレンダリングした内容を描画したいCameraを設定します。
6. `blitCamera`プロパティへ設定したCamera Componentの`cullingMask`から2で設定したレイヤーを除外して下さい。
7. `shift`プロパティや`filterMode`プロパティで解像度やフィルターモードを必要に応じて指定します。

### ヒント

既に3Dオブジェクトと2DオブジェクトでCameraが分かれているプロジェクトで3Dのレンダリング解像度を下げたい場合、3Dオブジェクト用のCameraにRenderTextureCamera ComponentをADDし、`renderTextureCamera`プロパティへ3Dオブジェクトのレンダリング用Camera、`blitCamera`プロパティへ2Dオブジェクトレンダリング用のCameraを設定します。

## プロパティ

### renderTextureCamera

レンダリング解像度を下げたいカメラを指定します。
3Dをレンダリングするカメラを想定しています。

### mainCamera
### blitCamera

renderTextureCameraの上にレンダリングを行うカメラを指定します
renderTextureCameraの上にそのままのレンダリング解像度で描画したいカメラを指定します
UIなど2Dをレンダリングするカメラを想定しています。

### cameraEvent

renderTextureCameraでレンダリングした内容をmainCameraへBlitするタイミングを指定します
renderTextureCameraでレンダリングした内容をmasterCameraへBlitするタイミングを指定します
基本的に`Before Forward Opaque`から変更する必要はありません。

### shift

RenderTextureのサイズを指定する為に使用します。
0の場合、ScreenSizeのままとなります。

```
```:
RenderTextureのサイズ = Screenサイズ >> shift
```

Expand All @@ -53,16 +64,15 @@ RenderTextureのフィルターモードを指定します。

※下記のサンプル表示は全てレンダリング解像度は`shift=5`に設定しています、

#### Point
##### Point

![image](https://user-images.githubusercontent.com/29646672/138979993-a1b9bdd8-4938-4e4a-be5a-2ebf59213b06.png)

#### Bilinear
##### Bilinear

![image](https://user-images.githubusercontent.com/29646672/138980101-763dea0f-309f-4738-be30-8d6aceb29c1c.png)


#### Trilinear
##### Trilinear

![image](https://user-images.githubusercontent.com/29646672/138980170-97e67d4b-99cd-4e6b-9f85-599df7f7161e.png)

Expand Down
121 changes: 66 additions & 55 deletions Runtime/Scripts/RenderTextureCamera.cs
Original file line number Diff line number Diff line change
@@ -1,47 +1,58 @@
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEngine;
using UnityEngine.Rendering;

namespace UTJ.RenderTextureCamera
{
// レンダリング先にRenderTextureを使用し解像度を下げる
// 使い方
// renderTexture:レンダリング解像度を下げたいCameraを設定
// m_RenderTextureCamera:レンダリング解像度を下げたいCameraを設定
// mainCamera : RenderTextureCameraの上にレンダリングを行うCameraを設定
// shift : スクリーン解像度に対してshift分右へシフトさせRenderTextureのサイズを決定する


public class RenderTextureCamera : MonoBehaviour
{
[Tooltip("レンダリング先をRenderTextureとするCameraを指定する")]
[Tooltip("レンダリング解像度を下げたいCamera(レンダリング先をRenderTextureとするCamera)")]
// 自身のCamera
[SerializeField] Camera renderTextureCamera;
[SerializeField] Camera m_RenderTextureCamera;

[Tooltip("Render TextureのベースにするCamera(2D Camera,Main Camera... etc.")]
[Tooltip("RenderTextureを描画(Blit)するCamera(2D Camera,Main Camera... etc.")]
// mainCamera
[SerializeField] Camera mainCamera;
[Tooltip("RenderTextureをmainCameraへBlitするタイミング。※BeforeForwardOpaqueから変更する必要は無い")]
[SerializeField] CameraEvent mCameraEvent = CameraEvent.BeforeForwardOpaque;
[SerializeField] Camera m_BlitCamera;

[Tooltip("RenderTextureをBlitCameraへBlitするタイミング。※基本的にはBeforeForwardOpaqueから変更する必要はありません")]
[SerializeField] CameraEvent m_CameraEvent = CameraEvent.BeforeForwardOpaque;

// RenderTextureのフィルターモード
internal FilterMode mFilterMode = FilterMode.Point;
[SerializeField][HideInInspector] FilterMode m_FilterMode = FilterMode.Point;

// オリジナルの解像度に対して何ビットシフトさせるか
internal int mShift = 0;
[SerializeField][HideInInspector] int m_Shift;

// mShiftに変更があったかどうか
internal bool mIsDirty = false;
internal bool m_IsDirty = false;

public Camera renderTextureCamera
{
get { return m_RenderTextureCamera; }
}

public Camera blitCamera
{
get { return m_BlitCamera; }
}


public FilterMode filterMode
{
get { return mFilterMode; }
set
{
mFilterMode = value;
mIsDirty = true;
get { return m_FilterMode; }
set
{
m_FilterMode = value;
m_IsDirty = true;
}
}

Expand All @@ -50,97 +61,97 @@ public int shift
{
get
{
return mShift;
return m_Shift;
}

set
{
mShift = value;
mIsDirty = true;
m_Shift = value;
m_IsDirty = true;
}
}


// レンダリングターゲットとして使用するRenderTexture
RenderTexture renderTexture;
RenderTexture m_RenderTexture;

// RenderTextureの内容をmainCameraへBlitする為のコマンドバッファ
CommandBuffer commandBuffer;
CommandBuffer m_CommandBuffer;


// Start is called before the first frame update
void Start()
{
if(renderTextureCamera == null)
if (m_RenderTextureCamera == null)
{
renderTextureCamera = GetComponent<Camera>();
m_RenderTextureCamera = GetComponent<Camera>();
}

if (renderTextureCamera)
if (m_RenderTextureCamera)
{
CreateRenderTexture();
renderTextureCamera.targetTexture = renderTexture;
m_RenderTextureCamera.targetTexture = m_RenderTexture;
}

if (mainCamera)
if (m_BlitCamera)
{
commandBuffer = new CommandBuffer();
commandBuffer.name = "RenderTexture Blit to MainCamera";
commandBuffer.Blit((RenderTargetIdentifier)renderTexture, BuiltinRenderTextureType.CameraTarget);
mainCamera.AddCommandBuffer(mCameraEvent, commandBuffer);
mainCamera.cullingMask &= ~renderTextureCamera.cullingMask;
m_CommandBuffer = new CommandBuffer();
m_CommandBuffer.name = "Blit RenderTexture";
m_CommandBuffer.Blit((RenderTargetIdentifier)m_RenderTexture, BuiltinRenderTextureType.CameraTarget);
m_BlitCamera.AddCommandBuffer(m_CameraEvent, m_CommandBuffer);
m_BlitCamera.cullingMask &= ~m_RenderTextureCamera.cullingMask;
}
}


private void Update()
{
if (mIsDirty)
{
if (m_IsDirty)
{
CreateRenderTexture();
renderTextureCamera.targetTexture = renderTexture;
commandBuffer.Clear();
commandBuffer.Blit((RenderTargetIdentifier)renderTexture, BuiltinRenderTextureType.CameraTarget);
mIsDirty = false;
m_RenderTextureCamera.targetTexture = m_RenderTexture;
m_CommandBuffer.Clear();
m_CommandBuffer.Blit((RenderTargetIdentifier)m_RenderTexture, BuiltinRenderTextureType.CameraTarget);
m_IsDirty = false;
}

if (mainCamera != null && renderTextureCamera != null)
if (m_BlitCamera != null && m_RenderTextureCamera != null)
{
// MainCameraからRenderTextureCameraのターゲットを除く
mainCamera.cullingMask &= ~renderTextureCamera.cullingMask;
m_BlitCamera.cullingMask &= ~m_RenderTextureCamera.cullingMask;
}
}


private void CreateRenderTexture()
{
if (renderTexture != null)
if (m_RenderTexture != null)
{
renderTexture.Release();
renderTexture = null;
m_RenderTexture.Release();
m_RenderTexture = null;
}

renderTexture = new RenderTexture(Screen.currentResolution.width >> shift, Screen.currentResolution.height >> shift, 24);
renderTexture.useMipMap = false;
renderTexture.filterMode = mFilterMode;
renderTexture.useDynamicScale = renderTextureCamera.allowDynamicResolution;
renderTexture.Create();
m_RenderTexture = new RenderTexture(Screen.currentResolution.width >> shift, Screen.currentResolution.height >> shift, 24);
m_RenderTexture.useMipMap = false;
m_RenderTexture.filterMode = m_FilterMode;
m_RenderTexture.useDynamicScale = m_RenderTextureCamera.allowDynamicResolution;
m_RenderTexture.Create();
}


private void OnDestroy()
{
if (renderTexture)
if (m_RenderTexture)
{
renderTexture.Release();
renderTexture = null;
m_RenderTexture.Release();
m_RenderTexture = null;
}
if (mainCamera)
if (m_BlitCamera)
{
mainCamera.RemoveCommandBuffer(mCameraEvent, commandBuffer);
if (commandBuffer != null)
m_BlitCamera.RemoveCommandBuffer(m_CameraEvent, m_CommandBuffer);
if (m_CommandBuffer != null)
{
commandBuffer.Clear();
m_CommandBuffer.Clear();
}
}
}
Expand Down
32 changes: 27 additions & 5 deletions Runtime/Scripts/RenderTextureCameraEditor.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,51 @@
#if UNITY_EDITOR
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEditor;

using System.IO;
using System.Globalization;

namespace UTJ.RenderTextureCamera
{
[CustomEditor(typeof(RenderTextureCamera))]
public class RenderTextureCameraEditor : Editor
{
static class Styles
{

}

public override void OnInspectorGUI()
{
base.OnInspectorGUI();

var renderTextureCamera = target as RenderTextureCamera;

if(renderTextureCamera.renderTextureCamera == null)
{
EditorGUILayout.HelpBox("RenderTextureCameraが設定されていません。",MessageType.Error);
}
if(renderTextureCamera.blitCamera == null)
{
EditorGUILayout.HelpBox("BlitCameraが設定されていません。", MessageType.Error);
}
if(renderTextureCamera.renderTextureCamera != null && renderTextureCamera.blitCamera != null)
{
if((renderTextureCamera.renderTextureCamera.cullingMask & renderTextureCamera.blitCamera.cullingMask) != 0)
{
EditorGUILayout.HelpBox($"{renderTextureCamera.blitCamera.name}{renderTextureCamera.renderTextureCamera}のcullingMaskに一致するレイヤーが含まれています。レンダリング対象が重複しないようにcullingMaskの設定を見直して下さい。", MessageType.Error);
}
}

EditorGUI.BeginChangeCheck();
renderTextureCamera.mShift = EditorGUILayout.IntSlider("Shit",renderTextureCamera.shift, 0, 6);
renderTextureCamera.mFilterMode = (FilterMode)EditorGUILayout.EnumPopup("FilterMode",renderTextureCamera.mFilterMode);
renderTextureCamera.shift = EditorGUILayout.IntSlider("Shit", renderTextureCamera.shift, 0, 6);
renderTextureCamera.filterMode = (FilterMode)EditorGUILayout.EnumPopup("FilterMode", renderTextureCamera.filterMode);

if (EditorGUI.EndChangeCheck())
{
renderTextureCamera.mIsDirty = true;
renderTextureCamera.m_IsDirty = true;
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "com.utj.rendertexturecamera",
"displayName": "RenderTextureCamera",
"version": "0.1.0",
"unity": "201.1",
"version": "0.1.1",
"unity": "2017.1",
"keywords": [
"unity",
"camera",
Expand Down

0 comments on commit 09d7ebf

Please sign in to comment.