├── .gitattributes ├── .gitignore ├── Assets ├── CustomSampler.shader ├── CustomSampler.shader.meta ├── DepthTex2PosWS.shader ├── DepthTex2PosWS.shader.meta ├── GeomTest.shader ├── GeomTest.shader.meta ├── GrabTest.shader ├── GrabTest.shader.meta ├── SHLightTester.shader ├── SHLightTester.shader.meta ├── SPSITest.shader ├── SPSITest.shader.meta ├── ScriptTemplates.meta ├── ScriptTemplates │ ├── 84-Shader__VR Unlit Shader-NewUnlitShader.shader.txt │ └── 84-Shader__VR Unlit Shader-NewUnlitShader.shader.txt.meta ├── StencilChecker.shader └── StencilChecker.shader.meta ├── Docs ├── HDRP Litの変遷.md ├── SRPでのマルチパスシェーダー.md ├── Universal Render Pipeline Litの変遷.md ├── ステンシルについて.md ├── ビルトインシェーダーの変遷.md └── 個別に書くほどでもない知見.md └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | [Ll]ibrary/ 2 | [Tt]emp/ 3 | [Oo]bj/ 4 | [Bb]uild/ 5 | [Bb]uilds/ 6 | Assets/AssetStoreTools* 7 | 8 | # Visual Studio cache directory 9 | .vs/ 10 | 11 | # Autogenerated VS/MD/Consulo solution and project files 12 | ExportedObj/ 13 | .consulo/ 14 | *.csproj 15 | *.unityproj 16 | *.sln 17 | *.suo 18 | *.tmp 19 | *.user 20 | *.userprefs 21 | *.pidb 22 | *.booproj 23 | *.svd 24 | *.pdb 25 | *.opendb 26 | *.VC.db 27 | 28 | # Unity3D generated meta files 29 | *.pidb.meta 30 | *.pdb.meta 31 | 32 | # Unity3D Generated File On Crash Reports 33 | sysinfo.txt 34 | 35 | # Builds 36 | *.apk 37 | *.unitypackage 38 | -------------------------------------------------------------------------------- /Assets/CustomSampler.shader: -------------------------------------------------------------------------------- 1 | Shader "Unlit/CustomSampler" 2 | { 3 | Properties 4 | { 5 | _MainTex ("Texture", 2D) = "white" {} 6 | [ToggleUI] _IsCustom ("Use Custom Function", Int) = 1 7 | [Enum(Point,0, Bilinear,20, Trilinear,21)] _Filter ("Filter", Int) = 0 8 | [Enum(Wrap,1, Mirror,2, Clamp,3, Border,4, MirrorOnce,5)] _AddressU ("AddressU", Int) = 1 9 | [Enum(Wrap,1, Mirror,2, Clamp,3, Border,4, MirrorOnce,5)] _AddressV ("AddressV", Int) = 1 10 | //[Enum(Wrap,1, Mirror,2, Clamp,3, Border,4, MirrorOnce,5)] _AddressW ("[not yet] AddressW", Int) = 1 11 | _MipLODBias ("MipLODBias", Float) = 0 12 | //[IntRange] _MaxAnisotropy ("[not yet] MaxAnisotropy", Range(0,16)) = 1 13 | //_ComparisonFunc ("[not yet] ComparisonFunc", Int) = 1 14 | _BorderColor ("Border Color", Color) = (0,0,0,0) 15 | //_MinLOD ("[not yet] MipLODBias", Float) = 0 16 | //_MaxLOD ("[not yet] MipLODBias", Float) = 0 17 | } 18 | SubShader 19 | { 20 | Pass 21 | { 22 | CGPROGRAM 23 | #pragma vertex vert 24 | #pragma fragment frag 25 | 26 | #include "UnityCG.cginc" 27 | 28 | Texture2D _MainTex; 29 | SamplerState sampler_MainTex; 30 | float4 _MainTex_ST; 31 | bool _IsCustom; 32 | 33 | uint _Filter; 34 | uint _AddressU; 35 | uint _AddressV; 36 | uint _AddressW; 37 | float _MipLODBias; 38 | uint _MaxAnisotropy; 39 | uint _ComparisonFunc; 40 | float4 _BorderColor; 41 | float _MinLOD; 42 | float _MaxLOD; 43 | 44 | // enum はプリプロセッサで代用 45 | 46 | // [未使用] 補間の種類 47 | // minification、magnification、mip-levelでそれぞれ線形補間するか否かを決められるがUnityでは4つにまとめられている 48 | // 以下は推測で実際に確認したわけではないため注意 49 | // Point: D3D11_FILTER_MIN_MAG_MIP_POINT 50 | // Bilinear: D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT 51 | // Trilinear: D3D11_FILTER_MIN_MAG_MIP_LINEAR 52 | // Aniso Level > 0: D3D11_FILTER_ANISOTROPIC 53 | // https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_filter 54 | //typedef enum D3D11_FILTER { 55 | #define D3D11_FILTER_MIN_MAG_MIP_POINT 0 56 | #define D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR 0x1 57 | #define D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT 0x4 58 | #define D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR 0x5 59 | #define D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT 0x10 60 | #define D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR 0x11 61 | #define D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT 0x14 62 | #define D3D11_FILTER_MIN_MAG_MIP_LINEAR 0x15 63 | #define D3D11_FILTER_ANISOTROPIC 0x55 64 | #define D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT 0x80 65 | #define D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR 0x81 66 | #define D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT 0x84 67 | #define D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR 0x85 68 | #define D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT 0x90 69 | #define D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR 0x91 70 | #define D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT 0x94 71 | #define D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR 0x95 72 | #define D3D11_FILTER_COMPARISON_ANISOTROPIC 0xd5 73 | #define D3D11_FILTER_MINIMUM_MIN_MAG_MIP_POINT 0x100 74 | #define D3D11_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR 0x101 75 | #define D3D11_FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT 0x104 76 | #define D3D11_FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR 0x105 77 | #define D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT 0x110 78 | #define D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR 0x111 79 | #define D3D11_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT 0x114 80 | #define D3D11_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR 0x115 81 | #define D3D11_FILTER_MINIMUM_ANISOTROPIC 0x155 82 | #define D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_POINT 0x180 83 | #define D3D11_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR 0x181 84 | #define D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT 0x184 85 | #define D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR 0x185 86 | #define D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT 0x190 87 | #define D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR 0x191 88 | #define D3D11_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT 0x194 89 | #define D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR 0x195 90 | #define D3D11_FILTER_MAXIMUM_ANISOTROPIC 0x1d5 91 | //}; 92 | 93 | // ビット演算用メモ 94 | // Mip 000000001 1 95 | // Mag 000000100 4 96 | // Min 000010000 16 97 | // Ani 001010101 85 98 | // Com 010000000 128 99 | // Min 100000000 256 100 | // Max 110000000 384 101 | 102 | // タイリングの種類 103 | // https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_texture_address_mode 104 | //typedef enum D3D11_TEXTURE_ADDRESS_MODE { 105 | #define D3D11_TEXTURE_ADDRESS_WRAP 1 106 | #define D3D11_TEXTURE_ADDRESS_MIRROR 2 107 | #define D3D11_TEXTURE_ADDRESS_CLAMP 3 108 | #define D3D11_TEXTURE_ADDRESS_BORDER 4 109 | #define D3D11_TEXTURE_ADDRESS_MIRROR_ONCE 5 110 | //}; 111 | 112 | // [未使用] 比較の種類 113 | // ComparisonFuncの型 114 | // https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_comparison_func 115 | //typedef enum D3D11_COMPARISON_FUNC { 116 | #define D3D11_COMPARISON_NEVER 1 117 | #define D3D11_COMPARISON_LESS 2 118 | #define D3D11_COMPARISON_EQUAL 3 119 | #define D3D11_COMPARISON_LESS_EQUAL 4 120 | #define D3D11_COMPARISON_GREATER 5 121 | #define D3D11_COMPARISON_NOT_EQUAL 6 122 | #define D3D11_COMPARISON_GREATER_EQUAL 7 123 | #define D3D11_COMPARISON_ALWAYS 8 124 | //} ; 125 | 126 | // SamplerStateの代替 127 | // https://learn.microsoft.com/ja-jp/windows/win32/api/d3d11/ns-d3d11-d3d11_sampler_desc 128 | struct SamplerDesc 129 | { 130 | uint Filter; 131 | uint AddressU; 132 | uint AddressV; 133 | uint AddressW; 134 | float MipLODBias; 135 | uint MaxAnisotropy; 136 | uint ComparisonFunc; 137 | float4 BorderColor; 138 | float MinLOD; 139 | float MaxLOD; 140 | }; 141 | 142 | // MipLevelの計算 143 | // GPUの設定依存で完全には一致しない 144 | // OpenGL 4.2 (Core Profile) - 3.9.11 Texture Minification 145 | // https://registry.khronos.org/OpenGL/specs/gl/glspec42.core.pdf 146 | float CalculateMipLevel(float2 uv, float2 size, uint levels, float bias = 0) 147 | { 148 | float2 dx = ddx(uv * size); 149 | float2 dy = ddy(uv * size); 150 | float dmax = max(dot(dx,dx), dot(dy,dy)); 151 | float mip = log2(dmax) * 0.5 + 0.5 + bias; 152 | return clamp(mip, 0, levels - 0.5); 153 | } 154 | 155 | // AddressModeを適用したUVに変換 156 | float ApplyAddressMode(float uv, uint address, float maxcoord) 157 | { 158 | UNITY_FLATTEN 159 | switch(address) 160 | { 161 | case D3D11_TEXTURE_ADDRESS_WRAP : return clamp(frac(uv), 0, maxcoord); 162 | case D3D11_TEXTURE_ADDRESS_MIRROR : return clamp(abs(frac(uv * 0.5 + 0.5) * 2 - 1), 0, maxcoord); 163 | case D3D11_TEXTURE_ADDRESS_CLAMP : return clamp(uv, 0, maxcoord); 164 | //case D3D11_TEXTURE_ADDRESS_BORDER : return uv; 165 | case D3D11_TEXTURE_ADDRESS_MIRROR_ONCE : return clamp(abs(uv), 0, maxcoord); 166 | default : return uv; 167 | } 168 | } 169 | 170 | float2 ApplyAddressMode(SamplerDesc desc, float2 uv, float2 maxcoord) 171 | { 172 | uv.x = ApplyAddressMode(uv.x, desc.AddressU, maxcoord.x); 173 | uv.y = ApplyAddressMode(uv.y, desc.AddressV, maxcoord.y); 174 | return uv; 175 | } 176 | 177 | // 各FilterModeで使用するテクスチャのロード用の関数 178 | // UVが範囲外にならないようにAddressModeをここで適用する 179 | float4 SampleBase(Texture2D tex, SamplerDesc desc, float2 uv, uint mipI, float2 mipsize, float2 maxcoord) 180 | { 181 | float2 sampleUV = ApplyAddressMode(desc, uv, maxcoord); 182 | return 183 | sampleUV.x < 0 | sampleUV.y < 0 | sampleUV.x > maxcoord.x | sampleUV.y > maxcoord.y ? 184 | desc.BorderColor : 185 | tex.mips[mipI][(uint2)(sampleUV * mipsize)]; 186 | } 187 | 188 | // 最も近い1つのテクセルをサンプリング 189 | float4 SamplePoint(Texture2D tex, SamplerDesc desc, float2 uv, float mip, float2 size) 190 | { 191 | uint mipI = mip; 192 | float2 mipsize = size / pow(2,mipI); 193 | float2 texel = rcp(mipsize); 194 | float2 maxcoord = 1-texel; 195 | return SampleBase(tex, desc, uv, mipI, mipsize, maxcoord); 196 | } 197 | 198 | // 隣接する4つのテクセルをサンプリングして線形補間 199 | float4 SampleBilinear(Texture2D tex, SamplerDesc desc, float2 uv, float mip, float2 size) 200 | { 201 | uint mipI = mip; 202 | float2 mipsize = size / pow(2,mipI); 203 | float2 texel = rcp(mipsize); 204 | float2 maxcoord = 1-texel; 205 | float2 bary = frac(uv * mipsize - 0.5); 206 | float4 c00 = SampleBase(tex, desc, uv + texel * float2(-0.5,-0.5), mipI, mipsize, maxcoord); 207 | float4 c10 = SampleBase(tex, desc, uv + texel * float2( 0.5,-0.5), mipI, mipsize, maxcoord); 208 | float4 c01 = SampleBase(tex, desc, uv + texel * float2(-0.5, 0.5), mipI, mipsize, maxcoord); 209 | float4 c11 = SampleBase(tex, desc, uv + texel * float2( 0.5, 0.5), mipI, mipsize, maxcoord); 210 | return lerp( 211 | lerp(c00, c10, bary.x), 212 | lerp(c01, c11, bary.x), 213 | bary.y 214 | ); 215 | } 216 | 217 | // 2つのMipLevelでBilinearサンプリングして線形補間 218 | float4 SampleTrilinear(Texture2D tex, SamplerDesc desc, float2 uv, float mip, float2 size) 219 | { 220 | float bary = frac(mip - 0.5); 221 | float4 c0 = SampleBilinear(tex, desc, uv, mip - 0.5, size); 222 | float4 c1 = SampleBilinear(tex, desc, uv, mip + 0.5, size); 223 | return lerp(c0, c1, bary); 224 | } 225 | 226 | // tex.Sample(sampler,uv) の代替 227 | float4 CustomSample(Texture2D tex, SamplerDesc desc, float2 uv) 228 | { 229 | float2 size; 230 | uint NumberOfLevels; 231 | tex.GetDimensions( 232 | 0, 233 | size.x, 234 | size.y, 235 | NumberOfLevels 236 | ); 237 | 238 | float mip = CalculateMipLevel(uv, size, NumberOfLevels, desc.MipLODBias); 239 | 240 | UNITY_BRANCH 241 | switch(desc.Filter) 242 | { 243 | //case D3D11_FILTER_MIN_MAG_MIP_POINT : return SamplePoint(tex, desc, uv, mip, size); 244 | case D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT : return SampleBilinear(tex, desc, uv, mip, size); 245 | case D3D11_FILTER_MIN_MAG_MIP_LINEAR : return SampleTrilinear(tex, desc, uv, mip, size); 246 | default : return SamplePoint(tex, desc, uv, mip, size); 247 | } 248 | } 249 | 250 | // ここから下は普通のUnlitシェーダー 251 | struct appdata 252 | { 253 | float4 vertex : POSITION; 254 | float2 uv : TEXCOORD0; 255 | }; 256 | 257 | struct v2f 258 | { 259 | float2 uv : TEXCOORD0; 260 | float4 vertex : SV_POSITION; 261 | }; 262 | 263 | v2f vert(appdata v) 264 | { 265 | v2f o; 266 | o.vertex = UnityObjectToClipPos(v.vertex); 267 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 268 | return o; 269 | } 270 | 271 | float4 frag(v2f i) : SV_Target 272 | { 273 | if(!_IsCustom) return _MainTex.SampleBias(sampler_MainTex, i.uv, _MipLODBias); 274 | 275 | SamplerDesc desc = (SamplerDesc)0; 276 | desc.Filter = _Filter; 277 | desc.AddressU = _AddressU; 278 | desc.AddressV = _AddressV; 279 | desc.AddressW = _AddressW; 280 | desc.MipLODBias = _MipLODBias; 281 | desc.MaxAnisotropy = _MaxAnisotropy; 282 | desc.ComparisonFunc = _ComparisonFunc; 283 | desc.BorderColor = _BorderColor; 284 | desc.MinLOD = _MinLOD; 285 | desc.MaxLOD = _MaxLOD; 286 | return CustomSample(_MainTex, desc, i.uv); 287 | } 288 | ENDCG 289 | } 290 | } 291 | } 292 | -------------------------------------------------------------------------------- /Assets/CustomSampler.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4f7e0f7a04def8b42b5c2f49962d8712 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/DepthTex2PosWS.shader: -------------------------------------------------------------------------------- 1 | Shader "DepthTex2PosWS" 2 | { 3 | SubShader 4 | { 5 | Tags { "RenderType"="Opaque" "Queue"="Overlay" } 6 | 7 | Pass 8 | { 9 | Cull Off 10 | ZTest Always 11 | ZWrite Off 12 | CGPROGRAM 13 | #pragma exclude_renderers gles 14 | #pragma vertex vert 15 | #pragma fragment frag 16 | #include "UnityCG.cginc" 17 | 18 | UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); 19 | 20 | struct appdata 21 | { 22 | uint vertexID : SV_VertexID; 23 | UNITY_VERTEX_INPUT_INSTANCE_ID 24 | }; 25 | 26 | struct v2f 27 | { 28 | float4 positionCS : SV_POSITION; 29 | UNITY_VERTEX_OUTPUT_STEREO 30 | }; 31 | 32 | float4 OptimizedMul(float4x4 mat, float3 vec) 33 | { 34 | //return mul(mat, float4(vec, 1)); 35 | return mat._m00_m10_m20_m30 * vec.x + (mat._m01_m11_m21_m31 * vec.y + (mat._m02_m12_m22_m32 * vec.z + mat._m03_m13_m23_m33)); 36 | } 37 | 38 | v2f vert(appdata i) 39 | { 40 | v2f o; 41 | UNITY_SETUP_INSTANCE_ID(i); 42 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); 43 | o.positionCS = float4(i.vertexID / 2 ? 1 : -1, i.vertexID % 2 ? 1 : -1, 1, 1); 44 | return o; 45 | } 46 | 47 | float4 frag(v2f i) : SV_Target 48 | { 49 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 50 | 51 | float2 scnUV = i.positionCS.xy / _ScreenParams.xy; 52 | #if defined(UNITY_SINGLE_PASS_STEREO) 53 | scnUV.x *= 0.5; 54 | #endif 55 | float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, scnUV)); 56 | 57 | float4 positionCS = float4( 58 | (scnUV * 2.0 - 1.0) * depth, 59 | 1, 60 | depth 61 | ); 62 | #if UNITY_UV_STARTS_AT_TOP 63 | positionCS.y = -positionCS.y; 64 | #endif 65 | float3 positionVS = positionCS.xyw / UNITY_MATRIX_P._m00_m11_m32; 66 | float3 positionWS = OptimizedMul(UNITY_MATRIX_I_V, positionVS).xyz; 67 | 68 | return float4(saturate(1 - abs(frac(positionWS) - 0.5) * 8), 1); 69 | } 70 | ENDCG 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Assets/DepthTex2PosWS.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8a3e8c264e0ba194aaff13ead948153b 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/GeomTest.shader: -------------------------------------------------------------------------------- 1 | Shader "GeomTest" 2 | { 3 | Properties 4 | { 5 | _Color ("Color", Color) = (1,1,1,1) 6 | _MainTex ("Texture", 2D) = "white" {} 7 | _Cull ("Cull", Int) = 2 8 | [Space] 9 | _OutlineColor ("Outline Color", Color) = (1,1,1,1) 10 | _OutlineTex ("Texture", 2D) = "white" {} 11 | _OLCull ("Cull", Int) = 1 12 | } 13 | 14 | // 1 pass outline (geometry shader) 15 | /*SubShader 16 | { 17 | Tags { "RenderType"="Opaque" } 18 | 19 | Pass 20 | { 21 | Tags {"LightMode" = "ForwardBase"} 22 | CGPROGRAM 23 | #pragma target 5.0 24 | #pragma vertex vert 25 | #pragma geometry geom 26 | #pragma fragment frag 27 | 28 | #include "UnityCG.cginc" 29 | 30 | struct appdata 31 | { 32 | float4 vertex : POSITION; 33 | float2 uv : TEXCOORD0; 34 | float3 normal : NORMAL; 35 | }; 36 | 37 | struct v2f 38 | { 39 | float2 uv : TEXCOORD0; 40 | float3 normal : TEXCOORD1; 41 | bool isOutline : TEXCOORD2; 42 | float4 vertex : SV_POSITION; 43 | }; 44 | 45 | sampler2D _MainTex; 46 | sampler2D _OutlineTex; 47 | float4 _MainTex_ST; 48 | float4 _OutlineTex_ST; 49 | float4 _Color; 50 | float4 _OutlineColor; 51 | uint _Cull; 52 | uint _OLCull; 53 | 54 | v2f vert (appdata v) 55 | { 56 | v2f o; 57 | o.vertex = UnityObjectToClipPos(v.vertex); 58 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 59 | o.normal = UnityObjectToClipPos(float4(v.normal, 0)).xyz; 60 | o.isOutline = false; 61 | return o; 62 | } 63 | 64 | [maxvertexcount(12)] 65 | void geom(triangle v2f i[3], inout TriangleStream outStream) 66 | { 67 | v2f o[3]; 68 | o[0] = i[0]; 69 | o[1] = i[1]; 70 | o[2] = i[2]; 71 | 72 | if(_Cull != 1) 73 | { 74 | outStream.Append(o[0]); 75 | outStream.Append(o[1]); 76 | outStream.Append(o[2]); 77 | outStream.RestartStrip(); 78 | } 79 | 80 | if(_Cull != 2) 81 | { 82 | outStream.Append(o[2]); 83 | outStream.Append(o[1]); 84 | outStream.Append(o[0]); 85 | outStream.RestartStrip(); 86 | } 87 | 88 | o[0].isOutline = true; 89 | o[1].isOutline = true; 90 | o[2].isOutline = true; 91 | o[0].vertex.xy += o[0].normal.xy * 0.01; 92 | o[1].vertex.xy += o[1].normal.xy * 0.01; 93 | o[2].vertex.xy += o[2].normal.xy * 0.01; 94 | if(_OLCull != 1) 95 | { 96 | outStream.Append(o[0]); 97 | outStream.Append(o[1]); 98 | outStream.Append(o[2]); 99 | outStream.RestartStrip(); 100 | } 101 | 102 | if(_OLCull != 2) 103 | { 104 | outStream.Append(o[2]); 105 | outStream.Append(o[1]); 106 | outStream.Append(o[0]); 107 | outStream.RestartStrip(); 108 | } 109 | } 110 | 111 | //[earlydepthstencil] 112 | float4 frag (v2f i) : SV_Target 113 | { 114 | float4 col; 115 | if(i.isOutline) 116 | { 117 | col = tex2D(_OutlineTex, i.uv) * _OutlineColor; 118 | } 119 | else 120 | { 121 | col = tex2D(_MainTex, i.uv) * _Color; 122 | } 123 | //col = i.isOutline ? tex2D(_OutlineTex, i.uv) : tex2D(_MainTex, i.uv); 124 | return col; 125 | } 126 | ENDCG 127 | } 128 | }*/ 129 | 130 | // 2-pass outline 131 | SubShader 132 | { 133 | Tags { "RenderType"="Opaque" } 134 | 135 | Pass 136 | { 137 | Tags {"LightMode" = "ForwardBase"} 138 | Cull [_Cull] 139 | CGPROGRAM 140 | #pragma target 5.0 141 | #pragma vertex vert 142 | #pragma fragment frag 143 | 144 | #include "UnityCG.cginc" 145 | 146 | struct appdata 147 | { 148 | float4 vertex : POSITION; 149 | float2 uv : TEXCOORD0; 150 | float3 normal : NORMAL; 151 | }; 152 | 153 | struct v2f 154 | { 155 | float2 uv : TEXCOORD0; 156 | float3 normal : TEXCOORD1; 157 | float4 vertex : SV_POSITION; 158 | }; 159 | 160 | sampler2D _MainTex; 161 | sampler2D _OutlineTex; 162 | float4 _MainTex_ST; 163 | float4 _OutlineTex_ST; 164 | float4 _Color; 165 | float4 _OutlineColor; 166 | 167 | v2f vert(appdata v) 168 | { 169 | v2f o; 170 | o.vertex = UnityObjectToClipPos(v.vertex); 171 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 172 | o.normal = UnityObjectToClipPos(float4(v.normal, 0)).xyz; 173 | return o; 174 | } 175 | 176 | float4 frag(v2f i) : SV_Target 177 | { 178 | float4 col = tex2D(_MainTex, i.uv) * _Color; 179 | return col; 180 | } 181 | ENDCG 182 | } 183 | 184 | Pass 185 | { 186 | Tags {"LightMode" = "ForwardBase"} 187 | Cull [_OLCull] 188 | CGPROGRAM 189 | #pragma target 5.0 190 | #pragma vertex vert 191 | #pragma fragment frag 192 | 193 | #include "UnityCG.cginc" 194 | 195 | struct appdata 196 | { 197 | float4 vertex : POSITION; 198 | float2 uv : TEXCOORD0; 199 | float3 normal : NORMAL; 200 | }; 201 | 202 | struct v2f 203 | { 204 | float2 uv : TEXCOORD0; 205 | float3 normal : TEXCOORD1; 206 | float4 vertex : SV_POSITION; 207 | }; 208 | 209 | sampler2D _MainTex; 210 | sampler2D _OutlineTex; 211 | float4 _MainTex_ST; 212 | float4 _OutlineTex_ST; 213 | float4 _Color; 214 | float4 _OutlineColor; 215 | 216 | v2f vert(appdata v) 217 | { 218 | v2f o; 219 | o.vertex = UnityObjectToClipPos(v.vertex); 220 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 221 | o.normal = UnityObjectToClipPos(float4(v.normal, 0)).xyz; 222 | o.vertex.xy += o.normal.xy * 0.01; 223 | return o; 224 | } 225 | 226 | float4 frag(v2f i) : SV_Target 227 | { 228 | float4 col = tex2D(_OutlineTex, i.uv) * _OutlineColor; 229 | return col; 230 | } 231 | ENDCG 232 | } 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /Assets/GeomTest.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f679164a6dd982498fc58b13500df86 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/GrabTest.shader: -------------------------------------------------------------------------------- 1 | Shader "GrabTest" 2 | { 3 | SubShader 4 | { 5 | Tags {"RenderType"="Transparent" "Queue"="Transparent"} 6 | 7 | // テクスチャ名を指定することで複数シェーダー間でGrabPassをまとめられる 8 | GrabPass {"_BackgroundTexture"} 9 | 10 | Pass 11 | { 12 | CGPROGRAM 13 | #pragma multi_compile_instancing 14 | #pragma vertex vert 15 | #pragma fragment frag 16 | #include "UnityCG.cginc" 17 | 18 | //---------------------------------------------------------------------------------------------------------------------- 19 | // テクスチャの型 20 | #if 1 21 | // UNITY_STEREO_INSTANCING_ENABLED または UNITY_STEREO_MULTIVIEW_ENABLED が宣言されているとテクスチャ配列化される 22 | #define DECLARE_GRABTEX(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex) 23 | #define SAMPLE_GRABTEX(tex,uv) UNITY_SAMPLE_SCREENSPACE_TEXTURE(tex,uv) 24 | #else 25 | // Single Pass Instancedで壊れるパターン 26 | // 左右の目別々の画像がテクスチャ配列として渡されるため、うまくサンプリングできなくなるように見える 27 | #define DECLARE_GRABTEX(tex) UNITY_DECLARE_TEX2D(tex) 28 | #define SAMPLE_GRABTEX(tex,uv) UNITY_SAMPLE_TEX2D(tex,uv) 29 | #endif 30 | 31 | //---------------------------------------------------------------------------------------------------------------------- 32 | // UVの計算 33 | #define GRAB_TEXTURE_TYPE 3 34 | 35 | #if GRAB_TEXTURE_TYPE == 0 36 | // _ProjectionParams.xの値の異常で壊れるパターン (https://feedback.vrchat.com/bug-reports/p/incorrect-rendering-issue-with-my-shader) 37 | // ComputeScreenPos()で計算 38 | // 上限反転するか否かを _ProjectionParams.x で決める 39 | // しかしこの値が不安定で、VRC Scene DescriptorのReference Cameraを適切に指定してやらないと上下逆の映像になってしまうことがある 40 | #define CALC_GRABUV(uv) float2 uv = i.ScreenPos.xy / i.ScreenPos.w 41 | 42 | #elif GRAB_TEXTURE_TYPE == 1 43 | // ComputeGrabScreenPos()で計算 44 | // 上限反転するか否かを UNITY_UV_STARTS_AT_TOP で決める 45 | #define CALC_GRABUV(uv) float2 uv = i.GrabScreenPos.xy / i.GrabScreenPos.w 46 | 47 | #elif GRAB_TEXTURE_TYPE == 2 48 | // Single Pass Stereo (VRChat)で壊れるパターン (https://docs.unity3d.com/ja/2019.4/Manual/SinglePassStereoRendering.html) 49 | // VPOSを元に計算 50 | // 左目・右目の映像が1枚にまとまっているため、そのままVPOSを使うのではなくx座標を0.5倍する必要あり 51 | #define CALC_GRABUV(uv) float2 uv = vpos.xy / _ScreenParams.xy 52 | 53 | #elif GRAB_TEXTURE_TYPE == 3 54 | // VPOSを元に計算 55 | // Single Pass Stereo用にVPOSに補正を加えたもの 56 | #if defined(UNITY_SINGLE_PASS_STEREO) 57 | #define CALC_GRABUV(uv) float2 uv = vpos.xy / _ScreenParams.xy * float2(0.5,1.0) 58 | #else 59 | #define CALC_GRABUV(uv) float2 uv = vpos.xy / _ScreenParams.xy 60 | #endif 61 | #endif 62 | 63 | // URPでは _ScreenParams の代わりに _ScaledScreenParams を使う 64 | 65 | //---------------------------------------------------------------------------------------------------------------------- 66 | // GrabPassのテクスチャ 67 | DECLARE_GRABTEX(_BackgroundTexture); 68 | 69 | //---------------------------------------------------------------------------------------------------------------------- 70 | // appdata / v2f構造体 71 | // Single Pass Instancedに対応させるにはメンバの追加が必要 (https://docs.unity3d.com/ja/2021.2/Manual/SinglePassInstancing.html) 72 | struct appdata 73 | { 74 | float4 vertex : POSITION; 75 | UNITY_VERTEX_INPUT_INSTANCE_ID // Single Pass Instanced対応用 76 | }; 77 | 78 | struct v2f 79 | { 80 | float4 ScreenPos : TEXCOORD0; 81 | float4 GrabScreenPos : TEXCOORD1; 82 | UNITY_VERTEX_INPUT_INSTANCE_ID // Single Pass Instanced対応用 83 | UNITY_VERTEX_OUTPUT_STEREO // Single Pass Instanced対応用 84 | }; 85 | 86 | //---------------------------------------------------------------------------------------------------------------------- 87 | // 頂点シェーダー 88 | v2f vert(appdata v, out float4 vertex : SV_POSITION) 89 | { 90 | v2f o; 91 | UNITY_INITIALIZE_OUTPUT(v2f, o); 92 | 93 | // Single Pass Instanced対応用 94 | UNITY_SETUP_INSTANCE_ID(v); 95 | UNITY_TRANSFER_INSTANCE_ID(v, o); 96 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); 97 | 98 | // 行列計算 99 | vertex = UnityObjectToClipPos(v.vertex); 100 | 101 | // スクリーン座標の計算 102 | // _ProjectionParams.xを用いるかUNITY_UV_STARTS_AT_TOPマクロを用いるかという違いがある 103 | // 基本的には同じ結果になるが、_ProjectionParams.xの値が不安定になる場合がある 104 | o.ScreenPos = ComputeScreenPos(vertex); 105 | o.GrabScreenPos = ComputeGrabScreenPos(vertex); 106 | return o; 107 | } 108 | 109 | //---------------------------------------------------------------------------------------------------------------------- 110 | // フラグメントシェーダー 111 | // VPOSは基本的にSV_POSITIONと同じっぽい 112 | // UNITY_VPOS_TYPEも現在はfloat4固定 (D3D9時代にfloat2が使われていた) 113 | float4 frag(v2f i, UNITY_VPOS_TYPE vpos : VPOS) : SV_Target 114 | { 115 | // Single Pass Instanced対応用 116 | UNITY_SETUP_INSTANCE_ID(i); 117 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 118 | 119 | // 画面座標の計算 120 | // 屈折を扱う場合に注意すべきポイントですが、Single Pass Stereoでは左右の目の映像を一枚のテクスチャにまとめているためUVの操作で隣の目の映像にはみ出す場合があります。 121 | // そのためUnityStereoClamp()などを用いてUV座標を制限する必要があります。 122 | CALC_GRABUV(grabUV); 123 | 124 | // サンプリング 125 | float4 col = SAMPLE_GRABTEX(_BackgroundTexture, grabUV); 126 | col.rgb *= float3(1.0,0.5,0.5); 127 | return col; 128 | } 129 | ENDCG 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /Assets/GrabTest.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c96d5727cfca0f349b092e38371c3d68 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/SHLightTester.shader: -------------------------------------------------------------------------------- 1 | Shader "SHLightTester" 2 | { 3 | Properties 4 | { 5 | [KeywordEnum(L0, x, y, z, xy, yz, zz, xz, xx_yy, L1, L2, FULL)] _SHType ("SH Type", Int) = 0 6 | } 7 | SubShader 8 | { 9 | Tags { "RenderType"="Opaque" } 10 | 11 | Pass 12 | { 13 | // SHライトプレビュー用のパス 14 | // SHライトは LightMode が ForwardBase のときに取れる 15 | Tags {"LightMode" = "ForwardBase"} 16 | CGPROGRAM 17 | #pragma vertex vert 18 | #pragma fragment frag 19 | 20 | #include "UnityCG.cginc" 21 | #include "AutoLight.cginc" 22 | #include "Lighting.cginc" 23 | 24 | struct appdata 25 | { 26 | float4 vertex : POSITION; 27 | float3 normal : NORMAL; 28 | }; 29 | 30 | struct v2f 31 | { 32 | float3 normal : TEXCOORD0; 33 | float4 vertex : SV_POSITION; 34 | }; 35 | 36 | int _SHType; 37 | 38 | v2f vert (appdata v) 39 | { 40 | v2f o; 41 | o.vertex = UnityObjectToClipPos(v.vertex); 42 | o.normal = mul((float3x3)UNITY_MATRIX_M, v.normal); 43 | return o; 44 | } 45 | 46 | float4 frag(v2f i) : SV_Target 47 | { 48 | float4 col = float4(1,1,1,1); 49 | i.normal = normalize(i.normal); 50 | 51 | // SHライトについて 52 | // https://docs.unity3d.com/ja/2020.3/Manual/LightProbes-TechnicalInformation.html 53 | // Light Probe や Skybox のライティング、その他の Important ではないライトはSHライトで計算される 54 | // ベースとなる明るさに加えて、各方向への明るさの偏りを計算することで大まかに環境光を表現している 55 | 56 | // L0: ベースとなる明るさ 57 | // unity_SHA のw成分に格納 58 | col.r = unity_SHAr.w; 59 | col.g = unity_SHAg.w; 60 | col.b = unity_SHAb.w; 61 | 62 | // L1: xyz方向への明るさの偏りを表現 63 | // unity_SHA のxyz成分に格納 64 | if(_SHType >= 1 && _SHType <= 3) 65 | { 66 | col.r += unity_SHAr[_SHType-1] * i.normal[_SHType-1]; 67 | col.g += unity_SHAg[_SHType-1] * i.normal[_SHType-1]; 68 | col.b += unity_SHAb[_SHType-1] * i.normal[_SHType-1]; 69 | } 70 | 71 | // L2: xy、yz、zz、xz、xx-yy方向への偏りを表現 72 | // unity_SHB のxyzw成分にxy、yz、zz、xz 73 | // unity_SHC のxyz成分にxx-yyを格納(SHCのxyzがrgbそれぞれのxx-yyに対応) 74 | float4 vB = i.normal.xyzz * i.normal.yzzx; 75 | float vC = i.normal.x*i.normal.x - i.normal.y*i.normal.y; 76 | if(_SHType >= 4 && _SHType <= 7) 77 | { 78 | col.r += unity_SHBr[_SHType-4] * vB[_SHType-4]; 79 | col.g += unity_SHBg[_SHType-4] * vB[_SHType-4]; 80 | col.b += unity_SHBb[_SHType-4] * vB[_SHType-4]; 81 | } 82 | if(_SHType == 8) 83 | { 84 | col.rgb += unity_SHC.rgb * vC; 85 | } 86 | 87 | // テスト用 L1L2それぞれを合算した結果 88 | // _SHType == 11 のとき ShadeSH9(float4(i.normal,1)) と同等 89 | if(_SHType == 9 || _SHType == 11) 90 | { 91 | col.r += dot(unity_SHAr.xyz, i.normal); 92 | col.g += dot(unity_SHAg.xyz, i.normal); 93 | col.b += dot(unity_SHAb.xyz, i.normal); 94 | } 95 | if(_SHType >= 10) 96 | { 97 | col.r += dot(unity_SHBr, vB); 98 | col.g += dot(unity_SHBg, vB); 99 | col.b += dot(unity_SHBb, vB); 100 | col.rgb += unity_SHC.rgb * vC; 101 | } 102 | 103 | #if defined(UNITY_COLORSPACE_GAMMA) 104 | col.rgb = LinearToGammaSpace (col.rgb); 105 | #endif 106 | 107 | return col; 108 | } 109 | ENDCG 110 | } 111 | 112 | Pass 113 | { 114 | // SHの軸のプレビュー 115 | // 赤がプラス、青がマイナス方向 116 | Tags {"LightMode" = "ForwardBase"} 117 | CGPROGRAM 118 | #pragma vertex vert 119 | #pragma fragment frag 120 | 121 | #include "UnityCG.cginc" 122 | #include "AutoLight.cginc" 123 | #include "Lighting.cginc" 124 | 125 | struct appdata 126 | { 127 | float4 vertex : POSITION; 128 | float3 normal : NORMAL; 129 | }; 130 | 131 | struct v2f 132 | { 133 | float3 normal : TEXCOORD0; 134 | float4 vertex : SV_POSITION; 135 | }; 136 | 137 | int _SHType; 138 | 139 | v2f vert (appdata v) 140 | { 141 | v2f o; 142 | o.vertex = mul(UNITY_MATRIX_M, v.vertex); 143 | o.vertex.x += 1.5; 144 | o.vertex = UnityWorldToClipPos(o.vertex); 145 | o.normal = mul((float3x3)UNITY_MATRIX_M, v.normal); 146 | return o; 147 | } 148 | 149 | float4 frag(v2f i) : SV_Target 150 | { 151 | float4 col = float4(1,0,0,1); 152 | i.normal = normalize(i.normal); 153 | 154 | float4 vB = i.normal.xyzz * i.normal.yzzx; 155 | float vC = i.normal.x*i.normal.x - i.normal.y*i.normal.y; 156 | if(_SHType >= 1 && _SHType <= 3) 157 | { 158 | col.r = saturate(0.5 + i.normal[_SHType-1] * 0.5); 159 | col.b = saturate(0.5 - i.normal[_SHType-1] * 0.5); 160 | } 161 | if(_SHType == 4 || _SHType == 5 || _SHType == 7) 162 | { 163 | col.r = saturate(0.5 + vB[_SHType-4]); 164 | col.b = saturate(0.5 - vB[_SHType-4]); 165 | } 166 | if(_SHType == 6) 167 | { 168 | col.r = saturate(0.5 + vB[_SHType-4] * 0.5); 169 | col.b = saturate(0.5 - vB[_SHType-4] * 0.5); 170 | } 171 | if(_SHType == 8) 172 | { 173 | col.r = saturate(0.5 + vC * 0.5); 174 | col.b = saturate(0.5 - vC * 0.5); 175 | } 176 | 177 | #if !defined(UNITY_COLORSPACE_GAMMA) 178 | col.rgb = GammaToLinearSpace(col.rgb); 179 | #endif 180 | 181 | return col; 182 | } 183 | ENDCG 184 | } 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /Assets/SHLightTester.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6fc280e42c91fd94097cdf4d9de13167 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/SPSITest.shader: -------------------------------------------------------------------------------- 1 | Shader "SPSITest" 2 | { 3 | Properties 4 | { 5 | _MainTex ("Texture", 2D) = "white" {} 6 | } 7 | SubShader 8 | { 9 | Tags { "RenderType"="Opaque" "Queue"="Transparent" } 10 | 11 | //---------------------------------------------------------------------------------------------------------------------- 12 | // 最低限の対応 13 | Pass 14 | { 15 | CGPROGRAM 16 | #pragma vertex vert 17 | #pragma fragment frag 18 | 19 | #include "UnityCG.cginc" 20 | 21 | sampler2D _MainTex; 22 | float4 _MainTex_ST; 23 | 24 | struct appdata 25 | { 26 | float4 vertex : POSITION; 27 | float2 uv : TEXCOORD0; 28 | 29 | // SPS-I対応 30 | UNITY_VERTEX_INPUT_INSTANCE_ID // uint instanceID : SV_InstanceID; 31 | }; 32 | 33 | struct v2f 34 | { 35 | float2 uv : TEXCOORD0; 36 | float4 vertex : SV_POSITION; 37 | 38 | // SPS-I対応 39 | UNITY_VERTEX_OUTPUT_STEREO // uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex; 40 | }; 41 | 42 | v2f vert(appdata v) 43 | { 44 | v2f o; 45 | UNITY_INITIALIZE_OUTPUT(v2f, o); // o = (v2g)0 46 | 47 | // SPS-I対応 48 | UNITY_SETUP_INSTANCE_ID(v); 49 | // UNITY_SETUP_INSTANCE_ID() を使うには入力の構造体に UNITY_VERTEX_INPUT_INSTANCE_ID が必要 50 | // 以下はマクロの中身 51 | // ---- 52 | // unity_StereoEyeIndex = i.instanceID & 0x01; 53 | // unity_InstanceID = unity_BaseInstanceID + (i.instanceID >> 1); 54 | // void UnitySetupCompoundMatrices() 55 | // { 56 | // unity_MatrixMVP_Instanced = mul(unity_MatrixVP, unity_ObjectToWorld); 57 | // unity_MatrixMV_Instanced = mul(unity_MatrixV, unity_ObjectToWorld); 58 | // unity_MatrixTMV_Instanced = transpose(unity_MatrixMV_Instanced); 59 | // unity_MatrixITMV_Instanced = transpose(mul(unity_WorldToObject, unity_MatrixInvV)); 60 | // } 61 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); // o.stereoTargetEyeIndex = unity_StereoEyeIndex 62 | 63 | o.vertex = UnityObjectToClipPos(v.vertex); 64 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 65 | return o; 66 | } 67 | 68 | fixed4 frag(v2f i) : SV_Target 69 | { 70 | return tex2D(_MainTex, i.uv); 71 | } 72 | ENDCG 73 | } 74 | 75 | GrabPass { } 76 | 77 | //---------------------------------------------------------------------------------------------------------------------- 78 | // 全対応(ジオメトリシェーダー、GrabPass、_CameraDepthTexture) 79 | Pass 80 | { 81 | CGPROGRAM 82 | #pragma vertex vert 83 | #pragma geometry geom 84 | #pragma fragment frag 85 | 86 | #include "UnityCG.cginc" 87 | 88 | sampler2D _MainTex; 89 | float4 _MainTex_ST; 90 | 91 | // SPS-I対応 92 | UNITY_DECLARE_SCREENSPACE_TEXTURE(_GrabTexture); 93 | UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); 94 | 95 | struct appdata 96 | { 97 | float4 vertex : POSITION; 98 | float2 uv : TEXCOORD0; 99 | float3 normal : NORMAL; 100 | 101 | // SPS-I対応 102 | UNITY_VERTEX_INPUT_INSTANCE_ID // uint instanceID : SV_InstanceID; 103 | }; 104 | 105 | struct v2g 106 | { 107 | float4 vertex : TEXCOORD0; 108 | float2 uv : TEXCOORD1; 109 | float3 normal : TEXCOORD2; 110 | 111 | // SPS-I対応 112 | UNITY_VERTEX_INPUT_INSTANCE_ID // uint instanceID : SV_InstanceID; 113 | UNITY_VERTEX_OUTPUT_STEREO // uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex; 114 | }; 115 | 116 | struct g2f 117 | { 118 | float4 vertex : SV_POSITION; 119 | float2 uv : TEXCOORD0; 120 | float3 normal : TEXCOORD1; 121 | 122 | // SPS-I対応 123 | UNITY_VERTEX_INPUT_INSTANCE_ID // uint instanceID : SV_InstanceID; 124 | UNITY_VERTEX_OUTPUT_STEREO // uint stereoTargetEyeIndex : SV_RenderTargetArrayIndex; 125 | }; 126 | 127 | v2g vert(appdata v) 128 | { 129 | v2g o; 130 | UNITY_INITIALIZE_OUTPUT(v2g, o); // o = (v2g)0 131 | 132 | // SPS-I対応 133 | UNITY_SETUP_INSTANCE_ID(v); 134 | // UNITY_SETUP_INSTANCE_ID() を使うには入力の構造体に UNITY_VERTEX_INPUT_INSTANCE_ID が必要 135 | // 以下はマクロの中身 136 | // ---- 137 | // unity_StereoEyeIndex = i.instanceID & 0x01; 138 | // unity_InstanceID = unity_BaseInstanceID + (i.instanceID >> 1); 139 | // void UnitySetupCompoundMatrices() 140 | // { 141 | // unity_MatrixMVP_Instanced = mul(unity_MatrixVP, unity_ObjectToWorld); 142 | // unity_MatrixMV_Instanced = mul(unity_MatrixV, unity_ObjectToWorld); 143 | // unity_MatrixTMV_Instanced = transpose(unity_MatrixMV_Instanced); 144 | // unity_MatrixITMV_Instanced = transpose(mul(unity_WorldToObject, unity_MatrixInvV)); 145 | // } 146 | UNITY_TRANSFER_INSTANCE_ID(v, o); // o.instanceID = i.instanceID 147 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); // o.stereoTargetEyeIndex = unity_StereoEyeIndex 148 | 149 | o.vertex = v.vertex; 150 | o.vertex.x += 1.5; 151 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 152 | o.normal = v.normal; 153 | return o; 154 | } 155 | 156 | [maxvertexcount(3)] 157 | void geom(triangle v2g i[3], inout TriangleStream outStream) 158 | { 159 | g2f o[3]; 160 | UNITY_INITIALIZE_OUTPUT(g2f, o[0]); 161 | UNITY_INITIALIZE_OUTPUT(g2f, o[1]); 162 | UNITY_INITIALIZE_OUTPUT(g2f, o[2]); 163 | 164 | // SPS-I対応 165 | UNITY_SETUP_INSTANCE_ID(i[0]); 166 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i[0]); // unity_StereoEyeIndex = i.stereoTargetEyeIndex; 167 | // UNITY_SETUP_INSTANCE_ID() があるのでおそらく不要ですが念の為 168 | UNITY_TRANSFER_INSTANCE_ID(i[0], o[0]); 169 | UNITY_TRANSFER_INSTANCE_ID(i[1], o[1]); 170 | UNITY_TRANSFER_INSTANCE_ID(i[2], o[2]); 171 | UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[0], o[0]); // o.stereoTargetEyeIndex = i.stereoTargetEyeIndex 172 | UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[1], o[1]); // UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO() でも多分OK 173 | UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[2], o[2]); 174 | 175 | // ここで行列計算が発生するので UNITY_SETUP_INSTANCE_ID() が必要になる 176 | o[0].vertex = UnityObjectToClipPos(i[0].vertex); 177 | o[1].vertex = UnityObjectToClipPos(i[1].vertex); 178 | o[2].vertex = UnityObjectToClipPos(i[2].vertex); 179 | o[0].normal = UnityObjectToWorldNormal(i[0].normal); 180 | o[1].normal = UnityObjectToWorldNormal(i[1].normal); 181 | o[2].normal = UnityObjectToWorldNormal(i[2].normal); 182 | o[0].uv = i[0].uv; 183 | o[1].uv = i[1].uv; 184 | o[2].uv = i[2].uv; 185 | outStream.Append(o[0]); 186 | outStream.Append(o[1]); 187 | outStream.Append(o[2]); 188 | } 189 | 190 | fixed4 frag(g2f i) : SV_Target 191 | { 192 | // SPS-I対応 193 | UNITY_SETUP_INSTANCE_ID(i); 194 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 195 | 196 | float2 scnUV = i.vertex / _ScreenParams.xy; 197 | #if defined(UNITY_SINGLE_PASS_STEREO) 198 | scnUV.x *= 0.5; 199 | #endif 200 | 201 | // ここで行列計算が発生するので UNITY_SETUP_INSTANCE_ID() が必要になる 202 | i.normal = normalize(i.normal); 203 | float2 uvMatCap = mul((float3x3)UNITY_MATRIX_V, i.normal).xy * 0.5 + 0.5; 204 | 205 | // SPS-I対応 206 | float4 grabTex = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_GrabTexture, scnUV); 207 | float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, scnUV); 208 | 209 | float4 col = tex2D(_MainTex, uvMatCap); 210 | depth = Linear01Depth(depth); 211 | col = lerp(col * grabTex, 1.0, depth); 212 | 213 | return col; 214 | } 215 | ENDCG 216 | } 217 | 218 | //---------------------------------------------------------------------------------------------------------------------- 219 | // テッセレーション(hull / domain)使用時の対応 220 | // 作り方によって対応が変わりますが、基本的には以下の手順で対応できると思われます 221 | // - 各シェーダーステージの構造体に UNITY_VERTEX_INPUT_INSTANCE_ID を追加 222 | // - 各シェーダーステージに UNITY_SETUP_INSTANCE_ID() を追加 223 | // - fragmentの入力構造体に UNITY_VERTEX_OUTPUT_STEREO を追加 224 | // - UNITY_VERTEX_INPUT_INSTANCE_ID をコピーする場合は UNITY_TRANSFER_INSTANCE_ID() を追加 225 | // - domainに UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO() を追加 226 | Pass 227 | { 228 | CGPROGRAM 229 | #pragma vertex vert 230 | #pragma hull hull 231 | #pragma domain domain 232 | #pragma fragment frag 233 | 234 | #include "UnityCG.cginc" 235 | 236 | sampler2D _MainTex; 237 | float4 _MainTex_ST; 238 | 239 | struct appdata 240 | { 241 | float4 vertex : POSITION; 242 | float2 uv : TEXCOORD0; 243 | 244 | // SPS-I対応 245 | UNITY_VERTEX_INPUT_INSTANCE_ID 246 | }; 247 | 248 | struct v2f 249 | { 250 | float2 uv : TEXCOORD0; 251 | float4 vertex : SV_POSITION; 252 | 253 | // SPS-I対応 254 | UNITY_VERTEX_INPUT_INSTANCE_ID 255 | UNITY_VERTEX_OUTPUT_STEREO 256 | }; 257 | 258 | struct tessFactors { 259 | float edge[3] : SV_TessFactor; 260 | float inside : SV_InsideTessFactor; 261 | }; 262 | 263 | appdata vert(appdata v) 264 | { 265 | // SPS-I対応 266 | UNITY_SETUP_INSTANCE_ID(v); 267 | 268 | return v; 269 | } 270 | 271 | [domain("tri")] 272 | [partitioning("integer")] 273 | [outputtopology("triangle_cw")] 274 | [patchconstantfunc("hullConst")] 275 | [outputcontrolpoints(3)] 276 | appdata hull(InputPatch i, uint id : SV_OutputControlPointID) 277 | { 278 | // SPS-I対応 279 | UNITY_SETUP_INSTANCE_ID(i[0]); 280 | 281 | return i[id]; 282 | } 283 | 284 | tessFactors hullConst(InputPatch i) 285 | { 286 | // SPS-I対応 287 | UNITY_SETUP_INSTANCE_ID(i[0]); 288 | 289 | tessFactors output; 290 | 291 | output.edge[0] = 2; 292 | output.edge[1] = 2; 293 | output.edge[2] = 2; 294 | output.inside = 2; 295 | 296 | return output; 297 | } 298 | 299 | [domain("tri")] 300 | v2f domain(tessFactors hsConst, const OutputPatch i, float3 bary : SV_DomainLocation) 301 | { 302 | appdata v; 303 | UNITY_INITIALIZE_OUTPUT(appdata, v); 304 | 305 | // SPS-I対応 306 | UNITY_SETUP_INSTANCE_ID(i[0]); 307 | UNITY_TRANSFER_INSTANCE_ID(i[0], v); 308 | 309 | #define TRI_INTERPOLATION(i,v,bary,type) v.type = bary.x * i[0].type + bary.y * i[1].type + bary.z * i[2].type 310 | TRI_INTERPOLATION(i,v,bary,vertex); 311 | TRI_INTERPOLATION(i,v,bary,uv); 312 | 313 | // ここから頂点シェーダーと同じ 314 | v2f o; 315 | UNITY_INITIALIZE_OUTPUT(v2f, o); 316 | 317 | // SPS-I対応 318 | UNITY_TRANSFER_INSTANCE_ID(v, o); 319 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); 320 | 321 | v.vertex.x += 3.0; 322 | o.vertex = UnityObjectToClipPos(v.vertex); 323 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 324 | return o; 325 | } 326 | 327 | fixed4 frag(v2f i) : SV_Target 328 | { 329 | // SPS-I対応 330 | UNITY_SETUP_INSTANCE_ID(i); 331 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 332 | 333 | return tex2D(_MainTex, i.uv); 334 | } 335 | ENDCG 336 | } 337 | } 338 | } 339 | -------------------------------------------------------------------------------- /Assets/SPSITest.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c3b38595e08c6fb4092382802e8a7699 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 05dbf611bebf7fc43a231bdedce3acfe 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates/84-Shader__VR Unlit Shader-NewUnlitShader.shader.txt: -------------------------------------------------------------------------------- 1 | Shader "Unlit/#NAME#" 2 | { 3 | Properties 4 | { 5 | _MainTex ("Texture", 2D) = "white" {} 6 | } 7 | SubShader 8 | { 9 | Tags { "RenderType"="Opaque" } 10 | LOD 100 11 | 12 | Pass 13 | { 14 | CGPROGRAM 15 | #pragma vertex vert 16 | #pragma fragment frag 17 | // make fog work 18 | #pragma multi_compile_fog 19 | 20 | #include "UnityCG.cginc" 21 | 22 | struct appdata 23 | { 24 | float4 vertex : POSITION; 25 | float2 uv : TEXCOORD0; 26 | 27 | // single pass instanced rendering 28 | UNITY_VERTEX_INPUT_INSTANCE_ID 29 | }; 30 | 31 | struct v2f 32 | { 33 | float2 uv : TEXCOORD0; 34 | UNITY_FOG_COORDS(1) 35 | float4 vertex : SV_POSITION; 36 | 37 | // single pass instanced rendering 38 | UNITY_VERTEX_INPUT_INSTANCE_ID 39 | UNITY_VERTEX_OUTPUT_STEREO 40 | }; 41 | 42 | sampler2D _MainTex; 43 | float4 _MainTex_ST; 44 | 45 | v2f vert (appdata v) 46 | { 47 | v2f o; 48 | 49 | // single pass instanced rendering 50 | UNITY_SETUP_INSTANCE_ID(v); 51 | UNITY_TRANSFER_INSTANCE_ID(v, o); 52 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); 53 | 54 | o.vertex = UnityObjectToClipPos(v.vertex); 55 | o.uv = TRANSFORM_TEX(v.uv, _MainTex); 56 | UNITY_TRANSFER_FOG(o,o.vertex); 57 | return o; 58 | } 59 | 60 | fixed4 frag (v2f i) : SV_Target 61 | { 62 | // single pass instanced rendering 63 | UNITY_SETUP_INSTANCE_ID(i); 64 | UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); 65 | 66 | // sample the texture 67 | fixed4 col = tex2D(_MainTex, i.uv); 68 | // apply fog 69 | UNITY_APPLY_FOG(i.fogCoord, col); 70 | return col; 71 | } 72 | ENDCG 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Assets/ScriptTemplates/84-Shader__VR Unlit Shader-NewUnlitShader.shader.txt.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce422b9b8d28301469450a7fdb52fa93 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/StencilChecker.shader: -------------------------------------------------------------------------------- 1 | Shader "StencilChecker" 2 | { 3 | HLSLINCLUDE 4 | #pragma vertex vert 5 | #pragma fragment frag 6 | #include "UnityCG.cginc" 7 | struct appdata 8 | { 9 | float4 vertex : POSITION; 10 | UNITY_VERTEX_INPUT_INSTANCE_ID 11 | }; 12 | 13 | struct v2f 14 | { 15 | float4 vertex : SV_POSITION; 16 | UNITY_VERTEX_OUTPUT_STEREO 17 | }; 18 | 19 | v2f vert(appdata v) 20 | { 21 | v2f o; 22 | UNITY_SETUP_INSTANCE_ID(v); 23 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); 24 | o.vertex = UnityObjectToClipPos(v.vertex); 25 | return o; 26 | } 27 | 28 | #define FRAG(r,g,b) float4 frag() : SV_Target { return float4( GammaToLinearSpace(float3(r,g,b)/7.0), 1 ); } 29 | ENDHLSL 30 | 31 | SubShader 32 | { 33 | Tags { "RenderType"="Overlay" "Queue"="Overlay" "IgnoreProjector"="True" "VRCFallback"="Hidden" } 34 | ZWrite Off 35 | Blend Zero Zero, Zero One 36 | Pass{ HLSLPROGRAM FRAG(0,0,0) ENDHLSL } 37 | 38 | Stencil { Comp Equal } 39 | Blend One One, Zero One 40 | 41 | Stencil { ReadMask 7 } 42 | Pass{ Stencil{ Ref 1 } HLSLPROGRAM FRAG(0,0,1) ENDHLSL } 43 | Pass{ Stencil{ Ref 2 } HLSLPROGRAM FRAG(0,0,2) ENDHLSL } 44 | Pass{ Stencil{ Ref 3 } HLSLPROGRAM FRAG(0,0,3) ENDHLSL } 45 | Pass{ Stencil{ Ref 4 } HLSLPROGRAM FRAG(0,0,4) ENDHLSL } 46 | Pass{ Stencil{ Ref 5 } HLSLPROGRAM FRAG(0,0,5) ENDHLSL } 47 | Pass{ Stencil{ Ref 6 } HLSLPROGRAM FRAG(0,0,6) ENDHLSL } 48 | Pass{ Stencil{ Ref 7 } HLSLPROGRAM FRAG(0,0,7) ENDHLSL } 49 | 50 | Stencil { ReadMask 56 } 51 | Pass{ Stencil{ Ref 8 } HLSLPROGRAM FRAG(0,1,0) ENDHLSL } 52 | Pass{ Stencil{ Ref 16 } HLSLPROGRAM FRAG(0,2,0) ENDHLSL } 53 | Pass{ Stencil{ Ref 24 } HLSLPROGRAM FRAG(0,3,0) ENDHLSL } 54 | Pass{ Stencil{ Ref 32 } HLSLPROGRAM FRAG(0,4,0) ENDHLSL } 55 | Pass{ Stencil{ Ref 40 } HLSLPROGRAM FRAG(0,5,0) ENDHLSL } 56 | Pass{ Stencil{ Ref 48 } HLSLPROGRAM FRAG(0,6,0) ENDHLSL } 57 | Pass{ Stencil{ Ref 56 } HLSLPROGRAM FRAG(0,7,0) ENDHLSL } 58 | 59 | Stencil { ReadMask 192 } 60 | Pass{ Stencil{ Ref 64 } HLSLPROGRAM FRAG(1,0,0) ENDHLSL } 61 | Pass{ Stencil{ Ref 128 } HLSLPROGRAM FRAG(2,0,0) ENDHLSL } 62 | Pass{ Stencil{ Ref 192 } HLSLPROGRAM FRAG(3,0,0) ENDHLSL } 63 | } 64 | } -------------------------------------------------------------------------------- /Assets/StencilChecker.shader.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 49aad3b37a41857488a203af903084f1 3 | ShaderImporter: 4 | externalObjects: {} 5 | defaultTextures: [] 6 | nonModifiableTextures: [] 7 | preprocessorOverride: 0 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Docs/HDRP Litの変遷.md: -------------------------------------------------------------------------------- 1 | # 開発メモ(HDRP/Litの変遷) 2 | lilToonの開発に関わった部分のみメモ 3 | 詳細は[Unity-Technologies / Graphics](https://github.com/Unity-Technologies/Graphics)を参照 4 | コンパイルエラー対策のマクロは[lil_common_macro.hlsl](https://github.com/lilxyzw/lilToon/blob/master/Assets/lilToon/Shader/Includes/lil_common_macro.hlsl)を参照 5 | 6 | ## 要約 7 | トゥーンシェーダーとして実装するならForwardレンダリング、つまり`DepthForwardOnly`、`ForwardOnly`を使用すれば良い。 8 | 必要なLightModeをまとめると以下の通り 9 | - `ForwardOnly` 10 | - `DepthForwardOnly` 11 | - `ShadowCaster` 12 | - `MotionVectors` 13 | - `Meta` 14 | 15 | アウトラインなどマルチパスしたい場合は`SRPDefaultUnlit`を利用可能。 16 | `SceneSelectionPass`、`Picking`、`DistortionVectors`は任意で実装で良さそう。 17 | レイトレーシングはトゥーンシェーダーとの親和性が悪そうなのでUnlitにフォールバックするといいかもしれない。 18 | 19 | ## [4.x.x] 20 | - 現在のパスに変更された 21 | - SubShaderのTagsは`"RenderPipeline" = "HDRenderPipeline"`と`"RenderType" = "HDLitShader"` 22 | - Lit・Unlit共通のLightModeとして`SceneSelectionPass`、`MotionVectors`、`Meta`、`DistortionVectors`が存在する 23 | - Unlit特有のLightModeとしては`DepthForwardOnly`、`ForwardOnly`が存在する 24 | - Lit特有のLightModeとして`GBuffer`、`ShadowCaster`、`DepthOnly`、`TransparentDepthPrepass`、`TransparentBackface`、`Forward`、`TransparentDepthPostpass`が存在する 25 | 26 | 共通のシェーダーキーワード 27 | ```HLSL 28 | #pragma multi_compile_instancing 29 | #pragma instancing_options renderinglayer 30 | ``` 31 | 32 | `SceneSelectionPass`のシェーダーキーワード 33 | ```HLSL 34 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 35 | #define SCENESELECTIONPASS 36 | ``` 37 | 38 | `GBuffer`のシェーダーキーワード 39 | ```HLSL 40 | #define SHADERPASS SHADERPASS_GBUFFER 41 | #pragma multi_compile _ DEBUG_DISPLAY 42 | #pragma multi_compile _ LIGHTMAP_ON 43 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 44 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 45 | #pragma multi_compile _ SHADOWS_SHADOWMASK 46 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 47 | #pragma multi_compile _ LIGHT_LAYERS 48 | ``` 49 | 50 | `Meta`のシェーダーキーワード 51 | ```HLSL 52 | #define SHADERPASS SHADERPASS_LIGHT_TRANSPORT 53 | ``` 54 | 55 | `ShadowCaster`のシェーダーキーワード 56 | ```HLSL 57 | #define SHADERPASS SHADERPASS_SHADOWS 58 | #define USE_LEGACY_UNITY_MATRIX_VARIABLES 59 | ``` 60 | 61 | `DepthOnly`のシェーダーキーワード 62 | ```HLSL 63 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 64 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 65 | #pragma multi_compile _ WRITE_MSAA_DEPTH 66 | ``` 67 | 68 | `MotionVectors`のシェーダーキーワード 69 | ```HLSL 70 | #define SHADERPASS SHADERPASS_VELOCITY 71 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 72 | #pragma multi_compile _ WRITE_MSAA_DEPTH 73 | ``` 74 | 75 | `DistortionVectors`のシェーダーキーワード 76 | ```HLSL 77 | #define SHADERPASS SHADERPASS_DISTORTION 78 | ``` 79 | 80 | `TransparentDepthPrepass`のシェーダーキーワード 81 | ```HLSL 82 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 83 | #define CUTOFF_TRANSPARENT_DEPTH_PREPASS 84 | ``` 85 | 86 | `TransparentBackface`のシェーダーキーワード 87 | ```HLSL 88 | #define SHADERPASS SHADERPASS_FORWARD 89 | #define LIGHTLOOP_TILE_PASS 90 | #pragma multi_compile _ DEBUG_DISPLAY 91 | #pragma multi_compile _ LIGHTMAP_ON 92 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 93 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 94 | #pragma multi_compile _ SHADOWS_SHADOWMASK 95 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 96 | #pragma multi_compile PUNCTUAL_SHADOW_LOW PUNCTUAL_SHADOW_MEDIUM PUNCTUAL_SHADOW_HIGH 97 | #pragma multi_compile DIRECTIONAL_SHADOW_LOW DIRECTIONAL_SHADOW_MEDIUM DIRECTIONAL_SHADOW_HIGH 98 | #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST 99 | ``` 100 | 101 | `Forward`のシェーダーキーワード 102 | ```HLSL 103 | #define SHADERPASS SHADERPASS_FORWARD 104 | #define LIGHTLOOP_TILE_PASS 105 | #pragma multi_compile _ DEBUG_DISPLAY 106 | #pragma multi_compile _ LIGHTMAP_ON 107 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 108 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 109 | #pragma multi_compile _ SHADOWS_SHADOWMASK 110 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 111 | #pragma multi_compile PUNCTUAL_SHADOW_LOW PUNCTUAL_SHADOW_MEDIUM PUNCTUAL_SHADOW_HIGH 112 | #pragma multi_compile DIRECTIONAL_SHADOW_LOW DIRECTIONAL_SHADOW_MEDIUM DIRECTIONAL_SHADOW_HIGH 113 | #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST 114 | ``` 115 | 116 | `TransparentDepthPostpass`のシェーダーキーワード 117 | ```HLSL 118 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 119 | #define CUTOFF_TRANSPARENT_DEPTH_POSTPASS 120 | ``` 121 | 122 | `DepthForwardOnly`のシェーダーキーワード 123 | ```HLSL 124 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 125 | #pragma multi_compile _ WRITE_MSAA_DEPTH 126 | ``` 127 | 128 | `ForwardOnly`のシェーダーキーワード 129 | ```HLSL 130 | #define SHADERPASS SHADERPASS_FORWARD_UNLIT 131 | #pragma multi_compile _ DEBUG_DISPLAY 132 | ``` 133 | 134 | ## [5.x.x] 135 | - DXR(レイトレーシング)対応が追加された 136 | - それに伴ってLightModeに`IndirectDXR`、`ForwardDXR`、`VisibilityDXR`が追加された 137 | - シェーダーキーワードの`PUNCTUAL_SHADOW_`と`DIRECTIONAL_SHADOW_`が`SHADOW_`に統合された、また`VERY_HIGH`が追加された 138 | - レイトレーシングシェーダーは`#pragma raytracing Raytracing`のような形で記述する 139 | 140 | `TransparentBackface`のシェーダーキーワード 141 | ```HLSL 142 | #define SHADERPASS SHADERPASS_FORWARD 143 | #pragma multi_compile _ DEBUG_DISPLAY 144 | #pragma multi_compile _ LIGHTMAP_ON 145 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 146 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 147 | #pragma multi_compile _ SHADOWS_SHADOWMASK 148 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 149 | #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH 150 | #define USE_CLUSTERED_LIGHTLIST 151 | ``` 152 | 153 | `Forward`のシェーダーキーワード 154 | ```HLSL 155 | #define SHADERPASS SHADERPASS_FORWARD 156 | #pragma multi_compile _ DEBUG_DISPLAY 157 | #pragma multi_compile _ LIGHTMAP_ON 158 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 159 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 160 | #pragma multi_compile _ SHADOWS_SHADOWMASK 161 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 162 | #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH 163 | #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST 164 | ``` 165 | 166 | `IndirectDXR`のシェーダーキーワード 167 | ```HLSL 168 | #define SHADERPASS SHADERPASS_RAYTRACING_INDIRECT 169 | #define SKIP_RASTERIZED_SHADOWS 170 | #define SHADOW_LOW 171 | #define HAS_LIGHTLOOP 172 | #pragma multi_compile _ LIGHTMAP_ON 173 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 174 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 175 | #pragma multi_compile _ DIFFUSE_LIGHTING_ONLY 176 | ``` 177 | 178 | `ForwardDXR`のシェーダーキーワード 179 | ```HLSL 180 | #define SHADERPASS SHADERPASS_RAYTRACING_FORWARD 181 | #define SKIP_RASTERIZED_SHADOWS 182 | #define SHADOW_LOW 183 | #define HAS_LIGHTLOOP 184 | #pragma multi_compile _ LIGHTMAP_ON 185 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 186 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 187 | ``` 188 | 189 | `VisibilityDXR`のシェーダーキーワード 190 | ```HLSL 191 | #define SHADERPASS SHADERPASS_RAYTRACING_VISIBILITY 192 | ``` 193 | 194 | ## [6.x.x] 195 | - `SceneSelectionPass`に`#pragma editor_sync_compilation`が追加された 196 | 197 | ## [7.x.x] 198 | - `#pragma multi_compile_instancing`と`#pragma instancing_options renderinglayer`が各パスごとになる 199 | - Unlitにも`ShadowCaster`が追加された 200 | - LightModeに`GBufferDXR`、`SubSurfaceDXR`、`PathTracingDXR`が追加された(`SubSurfaceDXR`はLitのみ) 201 | - DXRシェーダーのシェーダーキーワードに`DEBUG_DISPLAY`、`MULTI_BOUNCE_INDIRECT`が追加された 202 | 203 | `IndirectDXR`のシェーダーキーワード 204 | ```HLSL 205 | #define SHADERPASS SHADERPASS_RAYTRACING_INDIRECT 206 | #define SHADOW_LOW 207 | #define HAS_LIGHTLOOP 208 | #pragma multi_compile _ DEBUG_DISPLAY 209 | #pragma multi_compile _ LIGHTMAP_ON 210 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 211 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 212 | #pragma multi_compile _ DIFFUSE_LIGHTING_ONLY 213 | #pragma multi_compile _ MULTI_BOUNCE_INDIRECT 214 | ``` 215 | 216 | `ForwardDXR`のシェーダーキーワード 217 | ```HLSL 218 | #define SHADERPASS SHADERPASS_RAYTRACING_FORWARD 219 | #define SHADOW_LOW 220 | #define HAS_LIGHTLOOP 221 | #pragma multi_compile _ DEBUG_DISPLAY 222 | #pragma multi_compile _ LIGHTMAP_ON 223 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 224 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 225 | ``` 226 | 227 | `GBufferDXR`のシェーダーキーワード 228 | ```HLSL 229 | #define SHADERPASS SHADERPASS_RAYTRACING_GBUFFER 230 | #pragma multi_compile _ DEBUG_DISPLAY 231 | #pragma multi_compile _ LIGHTMAP_ON 232 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 233 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 234 | #pragma multi_compile _ DIFFUSE_LIGHTING_ONLY 235 | ``` 236 | 237 | `VisibilityDXR`のシェーダーキーワード 238 | ```HLSL 239 | #define SHADERPASS SHADERPASS_RAYTRACING_VISIBILITY 240 | #pragma multi_compile _ TRANSPARENT_COLOR_SHADOW 241 | ``` 242 | 243 | `SubSurfaceDXR`のシェーダーキーワード 244 | ```HLSL 245 | #define SHADERPASS SHADERPASS_RAYTRACING_SUB_SURFACE 246 | #pragma multi_compile _ DEBUG_DISPLAY 247 | #pragma multi_compile _ LIGHTMAP_ON 248 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 249 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 250 | #pragma multi_compile _ DIFFUSE_LIGHTING_ONLY 251 | ``` 252 | 253 | `PathTracingDXR`のシェーダーキーワード 254 | ```HLSL 255 | #define SHADERPASS SHADERPASS_PATH_TRACING 256 | #define SHADOW_LOW 257 | #define HAS_LIGHTLOOP 258 | #pragma multi_compile _ DEBUG_DISPLAY 259 | ``` 260 | 261 | ## [9.x.x] 262 | - multi_compile_instancingしているパスに`#pragma multi_compile _ DOTS_INSTANCING_ON`が追加された 263 | - LightModeに`RayTracingPrepass`が追加された 264 | - DXRシェーダーから`DYNAMICLIGHTMAP_ON`と`DIFFUSE_LIGHTING_ONLY`が削除された 265 | 266 | `PathTracingDXR`のシェーダーキーワード 267 | ```HLSL 268 | #define SHADERPASS SHADERPASS_CONSTANT 269 | ``` 270 | 271 | `IndirectDXR`のシェーダーキーワード 272 | ```HLSL 273 | #define SHADERPASS SHADERPASS_RAYTRACING_INDIRECT 274 | #define SHADOW_LOW 275 | #define HAS_LIGHTLOOP 276 | #pragma multi_compile _ DEBUG_DISPLAY 277 | #pragma multi_compile _ LIGHTMAP_ON 278 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 279 | #pragma multi_compile _ MULTI_BOUNCE_INDIRECT 280 | ``` 281 | 282 | `ForwardDXR`のシェーダーキーワード 283 | ```HLSL 284 | #define SHADERPASS SHADERPASS_RAYTRACING_FORWARD 285 | #define SHADOW_LOW 286 | #define HAS_LIGHTLOOP 287 | #pragma multi_compile _ DEBUG_DISPLAY 288 | #pragma multi_compile _ LIGHTMAP_ON 289 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 290 | ``` 291 | 292 | `GBufferDXR`のシェーダーキーワード 293 | ```HLSL 294 | #define SHADERPASS SHADERPASS_RAYTRACING_GBUFFER 295 | #pragma multi_compile _ DEBUG_DISPLAY 296 | #pragma multi_compile _ LIGHTMAP_ON 297 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 298 | ``` 299 | 300 | `SubSurfaceDXR`のシェーダーキーワード 301 | ```HLSL 302 | #define SHADERPASS SHADERPASS_RAYTRACING_SUB_SURFACE 303 | #pragma multi_compile _ DEBUG_DISPLAY 304 | #pragma multi_compile _ LIGHTMAP_ON 305 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 306 | ``` 307 | 308 | ## [10.x.x] 309 | - LightModeに`Picking`が追加された 310 | - シェーダーキーワードに`WRITE_DECAL_BUFFER`、`SCREEN_SPACE_SHADOWS_OFF`、`SCREEN_SPACE_SHADOWS_ON`、`MINIMAL_GBUFFER`が追加された 311 | 312 | `Picking`のシェーダーキーワード 313 | ```HLSL 314 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 315 | #define SCENEPICKINGPASS 316 | #pragma editor_sync_compilation 317 | #pragma multi_compile_instancing 318 | #pragma instancing_options renderinglayer 319 | #pragma multi_compile _ DOTS_INSTANCING_ON 320 | ``` 321 | 322 | `DepthOnly`のシェーダーキーワード 323 | ```HLSL 324 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 325 | #pragma multi_compile_instancing 326 | #pragma instancing_options renderinglayer 327 | #pragma multi_compile _ DOTS_INSTANCING_ON 328 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 329 | #pragma multi_compile _ WRITE_DECAL_BUFFER 330 | #pragma multi_compile _ WRITE_MSAA_DEPTH 331 | ``` 332 | 333 | `MotionVectors`のシェーダーキーワード 334 | ```HLSL 335 | #define SHADERPASS SHADERPASS_MOTION_VECTORS 336 | #pragma multi_compile_instancing 337 | #pragma instancing_options renderinglayer 338 | #pragma multi_compile _ DOTS_INSTANCING_ON 339 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 340 | #pragma multi_compile _ WRITE_DECAL_BUFFER 341 | #pragma multi_compile _ WRITE_MSAA_DEPTH 342 | ``` 343 | 344 | `TransparentDepthPrepass`のシェーダーキーワード 345 | ```HLSL 346 | #define SHADERPASS SHADERPASS_TRANSPARENT_DEPTH_PREPASS 347 | #pragma multi_compile_instancing 348 | #pragma instancing_options renderinglayer 349 | #pragma multi_compile _ DOTS_INSTANCING_ON 350 | ``` 351 | 352 | `TransparentBackface`のシェーダーキーワード 353 | ```HLSL 354 | #define SHADERPASS SHADERPASS_FORWARD 355 | #define HAS_LIGHTLOOP 356 | #pragma multi_compile_instancing 357 | #pragma instancing_options renderinglayer 358 | #pragma multi_compile _ DOTS_INSTANCING_ON 359 | #pragma multi_compile _ DEBUG_DISPLAY 360 | #pragma multi_compile _ LIGHTMAP_ON 361 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 362 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 363 | #pragma multi_compile _ SHADOWS_SHADOWMASK 364 | #pragma multi_compile SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON 365 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 366 | #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH 367 | #define USE_CLUSTERED_LIGHTLIST 368 | ``` 369 | 370 | `Forward`のシェーダーキーワード 371 | ```HLSL 372 | #define SHADERPASS SHADERPASS_FORWARD 373 | #define HAS_LIGHTLOOP 374 | #pragma multi_compile_instancing 375 | #pragma instancing_options renderinglayer 376 | #pragma multi_compile _ DOTS_INSTANCING_ON 377 | #pragma multi_compile _ DEBUG_DISPLAY 378 | #pragma multi_compile _ LIGHTMAP_ON 379 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 380 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 381 | #pragma multi_compile _ SHADOWS_SHADOWMASK 382 | #pragma multi_compile SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON 383 | #pragma multi_compile DECALS_OFF DECALS_3RT DECALS_4RT 384 | #pragma multi_compile SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH 385 | #pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST 386 | ``` 387 | 388 | `FullScreenDebug`のシェーダーキーワード 389 | ```HLSL 390 | #define SHADERPASS SHADERPASS_FULL_SCREEN_DEBUG 391 | ``` 392 | 393 | `GBufferDXR`のシェーダーキーワード 394 | ```HLSL 395 | #define SHADERPASS SHADERPASS_RAYTRACING_GBUFFER 396 | #pragma multi_compile _ DEBUG_DISPLAY 397 | #pragma multi_compile _ LIGHTMAP_ON 398 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 399 | #pragma multi_compile _ MINIMAL_GBUFFER 400 | ``` 401 | 402 | ## [12.x.x] 403 | - 一部がmulti_compile_fragmentになった 404 | - シェーダーキーワードに`PROBE_VOLUMES_OFF`、`PROBE_VOLUMES_L1`、`PROBE_VOLUMES_L2`、`DECAL_SURFACE_GRADIENT`が追加された 405 | - DXRシェーダーの`DYNAMICLIGHTMAP_ON`が復活 406 | 407 | `GBuffer`のシェーダーキーワード 408 | ```HLSL 409 | #define SHADERPASS SHADERPASS_GBUFFER 410 | #pragma multi_compile_instancing 411 | #pragma instancing_options renderinglayer 412 | #pragma multi_compile _ DOTS_INSTANCING_ON 413 | #pragma multi_compile _ DEBUG_DISPLAY 414 | #pragma multi_compile _ LIGHTMAP_ON 415 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 416 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 417 | #pragma multi_compile_fragment _ SHADOWS_SHADOWMASK 418 | #pragma multi_compile_fragment PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 419 | #pragma multi_compile_fragment DECALS_OFF DECALS_3RT DECALS_4RT 420 | #pragma multi_compile_fragment _ DECAL_SURFACE_GRADIENT 421 | #pragma multi_compile_fragment _ LIGHT_LAYERS 422 | ``` 423 | 424 | `DepthOnly`のシェーダーキーワード 425 | ```HLSL 426 | #define SHADERPASS SHADERPASS_DEPTH_ONLY 427 | #pragma multi_compile_instancing 428 | #pragma instancing_options renderinglayer 429 | #pragma multi_compile _ DOTS_INSTANCING_ON 430 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 431 | #pragma multi_compile_fragment _ WRITE_MSAA_DEPTH 432 | #pragma multi_compile _ WRITE_DECAL_BUFFER 433 | ``` 434 | 435 | `MotionVectors`のシェーダーキーワード 436 | ```HLSL 437 | #define SHADERPASS SHADERPASS_MOTION_VECTORS 438 | #pragma multi_compile_instancing 439 | #pragma instancing_options renderinglayer 440 | #pragma multi_compile _ DOTS_INSTANCING_ON 441 | #pragma multi_compile _ WRITE_NORMAL_BUFFER 442 | #pragma multi_compile_fragment _ WRITE_MSAA_DEPTH 443 | #pragma multi_compile _ WRITE_DECAL_BUFFER 444 | ``` 445 | 446 | `TransparentBackface`のシェーダーキーワード 447 | ```HLSL 448 | #define SHADERPASS SHADERPASS_FORWARD 449 | #define HAS_LIGHTLOOP 450 | #pragma multi_compile_instancing 451 | #pragma instancing_options renderinglayer 452 | #pragma multi_compile _ DOTS_INSTANCING_ON 453 | #pragma multi_compile _ DEBUG_DISPLAY 454 | #pragma multi_compile _ LIGHTMAP_ON 455 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 456 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 457 | #pragma multi_compile_fragment _ SHADOWS_SHADOWMASK 458 | #pragma multi_compile_fragment PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 459 | #pragma multi_compile_fragment SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON 460 | #pragma multi_compile_fragment DECALS_OFF DECALS_3RT DECALS_4RT 461 | #pragma multi_compile_fragment _ DECAL_SURFACE_GRADIENT 462 | #pragma multi_compile_fragment SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH 463 | #ifndef SHADER_STAGE_FRAGMENT 464 | #define SHADOW_LOW 465 | #endif 466 | ``` 467 | 468 | `Forward`のシェーダーキーワード 469 | ```HLSL 470 | #define SHADERPASS SHADERPASS_FORWARD 471 | #define HAS_LIGHTLOOP 472 | #pragma multi_compile_instancing 473 | #pragma instancing_options renderinglayer 474 | #pragma multi_compile _ DOTS_INSTANCING_ON 475 | #pragma multi_compile _ DEBUG_DISPLAY 476 | #pragma multi_compile _ LIGHTMAP_ON 477 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 478 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 479 | #pragma multi_compile_fragment _ SHADOWS_SHADOWMASK 480 | #pragma multi_compile_fragment PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 481 | #pragma multi_compile_fragment SCREEN_SPACE_SHADOWS_OFF SCREEN_SPACE_SHADOWS_ON 482 | #pragma multi_compile_fragment DECALS_OFF DECALS_3RT DECALS_4RT 483 | #pragma multi_compile_fragment _ DECAL_SURFACE_GRADIENT 484 | #pragma multi_compile_fragment SHADOW_LOW SHADOW_MEDIUM SHADOW_HIGH SHADOW_VERY_HIGH 485 | #pragma multi_compile_fragment USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST 486 | #ifndef SHADER_STAGE_FRAGMENT 487 | #define SHADOW_LOW 488 | #define USE_FPTL_LIGHTLIST 489 | #endif 490 | ``` 491 | 492 | `IndirectDXR`のシェーダーキーワード 493 | ```HLSL 494 | #define SHADERPASS SHADERPASS_RAYTRACING_INDIRECT 495 | #define SHADOW_LOW 496 | #define HAS_LIGHTLOOP 497 | #pragma multi_compile _ DEBUG_DISPLAY 498 | #pragma multi_compile _ LIGHTMAP_ON 499 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 500 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 501 | #pragma multi_compile PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 502 | #pragma multi_compile _ MULTI_BOUNCE_INDIRECT 503 | ``` 504 | 505 | `ForwardDXR`のシェーダーキーワード 506 | ```HLSL 507 | #define SHADERPASS SHADERPASS_RAYTRACING_FORWARD 508 | #define SHADOW_LOW 509 | #define HAS_LIGHTLOOP 510 | #pragma multi_compile _ DEBUG_DISPLAY 511 | #pragma multi_compile _ LIGHTMAP_ON 512 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 513 | #pragma multi_compile PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 514 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 515 | ``` 516 | 517 | `GBufferDXR`のシェーダーキーワード 518 | ```HLSL 519 | #define SHADERPASS SHADERPASS_RAYTRACING_GBUFFER 520 | #pragma multi_compile _ DEBUG_DISPLAY 521 | #pragma multi_compile _ LIGHTMAP_ON 522 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 523 | #pragma multi_compile PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 524 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 525 | #pragma multi_compile _ MINIMAL_GBUFFER 526 | ``` 527 | 528 | `SubSurfaceDXR`のシェーダーキーワード 529 | ```HLSL 530 | #define SHADERPASS SHADERPASS_RAYTRACING_SUB_SURFACE 531 | #pragma multi_compile _ DEBUG_DISPLAY 532 | #pragma multi_compile _ LIGHTMAP_ON 533 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 534 | #pragma multi_compile PROBE_VOLUMES_OFF PROBE_VOLUMES_L1 PROBE_VOLUMES_L2 535 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 536 | ``` 537 | 538 | `PathTracingDXR`のシェーダーキーワード 539 | ```HLSL 540 | #define SHADERPASS SHADERPASS_PATH_TRACING 541 | #pragma multi_compile _ DEBUG_DISPLAY 542 | ``` -------------------------------------------------------------------------------- /Docs/SRPでのマルチパスシェーダー.md: -------------------------------------------------------------------------------- 1 | # SRPでのマルチパスシェーダー 2 | SRPではマルチパスシェーダーの作成に制限がありますが、シェーダーのLightModeタグを複数組み合わせることでパイプラインの改造無しで擬似的に作成できます。 3 | 4 | ## HDRP 5 | ### 4.x.x - 14.x.x 6 | 1. `TransparentBackface`(Transparentのみ) 7 | 2. `ForwardOnly` 8 | 3. `Forward`(Transparentのみ) 9 | 4. `SRPDefaultUnlit` 10 | 11 | ```HLSL 12 | Shader "Unlit/MultiPass" 13 | { 14 | SubShader 15 | { 16 | Tags { "RenderType"="Opaque" "Queue"="Transparent" } 17 | HLSLINCLUDE 18 | #pragma vertex vert 19 | #pragma fragment frag 20 | #include "UnityCG.cginc" 21 | #define VERT(x,y,z,w) float4 vert(float4 vertex : POSITION) : SV_POSITION { return UnityObjectToClipPos(vertex + float4(x,y,z,w)); } 22 | #define FRAG(r,g,b,a) float4 frag() : SV_Target { return float4(r,g,b,a); } 23 | ENDHLSL 24 | 25 | Blend SrcAlpha OneMinusSrcAlpha 26 | 27 | Pass 28 | { 29 | Name "TransparentBackface" 30 | Tags {"LightMode"="TransparentBackface"} 31 | HLSLPROGRAM 32 | VERT(0,0,0,0) 33 | FRAG(1,1,1,0.5) 34 | ENDHLSL 35 | } 36 | 37 | Pass 38 | { 39 | Name "ForwardOnly" 40 | Tags {"LightMode"="ForwardOnly"} 41 | HLSLPROGRAM 42 | VERT(1,0,0,0) 43 | FRAG(1,1,1,0.5) 44 | ENDHLSL 45 | } 46 | 47 | Pass 48 | { 49 | Name "Forward" 50 | Tags {"LightMode"="Forward"} 51 | HLSLPROGRAM 52 | VERT(2,0,0,0) 53 | FRAG(1,1,1,0.5) 54 | ENDHLSL 55 | } 56 | 57 | Pass 58 | { 59 | Name "SRPDefaultUnlit" 60 | Tags {"LightMode"="SRPDefaultUnlit"} 61 | HLSLPROGRAM 62 | VERT(3,0,0,0) 63 | FRAG(1,1,1,0.5) 64 | ENDHLSL 65 | } 66 | } 67 | } 68 | ``` 69 | 70 | ## URP 71 | ### 7.x.x 72 | 1. `UniversalForward` 73 | 2. `LightweightForward` 74 | 3. `SRPDefaultUnlit` 75 | 76 | ### 8.x.x 77 | 1. `SRPDefaultUnlit` 78 | 2. `UniversalForward` 79 | 3. `LightweightForward` 80 | 81 | ### 9.x.x - 11.x.x 82 | 1. `SRPDefaultUnlit` 83 | 2. `UniversalForward` 84 | 3. `UniversalForwardOnly` 85 | 4. `LightweightForward` 86 | 87 | ### 12.x.x - 14.x.x 88 | 1. `SRPDefaultUnlit` 89 | 2. `UniversalForward` 90 | 3. `UniversalForwardOnly` 91 | 92 | ```HLSL 93 | Shader "Unlit/MultiPass" 94 | { 95 | SubShader 96 | { 97 | Tags { "RenderType"="Opaque" "Queue"="Transparent" } 98 | HLSLINCLUDE 99 | #pragma vertex vert 100 | #pragma fragment frag 101 | float4x4 unity_MatrixVP; 102 | float4x4 unity_ObjectToWorld; 103 | #define VERT(x,y,z,w) float4 vert(float4 vertex : POSITION) : SV_POSITION { return mul(unity_MatrixVP, mul(unity_ObjectToWorld, float4(vertex.xyz, 1.0) + float4(x,y,z,w))); } 104 | #define FRAG(r,g,b,a) float4 frag() : SV_Target { return float4(r,g,b,a); } 105 | ENDHLSL 106 | 107 | Blend SrcAlpha OneMinusSrcAlpha 108 | 109 | Pass 110 | { 111 | Name "SRPDefaultUnlit" 112 | Tags {"LightMode"="SRPDefaultUnlit"} 113 | HLSLPROGRAM 114 | VERT(0,0,0,0) 115 | FRAG(1,1,1,0.5) 116 | ENDHLSL 117 | } 118 | 119 | Pass 120 | { 121 | Name "UniversalForward" 122 | Tags {"LightMode"="UniversalForward"} 123 | HLSLPROGRAM 124 | VERT(1,0,0,0) 125 | FRAG(1,1,1,0.5) 126 | ENDHLSL 127 | } 128 | 129 | Pass 130 | { 131 | Name "UniversalForwardOnly" 132 | Tags {"LightMode"="UniversalForwardOnly"} 133 | HLSLPROGRAM 134 | VERT(2,0,0,0) 135 | FRAG(1,1,1,0.5) 136 | ENDHLSL 137 | } 138 | 139 | Pass 140 | { 141 | Name "LightweightForward" 142 | Tags {"LightMode"="LightweightForward"} 143 | HLSLPROGRAM 144 | VERT(3,0,0,0) 145 | FRAG(1,1,1,0.5) 146 | ENDHLSL 147 | } 148 | } 149 | } 150 | ``` -------------------------------------------------------------------------------- /Docs/Universal Render Pipeline Litの変遷.md: -------------------------------------------------------------------------------- 1 | # 開発メモ(Universal Render Pipeline/Litの変遷) 2 | lilToonの開発に関わった部分のみメモ 3 | 詳細は[Unity-Technologies / Graphics](https://github.com/Unity-Technologies/Graphics)を参照 4 | コンパイルエラー対策のマクロは[lil_common_macro.hlsl](https://github.com/lilxyzw/lilToon/blob/master/Assets/lilToon/Shader/Includes/lil_common_macro.hlsl)を参照 5 | 6 | ## 要約 7 | SubShaderのTagsは`"RenderPipeline" = "UniversalPipeline"`。 8 | DOTS Instancing対応・非対応でSubShaderを分ける必要あり。 9 | トゥーンシェーダーとして実装するならForwardレンダリングなので、基本的に`UniversalGBuffer`は不要。 10 | 必要なLightModeをまとめると以下の通り 11 | - `UniversalForward` 12 | - `ShadowCaster` 13 | - `DepthOnly` 14 | - `DepthNormals` 15 | - `Meta` 16 | 17 | アウトラインなどマルチパスしたい場合は`SRPDefaultUnlit`を利用可能。 18 | `Universal2D`は任意で追加。 19 | 9.x.x以前は`_MIXED_LIGHTING_SUBTRACTIVE`というキーワードが使われていたので対応させたい場合は追加が必要。(ライトマップ用) 20 | 21 | ## [LightweightRP] 22 | - 現在のパスに変更された 23 | - SubShaderのTagsは`"RenderPipeline" = "LightweightPipeline"` 24 | - LightModeとして`LightweightForward`、`ShadowCaster`、`DepthOnly`、`Meta`が存在する 25 | - 6.8.0でLightModeに`Lightweight2D`が追加された 26 | 27 | `LightweightForward`のシェーダーキーワード 28 | ```HLSL 29 | // ------------------------------------- 30 | // Universal Pipeline keywords 31 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS 32 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE 33 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 34 | #pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS 35 | #pragma multi_compile _ _SHADOWS_SOFT 36 | #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE 37 | 38 | // ------------------------------------- 39 | // Unity defined keywords 40 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 41 | #pragma multi_compile _ LIGHTMAP_ON 42 | #pragma multi_compile_fog 43 | 44 | //-------------------------------------- 45 | // GPU Instancing 46 | #pragma multi_compile_instancing 47 | ``` 48 | 49 | `ShadowCaster`と`DepthOnly`のシェーダーキーワード 50 | ```HLSL 51 | //-------------------------------------- 52 | // GPU Instancing 53 | #pragma multi_compile_instancing 54 | ``` 55 | 56 | `Meta`と`Lightweight2D`はシェーダーキーワードなし 57 | 58 | ## [7.x.x] 59 | - SubShaderのTagsが`"RenderPipeline" = "UniversalPipeline"`に変更された 60 | - LightModeで`LightweightForward`が`UniversalForward`に変更された 61 | - また、`Lightweight2D`が`Universal2D`に変更された 62 | 63 | ## [9.x.x] 64 | - multi_compile_instancingしているパスに`#pragma multi_compile _ DOTS_INSTANCING_ON`が追加された 65 | - SubShaderのTagsに`"ShaderModel"="4.5"`が追加され、DOTS Instancing非対応のプラットフォームではフォールバックされるようになった 66 | - `"ShaderModel"="4.5"`のシェーダーのLightModeに`UniversalGBuffer`が追加された 67 | 68 | `UniversalGBuffer`のシェーダーキーワード 69 | ```HLSL 70 | // ------------------------------------- 71 | // Universal Pipeline keywords 72 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS 73 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE 74 | #pragma multi_compile _ _SHADOWS_SOFT 75 | 76 | // ------------------------------------- 77 | // Unity defined keywords 78 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 79 | #pragma multi_compile _ LIGHTMAP_ON 80 | #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT 81 | 82 | //-------------------------------------- 83 | // GPU Instancing 84 | #pragma multi_compile_instancing 85 | ``` 86 | 87 | ## [10.x.x] 88 | - 一部がmulti_compile_fragmentになった 89 | - LightModeに`DepthNormals`が追加された(シェーダーキーワードはDepthOnlyと同じ) 90 | - `_MIXED_LIGHTING_SUBTRACTIVE`が削除され`_SCREEN_SPACE_OCCLUSION`と`LIGHTMAP_SHADOW_MIXING`と`SHADOWS_SHADOWMASK`が追加された 91 | 92 | `UniversalForward`のシェーダーキーワード 93 | ```HLSL 94 | // ------------------------------------- 95 | // Universal Pipeline keywords 96 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS 97 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE 98 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 99 | #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS 100 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 101 | #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION 102 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 103 | #pragma multi_compile _ SHADOWS_SHADOWMASK 104 | ``` 105 | 106 | `UniversalGBuffer`のシェーダーキーワード 107 | ```HLSL 108 | // ------------------------------------- 109 | // Universal Pipeline keywords 110 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS 111 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE 112 | #pragma multi_compile _ _SHADOWS_SOFT 113 | #pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE 114 | 115 | // ------------------------------------- 116 | // Unity defined keywords 117 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 118 | #pragma multi_compile _ LIGHTMAP_ON 119 | #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT 120 | ``` 121 | 122 | ## [11.x.x] 123 | - `_MAIN_LIGHT_SHADOWS_SCREEN`が追加された 124 | - `_MAIN_LIGHT_SHADOWS`と`_MAIN_LIGHT_SHADOWS_CASCADE`と`_MAIN_LIGHT_SHADOWS_SCREEN`がひとまとめになった 125 | - `ShadowCaster`に`_CASTING_PUNCTUAL_LIGHT_SHADOW`が追加された(ライトの種類に応じた切り分け用) 126 | 127 | `UniversalForward`のシェーダーキーワード 128 | ```HLSL 129 | // ------------------------------------- 130 | // Universal Pipeline keywords 131 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN 132 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 133 | #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS 134 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 135 | #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION 136 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 137 | #pragma multi_compile _ SHADOWS_SHADOWMASK 138 | ``` 139 | 140 | `ShadowCaster`のシェーダーキーワード 141 | ```HLSL 142 | // ------------------------------------- 143 | // Universal Pipeline keywords 144 | #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW 145 | ``` 146 | 147 | ## [12.x.x] 148 | - `_REFLECTION_PROBE_BLENDING`と`_REFLECTION_PROBE_BLENDING`の追加(Built-in RPにあったものと同じ?) 149 | - `_DBUFFER_MRT1`と`_DBUFFER_MRT2`と`_DBUFFER_MRT3`の追加(デカール) 150 | - `_LIGHT_LAYERS`の追加 151 | - `_LIGHT_COOKIES`の追加 152 | - `_CLUSTERED_RENDERING`の追加 153 | - `DEBUG_DISPLAY`の追加 154 | - `#pragma instancing_options renderinglayer`の追加 155 | 156 | `UniversalForward`のシェーダーキーワード 157 | ```HLSL 158 | // ------------------------------------- 159 | // Universal Pipeline keywords 160 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN 161 | #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 162 | #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS 163 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING 164 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION 165 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 166 | #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION 167 | #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 168 | #pragma multi_compile_fragment _ _LIGHT_LAYERS 169 | #pragma multi_compile_fragment _ _LIGHT_COOKIES 170 | #pragma multi_compile _ _CLUSTERED_RENDERING 171 | 172 | // ------------------------------------- 173 | // Unity defined keywords 174 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 175 | #pragma multi_compile _ SHADOWS_SHADOWMASK 176 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 177 | #pragma multi_compile _ LIGHTMAP_ON 178 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 179 | #pragma multi_compile_fog 180 | #pragma multi_compile_fragment _ DEBUG_DISPLAY 181 | 182 | //-------------------------------------- 183 | // GPU Instancing 184 | #pragma multi_compile_instancing 185 | #pragma instancing_options renderinglayer 186 | #pragma multi_compile _ DOTS_INSTANCING_ON 187 | ``` 188 | 189 | `UniversalGBuffer`のシェーダーキーワード 190 | ```HLSL 191 | // ------------------------------------- 192 | // Universal Pipeline keywords 193 | #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN 194 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING 195 | #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION 196 | #pragma multi_compile_fragment _ _SHADOWS_SOFT 197 | #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3 198 | #pragma multi_compile_fragment _ _LIGHT_LAYERS 199 | #pragma multi_compile_fragment _ _RENDER_PASS_ENABLED 200 | 201 | // ------------------------------------- 202 | // Unity defined keywords 203 | #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING 204 | #pragma multi_compile _ SHADOWS_SHADOWMASK 205 | #pragma multi_compile _ DIRLIGHTMAP_COMBINED 206 | #pragma multi_compile _ LIGHTMAP_ON 207 | #pragma multi_compile _ DYNAMICLIGHTMAP_ON 208 | #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT 209 | 210 | //-------------------------------------- 211 | // GPU Instancing 212 | #pragma multi_compile_instancing 213 | #pragma instancing_options renderinglayer 214 | #pragma multi_compile _ DOTS_INSTANCING_ON 215 | ``` -------------------------------------------------------------------------------- /Docs/ステンシルについて.md: -------------------------------------------------------------------------------- 1 | # ステンシルについて 2 | [Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/uwp/graphics-concepts/stencil-buffers)や[Unity マニュアル](https://docs.unity3d.com/ja/2019.4/Manual/SL-Stencil.html)にまとまっていますが、直感的にわかるようにまとめ直しています。 3 | 4 | 基本的にステンシル設定は `Ref` / `Comp` / `Pass` / `Render Queue` のみを調整すれば大抵の表現ができます。 5 | 6 | |名前|説明| 7 | |-|-| 8 | |Ref|ステンシル処理に使われるIDです。IDを元に描画する・しないを決定します。| 9 | |Comp|IDの比較の方法です。この条件を満たすときに描画されます。| 10 | |Pass|描画するときにIDを書き換えるかどうかの設定です。| 11 | |Render Queue|マテリアルを描画する順序を決める際に使われる数値です。大きいほど後に描画されます。| 12 | 13 | Refの数値については1や2のような値ではなく、82や143のような**ランダムな値を用いたほうが数値の被りによる描画不全を回避しやすく**オススメです。 14 | ここに掲載している設定例はわかりやすくするためシンプルな値を使っています。 15 | 16 | - **Comp** - 通常はAlwaysに設定し、一部分を切り抜きたいマテリアルではNotEqualかEqualに設定します。 17 | - **Pass** - 通常はKeep、切り抜く側(眉毛など)はReplaceに設定します。 18 | - **Render Queue** - 画面上に見えている状態ではなく描画処理が行われたかどうかでステンシルの書き込みが行われます。例えば、肌→顔パーツの順に描画される場合は肌の中に隠れている部分の描画がスキップされるため狙った通りの効果が得られますが、顔パーツ→肌の順に描画すると隠れていても描画がスキップされないため狙いと異なる結果になります。 19 | 20 | ここから先は具体的な設定例を紹介します。 21 | 22 | # 顔パーツを髪の上に描画 23 | 一般的に使われるオーソドックスなものです。 24 | 25 | |プロパティ|肌|顔パーツ|髪| 26 | |-|-|-|-| 27 | |Ref|0|1|1| 28 | |Comp|Always|Always|NotEqual| 29 | |Pass|Keep|Replace|Keep| 30 | |Render Queue|2450|2451|2452| 31 | 32 | 1. 肌が描画される 33 | 2. 顔パーツが描画され、その領域が`1`で置き換えられる 34 | 3. `1`ではない領域(顔パーツ以外のところ)に髪が描画される 35 | 36 | # 顔パーツを髪の上に半透明で描画 37 | [顔パーツを髪の上に描画](#顔パーツを髪の上に描画)に加えて、顔パーツの領域に半透明で髪を描画することで実現できます。 38 | 39 | |プロパティ|肌|顔パーツ|髪|髪(透過)| 40 | |-|-|-|-|-| 41 | |Ref|0|1|1|1| 42 | |Comp|Always|Always|NotEqual|Equal| 43 | |Pass|Keep|Replace|Keep|Keep| 44 | |Render Queue|2450|2451|2452|2460| 45 | 46 | 1. 肌が描画される 47 | 2. 顔パーツが描画され、その領域が`1`で置き換えられる 48 | 3. `1`ではない領域(顔パーツ以外のところ)に髪が描画される 49 | 4. `1`の領域(顔パーツのところ)に髪(透過)が描画される 50 | 51 | 52 | # 肌・顔パーツだけ透過する髪 53 | 通常は不透明マテリアルし、肌・顔パーツの上では透過マテリアルとして描画するテクニックです。 54 | 透過の重なりによる描画不全を回避します。 55 | 56 | |プロパティ|肌・顔パーツ|髪(不透明)|髪(透過)| 57 | |-|-|-|-| 58 | |Ref|1|1|1| 59 | |Comp|Always|NotEqual|Equal| 60 | |Pass|Replace|Keep|Keep| 61 | |Render Queue|2450|2451|2460| 62 | 63 | 1. 肌が描画され、その領域が`1`で置き換えられる 64 | 2. `1`ではない領域(肌以外のところ)に髪(不透明)が描画される 65 | 3. `1`の領域(肌のところ)に髪(透過)が描画される 66 | 67 | 68 | # 肌だけ透過する髪の上に半透明で描画される顔パーツ 69 | 70 | |プロパティ|肌|髪(不透明)|顔パーツ|髪(透過)|髪(透過2)| 71 | |-|-|-|-|-|-| 72 | |Ref|1|1|2|1|2| 73 | |Comp|Always|NotEqual|Always|Equal|Equal| 74 | |Pass|Replace|Keep|Replace|Keep|Keep| 75 | |Render Queue|2450|2451|2452|2460|2461| 76 | 77 | 1. 肌が描画され、その領域が`1`で置き換えられる 78 | 2. `1`ではない領域(肌以外のところ)に髪(不透明)が描画される 79 | 3. 顔パーツが描画され、その領域が`2`で置き換えられる 80 | 4. `1`の領域(肌のところ)に髪(透過)が描画される 81 | 5. `2`の領域(顔パーツのところ)に髪(透過2)が描画される 82 | 83 | 84 | # 肌の上だけに描画される照れ・髪影 85 | 86 | |プロパティ|肌|照れ・髪影| 87 | |-|-|-| 88 | |Ref|1|1| 89 | |Comp|Always|Equal| 90 | |Pass|Replace|Keep| 91 | |Render Queue|2450|2460| 92 | 93 | 1. 肌が描画され、その領域が`1`で置き換えられる 94 | 2. `1`の領域(肌のところ)に照れ・髪影が描画される 95 | 96 | # オブジェクトの縁だけに輪郭線を出す 97 | 98 | |プロパティ|本体|輪郭線| 99 | |-|-|-| 100 | |Ref|1|1| 101 | |Comp|Always|NotEqual| 102 | |Pass|Replace|Keep| 103 | 104 | 1. 本体が描画され、その領域が`1`で置き換えられる 105 | 2. `1`ではない領域(本体以外のところ)に輪郭線が描画される 106 | 107 | # レンズ越しでしか見えないオブジェクト 108 | 109 | |プロパティ|レンズ|オブジェクト| 110 | |-|-|-| 111 | |Ref|1|1| 112 | |Comp|Always|Equal| 113 | |Pass|Replace|Keep| 114 | |Render Queue|2450|2451| 115 | |ZWrite|Off|On| 116 | 117 | 1. レンズが描画され、その領域が`1`で置き換えられる 118 | 2. `1`の領域(レンズのところ)にオブジェクトが描画される 119 | 120 | オブジェクトのCompをNotEqualにすると"レンズ越しでは見えなくなるオブジェクト"を作れます。 -------------------------------------------------------------------------------- /Docs/ビルトインシェーダーの変遷.md: -------------------------------------------------------------------------------- 1 | # ビルトインシェーダーの変遷 2 | シェーダーはStandardとUnlitとParticleのみ、cginc系はほぼ全部記載しています(UI系はスルー)。 3 | 4 | ## 2018.4.36f1 -> 2019.4.39f1 5 | ### AutoLight.cginc 6 | `UNITY_SHADOW_W(_w)`でAPI周りに微変更 7 | 8 | ### HLSLSupport.cginc 9 | - API周りの変更 10 | - DXCがDX9方式のHLSL(sampler2Dやtex2Dなど)をサポートしなくなったため置き換えが入った 11 | - ShadowMapが`Texture2D_float`、`TextureCube_float`になった 12 | - `UNITY_SAMPLE_TEX2D_LOD(tex,coord,lod)`、`UNITY_SAMPLE_TEX2D_SAMPLER_LOD(tex,samplertex,coord,lod)`が追加された 13 | - `#define FACE VFACE`が削除 14 | 15 | ### UnityCG.cginc 16 | - `#define UNITY_HALF_MIN 6.103515625e-5`が追加 17 | - ディザのテクスチャ名が`_DitherMaskLOD2D`から`unity_DitherMask`に 18 | - `UnityApplyDitherCrossFade(float2 vpos)`に変更が入る 19 | 20 | ### UnityInstancing.cginc 21 | - `UnityObjectToClipPosODSInstanced(float3 inPos)`が追加 22 | - `UnityObjectToClipPosInstanced(in float3 pos)`に分岐が追加 23 | 24 | ### UnityRayTracingMeshUtils.cginc 25 | - 追加 26 | 27 | ### UnityShaderVariables.cginc 28 | - `UNITY_LIGHT_PROBE_PROXY_VOLUME`でAPI周りに微変更 29 | 30 | ### UnityStandardBRDF.cginc 31 | - `1e-4f`が`UNITY_HALF_MIN`に置き換えられる 32 | 33 | ### UnityStandardParticles.cginc 34 | - `int _DstBlend;`が追加 35 | - `fragParticleUnlit`のフォグ適用箇所に変更 36 | 37 | ### Unlit-Color.shader 38 | - `COLOR`を`SV_Target`に置き換え 39 | 40 | ### Particle系シェーダー 41 | - `UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);`が追加(_CameraDepthTextureを使用するため) 42 | 43 | ### Standard.shader 44 | - `_BumpMap`と`_DetailNormalMap`に`[Normal]`が追加 45 | - `shader_feature`が`shader_feature_local`化(`_EMISSION`だけlocal化されず) 46 | 47 | ### StandardShaderGUI.cs 48 | - RenderQueueの扱いに調整 49 | 50 | ## 2019.4.39f1 -> 2020.3.34f1 51 | ### AutoLight.cginc 52 | - `#define DIRECTIONAL`が`DIRECTIONAL 1`に 53 | 54 | ### HLSLSupport.cginc 55 | - `half`や`fixed`に調整 56 | - `UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)`の型が`sampler2D_float`に変更 57 | - Vulkan用の対応が追加(`UnityDisplayOrientationPreTransfor`) 58 | 59 | ### UnityCG.cginc 60 | - `UnpackNormal(fixed4 packednormal)`と`UnpackNormalWithScale(fixed4 packednormal, float scale)`にASTC対応が追加 61 | - `ComputeNonStereoScreenPos(float4 pos)`と`ComputeGrabScreenPos(float4 pos)`にVulkan用の対応が追加 62 | 63 | ### UnityInstancing.cginc 64 | - `UNITY_ACCESS_MERGED_INSTANCED_PROP(arr, var)`が追加 65 | - `unity_WorldToObject`のマクロに調整 66 | - `UnityLegacyTextureStack.cginc`が追加 67 | 68 | ### UnityRayTracingMeshUtils.cginc 69 | - かなり大幅な変更 70 | 71 | ### UnityShaderVariables.cginc 72 | - `SHADER_API_GLES3`で`UNITY_LIGHT_PROBE_PROXY_VOLUME`が1になるようになった 73 | 74 | ### UnityStandardParticles.cginc 75 | - `1e-10`が`1e-4`に 76 | 77 | ### UnityStandardUtils.cginc 78 | - `UnpackScaleNormalRGorAG(half4 packednormal, half bumpScale)`にASTC対応が追加 79 | 80 | ### その他 81 | - 一部`shader_feature_local`が`shader_feature_local_fragment`に 82 | 83 | ## 2020.3.34f1 -> 2021.3.2f1 84 | ### AutoLight.cginc 85 | - `TRANSFER_SHADOW_WPOS(a,wpos)`が追加 86 | 87 | ### HLSLSupport.cginc 88 | - `UNITY_COMPILER_DXC`対応が追加 89 | 90 | ### TerrainSplatmapCommon.cginc 91 | - `TERRAIN_USE_SEPARATE_VERTEX_SAMPLER`による分岐が追加 92 | 93 | ### TextCore_Properties.cginc 94 | - 追加 95 | 96 | ### TextCore_SDF_SSD.cginc 97 | - 追加 98 | 99 | ### UnityCG.cginc 100 | - `DecodeHDR(half4 data, half4 decodeInstructions, int colorspaceIsGamma)`が追加 101 | 102 | ### UnityIndirect.cginc 103 | - 追加 104 | 105 | ### UnityInstancing.cginc 106 | - `float stereoTargetEyeIndex : BLENDWEIGHT0`が`uint stereoTargetEyeIndex : BLENDINDICES0`になり、それに伴って`output.stereoTargetEyeIndex`の計算方法が変化 107 | - `float4x4 unity_PrevObjectToWorldArray`と`float4x4 unity_PrevWorldToObjectArray`が追加 108 | 109 | ### UnityLegacyTextureStack.cginc 110 | - `SamplerState _vt_cacheSampler_trilinear_clamp_aniso4;`が追加 111 | 112 | ### UnityRayTracingMeshUtils.cginc 113 | - 大幅な変更 114 | 115 | ### UnityShaderVariables.cginc 116 | - `unity_StereoEyeIndices[2]`が削除(`Single Pass Stereo`対応の削除) 117 | 118 | ### UnityStereoSupport.glslinc 119 | - `Single Pass Stereo`対応の削除 120 | 121 | ### Particle系シェーダー 122 | - `#pragma never_use_dxc`が追加 123 | 124 | ### StandardShaderGUI.cs 125 | - `MaterialChanged(Material material, WorkflowMode workflowMode, bool overrideRenderQueue)`の代わりに`ValidateMaterial(Material material)`が使われるように 126 | 127 | ## 2021.3.2f1 -> 2022.1.0f1 128 | ### HLSLSupport.cginc 129 | - `defined(SHADER_API_GLES) && defined(UNITY_ENABLE_NATIVE_SHADOW_LOOKUPS)`で`SHADOWS_NATIVE`がdefineされなくなった 130 | 131 | ### UnityCG.cginc 132 | - `DecodeHDR()`で`UNITY_USE_NATIVE_HDR`での分岐がなくなった 133 | 134 | ### StandardShaderGUI.cs 135 | - `EditorGUI.showMixedValue = blendMode.hasMixedValue`が`MaterialEditor.BeginProperty(blendMode)`に置き換え -------------------------------------------------------------------------------- /Docs/個別に書くほどでもない知見.md: -------------------------------------------------------------------------------- 1 | - スクリーンスペースのUVのオフセットをFOVやアスペクト比の変化に追従させる場合は`abs(UNITY_MATRIX_P._m00_m11)`を乗算するだけで良い 2 | - ジオメトリシェーダーは[instanceアトリビュート](https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/overviews-direct3d-11-hlsl-gs-instance)を加えて複数回実行できる 3 | - `#include_with_pragmas`を使うとinclude内にpragmaを書ける(Unity 2020.3以降) 4 | - `#pragma target 5.0 _KEYWORD`という書き方をすると指定したキーワードが有効なときだけtargetを変えられる 5 | - `PackageRequirements`を使うと指定のパッケージがある場合のみそのSubShaderがコンパイルされる 6 | - `CustomEditorForRenderPipeline`を使うとレンダーパイプラインごとにエディタを変えられる 7 | - inoutで複数の構造体を指定した関数は何故かコンパイルエラーが出ることがある 8 | - v2f構造体に2つ以上のnointerpolation変数を含むかつその2つの変数が16byte間隔になっていない、加えてVFACEセマンティクスを使うという条件で何故かコンパイルエラーが出る 9 | - `VFACE`の代わりに`SV_IsFrontFace`を使用できる(シェーダーAPIに注意) 10 | - `LinearEyeDepth()`はミラーなどのNearClipPlaneが垂直でない環境では使えない。正常に動作する代替の関数は以下の通り 11 | 12 | ```HLSL 13 | float lilLinearEyeDepth(float z, float2 positionCS) 14 | { 15 | if(UNITY_MATRIX_P._m20 != 0 && z == 0) return 1.0/0.0; 16 | float2 pos = positionCS / _ScreenParams.xy * 2.0 - 1.0; 17 | #if UNITY_UV_STARTS_AT_TOP 18 | pos.y = -pos.y; 19 | #endif 20 | return UNITY_MATRIX_P._m23 / (z + UNITY_MATRIX_P._m22 21 | - UNITY_MATRIX_P._m20 / UNITY_MATRIX_P._m00 * (pos.x + UNITY_MATRIX_P._m02) 22 | - UNITY_MATRIX_P._m21 / UNITY_MATRIX_P._m11 * (pos.y + UNITY_MATRIX_P._m12) 23 | ); 24 | } 25 | ``` 26 | 27 | - ForwardAddパスがないシェーダーはForwardBaseパスの頂点ライトにライトの情報が入ってくる 28 | - Alwaysパスではライトの情報が正しく取れない 29 | - `SV_Depth`でピクセル単位で深度を調整できる(POMやレイマーチング等に有効) 30 | - `SV_Coverage`でMSAAのレベルを確認できる(ピクセル全体が覆われている場合のみ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Shader-MEMO 2 | Unityでのシェーダー開発に関するメモです。VR対応やSRPへの対応、その他ハマりやすい部分などを残しておきます。 3 | 4 | ## [GrabTest.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/GrabTest.shader) 5 | VRでGrabPassを扱う際に壊れやすい部分をまとめています。シェーダー内のマクロを書き換えることで動作検証できます。既存のシェーダーを修正する場合は以下の通りです。 6 | - 特定の条件下で上下が逆になる 7 | `ComputeScreenPos()`を`ComputeGrabScreenPos()`に置き換えることで改善されます 8 | - 片目に両目の映像が映る 9 | UNITY_SINGLE_PASS_STEREOが宣言されているときにUV座標をx軸方向に0.5倍する必要があります。 10 | 修正例は以下の通り 11 | ``` 12 | #if defined(UNITY_SINGLE_PASS_STEREO) 13 | uv.x *= 0.5; 14 | #endif 15 | ``` 16 | - Unity 2020以降から灰色になる 17 | テクスチャを宣言している箇所を`UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)`、サンプリングしている箇所を`UNITY_SAMPLE_SCREENSPACE_TEXTURE(tex,uv)`に置き換えることで改善されます。 18 | 19 | ## [ビルトインシェーダーの変遷.md](https://github.com/lilxyzw/Shader-MEMO/blob/main/Docs/ビルトインシェーダーの変遷.md) 20 | [Unity download archive](https://unity3d.com/get-unity/download/archive)の`Built in shaders`の変遷をまとめました。 21 | 22 | ## [Universal Render Pipeline Litの変遷.md](https://github.com/lilxyzw/Shader-MEMO/blob/main/Docs/Universal%20Render%20Pipeline%20Litの変遷.md) / [HDRP Litの変遷.md](https://github.com/lilxyzw/Shader-MEMO/blob/main/Docs/HDRP%20Litの変遷.md) 23 | lilToonの開発に関わった箇所をまとめました。URP/HDRPのシェーダーを書けることが前提で、複数バージョンに対応させる際の資料です。流石に細かい変数・関数の変化までは追いきれておらず、シェーダーキーワードやLightModeなどざっくりした部分のみのまとめなので、各バージョンでテストしてエラーや不具合が出たらマクロで切り分ける必要があります。バージョンは`VERSION_GREATER_EQUAL(major, minor)`などのマクロで取れます。 24 | 25 | ## [SRPでのマルチパスシェーダー.md](https://github.com/lilxyzw/Shader-MEMO/blob/main/Docs/SRPでのマルチパスシェーダー.md) 26 | SRPではマルチパスシェーダーの作成に制限がありますが、シェーダーのLightModeタグを複数組み合わせることでパイプラインの改造無しで擬似的に作成できます。 27 | 28 | ## [SHLightTester.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/SHLightTester.shader) 29 | SHライトの挙動や原理確認用のシェーダーです。通常はShadeSH9に法線を渡すだけで良いため詳しく理解する必要がないですが、トゥーンシェーダーではSHライトの陰影を付けたくない場合が多いためそのまま扱えません。そこで原理を知っておくことでSHライトをどうデフォルメするかを考える材料になるかもしれません。 30 | 31 | ## [GeomTest.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/GeomTest.shader) 32 | ジオメトリシェーダーを使って1パスでアウトラインを描画したら逆に負荷が高くなったので色々テストしてみたシェーダーです。結論としては本体->アウトラインの順に描画していたためZTestが効き、アウトライン側のピクセルシェーダーの負荷が抑えられたことが大きそうでした。ここではGPU負荷のみ検証しているのと、(特にモバイルでは)環境による差がある可能性もあるため、実際の環境でテストして確認してください。適当なテクスチャを入れたマテリアルを作成してCubeメッシュに適用し、Profilerで測定した結果は以下の通りです。 33 | - ジオメトリシェーダー方式: 0.11ms 34 | - 2パス(アウトライン->本体): 0.16ms 35 | - 2パス(本体->アウトライン): 0.06ms 36 | - 本体のみ(ジオメトリシェーダー使用): 0.05ms 37 | - 本体のみ: 0.05ms 38 | 39 | 約56000 tris、SetPass Calls 4(アウトラインを含めると8)のキャラクターモデルをカメラを1.5m程離して測定した結果は以下の通りです。 40 | - ジオメトリシェーダー方式: 0.31ms 41 | - 2パス(アウトライン->本体): 0.36ms 42 | - 2パス(本体->アウトライン): 0.26ms 43 | - 本体のみ(ジオメトリシェーダー使用): 0.19ms 44 | - 本体のみ: 0.18ms 45 | 46 | 100m程離れ、ほぼピクセルシェーダーが実行されないような状態では以下の通りです。ピクセルシェーダー程ではありませんが、ジオメトリシェーダーもある程度負荷に影響があります。 47 | - ジオメトリシェーダー方式: 0.08ms 48 | - 2パス(アウトライン->本体): 0.03ms 49 | - 2パス(本体->アウトライン): 0.03ms 50 | - 本体のみ(ジオメトリシェーダー使用): 0.05ms 51 | - 本体のみ: 0.01ms 52 | 53 | ## [ステンシルについて.md](https://github.com/lilxyzw/Shader-MEMO/blob/main/Docs/ステンシルについて.md) 54 | ステンシルについての簡単な解説です。 55 | 56 | ## [SPSITest.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/SPSITest.shader) 57 | SPS-I(Single-Pass Stereo Instanced)対応についてまとめました。 58 | 59 | ## [84-Shader__VR Unlit Shader-NewUnlitShader.shader.txt](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/ScriptTemplates/84-Shader__VR%20Unlit%20Shader-NewUnlitShader.shader.txt) 60 | 新規作成したUnlit ShaderはSPS-I環境ではうまく動作せず書き換えが必要になります。そこで、SPS-I対応済みのUnlit Shaderのテンプレートを作りました。以下の手順で導入できます。 61 | 1. `Assets`直下に`ScriptTemplates`フォルダを作成 62 | 2. `ScriptTemplates`内にこのtxtファイルを配置 63 | 3. Unityを再起動 64 | 4. `Create - Shader - VR Unlit Shader`でこのテンプレートから作成可能になる 65 | 66 | ## [StencilChecker.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/StencilChecker.shader) 67 | ステンシルバッファを可視化します。 68 | 69 | ## [DepthTex2PosWS.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/DepthTex2PosWS.shader) 70 | `_CameraDepthTexture`と`SV_POSITION`からワールド座標を復元するシェーダーです。 71 | 72 | ## [CustomSampler.shader](https://github.com/lilxyzw/Shader-MEMO/blob/main/Assets/CustomSampler.shader) 73 | `Texture2D.Sample()`を再実装したものです。 --------------------------------------------------------------------------------