先日、URPで実装していたシェーダーのコードを改めてBRPで実装しなおすということがありました。最近ググって出てくるコードはURPが多くなってきていますが、BRPとの対応表みたいなものが意外に見つからず苦労しましたので、メモしておきます。
すべての関数には対応できていないので、代表的なものになります。
また、新しいURPでの対応はまだ確認できておりません。
includeする関数の違い
デフォルトでシェーダーを作るとインクルードされていると思いますが、念のため記載します。
| - | BRP | URP |
|---|---|---|
| コア機能 | Unity.cginc | Package/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl |
| ライト | AutoLight.cginc | Package/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl |
| 影 | Unity.cginc | Package/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl |
| サーフェスシェーダ | Lighting.cginc | なし1 |
- その他一般的なURPには、SpaceTranform.hlsl, ShaderVariablesFunctions.hlsl, input.hlsl, Color.hlsl, DeclareDepthTtexture.hlsl, DeclareOpaqureTexture.hlslが含まれます。
- Core.hlslは直接参照できますが、UnityInput.hlsl, UnityInstancing.hlsl, SpaceTranforms.hlslは再定義を防ぐためにプレフィックスをつける必要があります。
関数の対応表
| BRP | URP |
|---|---|
| TRANSFORM_TEX(uv, texure_name) | TRANSFORM_TEX(uv, texure_name) |
| tex2D, tex2Dlod | SAMPLE_TEXTURE2D, SAMPLE_TEXTURE2D_LODなど。 |
| UnityObjectToClipPos(positionOS) | TransformObjectToHClip(positionOS), GetVertexPositionInputs().positionCS |
| UnityObjectToWorldNormal(normalOS) | TransformObjectToWorldNormal(normalOS), GetVertexNormalInputs().normalWS |
| ComputeScreenPos(positionCS) | ComputeScreenPos(positionCS), GetVertexPositionInputs().positionNDC |
| ComputeScreenPos(positionCS) | GetVertexPositionInputs().positionNDC |
| ComputeGrabScreenPos(positionCS) | URPではGrabPassをサポートしません。 |
| WorldSpaceViewDir(positionOS) | - |
| UnityWorldSpaceViewDir(positionWS) | GetWorldSpaceNormalizeViewDir(positionWS) |
| WorldSpaceLightDir(positionOS) | - |
| UnityWorldSpaceLightDir(positionWS)/ _WorldSpaceLightPos0 |
GetMainLight().direction |
| WorldSpaceLightDir(positionOS) | - |
| Shade4PointLights(...) | - |
| ShadeVertexLights(vertex, normal) | VertexLighting(positionWS, normalWS) |
| ShadeSH9(half4(worldNormal,1)) | SampleSH(normalWS), |
| UNITY_FOG_COORDS(n) | float fogFactor : TEXCOORDn |
| UNITY_TRANSFER_FOG(o, positionCS) | OUT.fogFactor = ComputeFogFactor(positionCS.z) |
| UNITY_APPLY_FOG(fogCoord, color, fogColor) | color.rgb = MixFog(color.rgb, fogCoord) |
| UNITY_APPLY_FOG_COLOR(fogCoord, color) | color.rgb = MixFogColor(color.rgb, fogColor.rgb, fogCoord) |
| Linear01Depth(z) | Linear01Depth(z, _ZBufferParams) |
| LinearEyeDepth(z) | LinearEyeDepth(z, _ZBufferParams) |
| ParallaxOffset(h, height, viewDirTS) | ParallaxOffset1Step(h, amplitude, viewDirTS) |
| Luminance(rgb) | Luminance(rgb) |
| V2F_SHADOW_CASTER | float4 positionCS : SV_POSITION; |
| TRANSFER_SHADOW_CASTER_NORMALOFFSET | ShadowCasterPass.hlslGetShadowPositionHClip(input) |
| SHADOW_CASTER_FRAGMENT | - |
| SHADOW_COORDS(1) | float4 shadowCoord : TEXCOORD1; |
| TRANSFER_SHADOW(o) | TransformWorldToShadowCoord(inputData.positionWS) |
| SHADOW_ATTENUATION(i) | MainLightRealtimeShadow(shadowCoord), |
参考
-
URPにはサーフェスシェーダはありません。 ↩