本日はShader学習枠です。
6月より取り組んでいるMixedRealityGraphicsTools(MRGT)のメインとなるGraphicsToolsStandardShader(MRGTStandardShader)ではUnityのレンダーパイプラインであるURPだけでなくビルドイン両方で、ユーザーはパラメータを一切変えることなくShaderを使うことができました。
今回はこの仕組みを使い独自のシェーダーを実装していきます。
○URPとビルドインで処理を分けるシェーダー
今回は次のコードを描きました
Shader "Unlit/URPBuildInTest"
{
SubShader
{
PackageRequirements
{
"com.unity.render-pipelines.universal": "10.6.0"
}
Tags
{
"RenderPipeline" = "UniversalPipeline"
"RenderType" = "Opaque"
}
// Default pass (only pass outside of the editor).
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
//Lighting.hlslがライト情報を格納するコアpackage
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"
struct appdata_t
{
float4 vertex:POSITION;
float2 uv : TEXCOORD0;
half3 normal: NORMAL;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float3 normalWS : TEXCOORD1;
};
v2f vert (appdata_t v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex);
//面の法線を取得、ライトの当たる向きを計算
VertexNormalInputs normal = GetVertexNormalInputs(v.normal);
o.normalWS = normal.normalWS;
return o;
}
float4 frag(v2f i):SV_TARGET
{
//Light.hlslで提供されるUnityのライトを取得する関数
Light lt = GetMainLight();
float4 col = (1,1,1,1);
//ライトの向きを計算
float strength = dot(lt.direction, i.normalWS);
float4 lightColor = float4(lt.color, 1);
return col* lightColor*strength;
}
ENDHLSL
}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex:SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
float4 frag(v2f i):SV_Target{
float4 col =float4(0,1,0,1);
return col;
}
ENDCG
}
}
}
○PackageRequirements
PackageRequirementsブロックはShaderLab内でそのシェーダーが実行対象となるために必要となる機能を記述します。
今回の場合パッケージバージョン指定でURPのパッケージを指定しています。
PackageRequirements
{
"com.unity.render-pipelines.universal": "10.6.0"
}
これによって一つ目のSubShaderはURP専用となり、ビルドインでは動かなくなります。
ビルドインでは次に記述されているSubShaderのほうが読み込まれるためビルドインも正常に描画されます。
今回は一つ目のURP用のSubShaderの処理でライトの処理、2つ目のビルドイン用の処理でUnlitの緑色になるように処理を記述しているためUnityエディタ上でも想定通りに動いていることを確認できました。


本日は以上です。