From d629d88285ddd462d9fbf564d51c63c9145a895a Mon Sep 17 00:00:00 2001 From: katsumasa Date: Wed, 28 Sep 2022 08:38:38 +0900 Subject: [PATCH 1/3] =?UTF-8?q?shift=E3=81=A8filterMode=E3=81=8C=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E6=99=82=E3=81=AB=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9F=E4=B8=8D=E5=85=B7?= =?UTF-8?q?=E5=90=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++-- CODE_OF_CONDUCT.md.meta | 7 +++++++ Runtime/Scripts/RenderTextureCamera.cs | 19 ++++++++++--------- Runtime/Scripts/RenderTextureCameraEditor.cs | 7 ++++--- 4 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 CODE_OF_CONDUCT.md.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index 21d25cf..4b05595 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ # Changelog -## [0.1.0] - 2021-10-27 +## [0.1.1] - 2022-09-28 + +- [FIXED] shiftとfilterModeが実行時にリセットされていた不具合を修正 -### Changes +## [0.1.0] - 2021-10-27 - 1st Release diff --git a/CODE_OF_CONDUCT.md.meta b/CODE_OF_CONDUCT.md.meta new file mode 100644 index 0000000..61c221b --- /dev/null +++ b/CODE_OF_CONDUCT.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9805f62919b110d4ebc4aeb2bb1c27b4 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Scripts/RenderTextureCamera.cs b/Runtime/Scripts/RenderTextureCamera.cs index 238e341..846584a 100644 --- a/Runtime/Scripts/RenderTextureCamera.cs +++ b/Runtime/Scripts/RenderTextureCamera.cs @@ -1,5 +1,7 @@ using System.Collections; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using UnityEngine; using UnityEngine.Rendering; @@ -21,25 +23,24 @@ public class RenderTextureCamera : MonoBehaviour [Tooltip("Render TextureのベースにするCamera(2D Camera,Main Camera... etc.")] // mainCamera [SerializeField] Camera mainCamera; - + [Tooltip("RenderTextureをmainCameraへBlitするタイミング。※BeforeForwardOpaqueから変更する必要は無い")] [SerializeField] CameraEvent mCameraEvent = CameraEvent.BeforeForwardOpaque; // RenderTextureのフィルターモード - internal FilterMode mFilterMode = FilterMode.Point; + [SerializeField][HideInInspector] FilterMode mFilterMode = FilterMode.Point; // オリジナルの解像度に対して何ビットシフトさせるか - internal int mShift = 0; + [SerializeField][HideInInspector] int mShift; // mShiftに変更があったかどうか internal bool mIsDirty = false; - public FilterMode filterMode { get { return mFilterMode; } - set - { + set + { mFilterMode = value; mIsDirty = true; } @@ -71,7 +72,7 @@ public int shift // Start is called before the first frame update void Start() { - if(renderTextureCamera == null) + if (renderTextureCamera == null) { renderTextureCamera = GetComponent(); } @@ -94,7 +95,7 @@ void Start() private void Update() - { + { if (mIsDirty) { CreateRenderTexture(); @@ -124,7 +125,7 @@ private void CreateRenderTexture() renderTexture.useMipMap = false; renderTexture.filterMode = mFilterMode; renderTexture.useDynamicScale = renderTextureCamera.allowDynamicResolution; - renderTexture.Create(); + renderTexture.Create(); } diff --git a/Runtime/Scripts/RenderTextureCameraEditor.cs b/Runtime/Scripts/RenderTextureCameraEditor.cs index 6414cce..a48daaa 100644 --- a/Runtime/Scripts/RenderTextureCameraEditor.cs +++ b/Runtime/Scripts/RenderTextureCameraEditor.cs @@ -1,9 +1,10 @@ -#if UNITY_EDITOR +#if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEditor; +using System.IO; namespace UTJ.RenderTextureCamera @@ -18,8 +19,8 @@ public override void OnInspectorGUI() var renderTextureCamera = target as RenderTextureCamera; 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()) { From 60f8cb4367eb92e3eef7f896fefad938f693dec8 Mon Sep 17 00:00:00 2001 From: katsumasa Date: Wed, 28 Sep 2022 10:25:38 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=91=E3=83=86?= =?UTF-8?q?=E3=82=A3=E5=90=8D=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=97README?= =?UTF-8?q?=E3=82=92=E5=8A=A0=E7=AD=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + README.md | 26 +++-- Runtime/Scripts/RenderTextureCamera.cs | 110 ++++++++++--------- Runtime/Scripts/RenderTextureCameraEditor.cs | 25 ++++- package.json | 4 +- 5 files changed, 104 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b05595..539c0a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [0.1.1] - 2022-09-28 - [FIXED] shiftとfilterModeが実行時にリセットされていた不具合を修正 +- [Changed] プロパティ名を一部変更 ## [0.1.0] - 2021-10-27 diff --git a/README.md b/README.md index bfd419f..5032c8d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ UIなどの2Dのレンダリング解像度はそのままに、3Dのレンダリング解像度を下げることで、見た目のクオリティを維持したまま、処理負荷を軽減することが期待できます。 本コンポーネントは特定のカメラのレンダリング解像度を動的に変更する事が可能です。 - ## Dynamic Resolutionとの比較 Unity2018以降のバージョンでは[Dynamic Resolution](https://docs.unity3d.com/ja/2018.4/Manual/DynamicResolution.html)が実装されています。 @@ -21,14 +20,26 @@ 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の上にレンダリングを行うカメラを指定します。 UIなど2Dをレンダリングするカメラを想定しています。 @@ -43,7 +54,7 @@ renderTextureCameraでレンダリングした内容をmainCameraへBlitする RenderTextureのサイズを指定する為に使用します。 0の場合、ScreenSizeのままとなります。 -``` +```: RenderTextureのサイズ = Screenサイズ >> shift ``` @@ -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) diff --git a/Runtime/Scripts/RenderTextureCamera.cs b/Runtime/Scripts/RenderTextureCamera.cs index 846584a..af8feae 100644 --- a/Runtime/Scripts/RenderTextureCamera.cs +++ b/Runtime/Scripts/RenderTextureCamera.cs @@ -9,40 +9,50 @@ 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; + [SerializeField] Camera m_BlitCamera; - [Tooltip("RenderTextureをmainCameraへBlitするタイミング。※BeforeForwardOpaqueから変更する必要は無い")] - [SerializeField] CameraEvent mCameraEvent = CameraEvent.BeforeForwardOpaque; + [Tooltip("RenderTextureをBlitCameraへBlitするタイミング。※基本的にはBeforeForwardOpaqueから変更する必要はありません")] + [SerializeField] CameraEvent m_CameraEvent = CameraEvent.BeforeForwardOpaque; // RenderTextureのフィルターモード - [SerializeField][HideInInspector] FilterMode mFilterMode = FilterMode.Point; + [SerializeField][HideInInspector] FilterMode m_FilterMode = FilterMode.Point; // オリジナルの解像度に対して何ビットシフトさせるか - [SerializeField][HideInInspector] int mShift; + [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; } + get { return m_FilterMode; } set { - mFilterMode = value; - mIsDirty = true; + m_FilterMode = value; + m_IsDirty = true; } } @@ -51,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(); + m_RenderTextureCamera = GetComponent(); } - 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(); } } } diff --git a/Runtime/Scripts/RenderTextureCameraEditor.cs b/Runtime/Scripts/RenderTextureCameraEditor.cs index a48daaa..1f392a0 100644 --- a/Runtime/Scripts/RenderTextureCameraEditor.cs +++ b/Runtime/Scripts/RenderTextureCameraEditor.cs @@ -5,26 +5,47 @@ 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.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; } } } diff --git a/package.json b/package.json index 896cc1b..519df40 100644 --- a/package.json +++ b/package.json @@ -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", From c3aec031c94d35d4fc624760384d0f73a1ca8d65 Mon Sep 17 00:00:00 2001 From: katsumasa Date: Wed, 28 Sep 2022 11:12:53 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E8=AA=A4=E5=AD=97=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5032c8d..13b1ec2 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Dynamic Resolutionの使用サンプルは[こちら](https://github.com/katsuma ### ヒント -既に3Dオブジェクトと2DオブジェクトでCameraが別れているプロジェクトで3Dのレンダリング解像度を下げたい場合、3Dオブジェクト用のCameraにRenderTextureCamera ComponentをADDし、`renderTextureCamera`プロパティへ3Dオブジェクトのレンダリング用Camera、`blitCameraプロパティへ2Dオブジェクトレンダリング用のCameraを設定します。 +既に3Dオブジェクトと2DオブジェクトでCameraが分かれているプロジェクトで3Dのレンダリング解像度を下げたい場合、3Dオブジェクト用のCameraにRenderTextureCamera ComponentをADDし、`renderTextureCamera`プロパティへ3Dオブジェクトのレンダリング用Camera、`blitCamera`プロパティへ2Dオブジェクトレンダリング用のCameraを設定します。 ## プロパティ @@ -41,12 +41,12 @@ Dynamic Resolutionの使用サンプルは[こちら](https://github.com/katsuma ### blitCamera -renderTextureCameraの上にレンダリングを行うカメラを指定します。 +renderTextureCameraの上にそのままのレンダリング解像度で描画したいカメラを指定します。 UIなど2Dをレンダリングするカメラを想定しています。 ### cameraEvent -renderTextureCameraでレンダリングした内容をmainCameraへBlitするタイミングを指定します。 +renderTextureCameraでレンダリングした内容をmasterCameraへBlitするタイミングを指定します。 基本的に`Before Forward Opaque`から変更する必要はありません。 ### shift