先日、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にはサーフェスシェーダはありません。 ↩