本日はMRTKShader枠です。
MRTKではMRTKStandardShaderと呼ばれる非常に多機能なUberShader(使用する機能のみコンパイルされるShader)が提供されています。
ところが、このShaderはUnityのURPプロジェクトでは使用することができません。そこでShaderの勉強もかねてMRTKStandardShaderをShaderGraphで再現します。
〇ShaderGraphとは?
ShaderGraphはUnityのスクリプタブルレンダーパイプラインで使用可能なShader構築環境でそれまでのコードベースではなくノードベースでShaderを作成することができます。
〇環境
・Unity 2021.1.0f1
・Universal RP v11.0.0
・ShaderGraph 11.0.0
〇テクスチャ
今回はテクスチャを設定します。
‘‘‘ Shader "Custom/MRTKStandardShaderResearch" { Properties { // Main maps. Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) //追加 MainTex("Albedo", 2D) = "white" {} }
SubShader
{
Pass { Name "Main" Tags{ "RenderType" = "Opaque" "LightMode" = "ForwardBase" } LOD 100
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityStandardConfig.cginc"
#include "UnityStandardUtils.cginc"
#include "MixedRealityShaderUtils.cginc"
struct appdata_t
{
float4 vertex : POSITION;
//追加
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 position : SV_POSITION;
//追加
float2 uv : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
fixed4 _Color;
//追加
sampler2D _MainTex;
v2f vert(appdata_t v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
float4 vertexPosition = v.vertex;
//追加
o.uv = v.uv;
o.position = UnityObjectToClipPos(vertexPosition);
return o;
}
fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
{
//追加
fixed4 albedo = tex2D(_MainTex, i.uv);
albedo *= _Color;
fixed4 output = albedo;
return output;
}
ENDCG
}
}
Fallback "Hidden/InternalErrorShader"
// CustomEditor "Microsoft.MixedReality.Toolkit.Editor.MixedRealityStandardShaderGUI" } ‘‘‘
①プロジェクトウィンドウから[Create]、[Shader]、[Univarsal RenderPipeline]から[LitGraph]を選択します。
[f:id:Holomoto-Sumire:20210515150428j:plain]
プロジェクトウィンドウに新しいShaderGraphが作成されます。 今回[MRTKShader]とテスト用のマテリアルを作成しました。
[f:id:Holomoto-Sumire:20210515150944j:plain]
②MRTKShaderのGraphを開きます。
[f:id:Holomoto-Sumire:20210515151125j:plain]
③テクスチャのノードを作成します。右クリックの[CreateNode]から[Sample Texture 2D]を選択します。
[f:id:Holomoto-Sumire:20210515151418j:plain]
[Sample Texture 2D]の[RGBA(4)]をマスターノードの[Fragment]の[Color]に接続します。
[f:id:Holomoto-Sumire:20210515151746j:plain]
これによって画像を使用できるようになりました。
[f:id:Holomoto-Sumire:20210515152028j:plain]
マスターノードの[Fragment]はShaderコードのフラグメントシェーダー部分に相当します。
fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target { //追加 fixed4 albedo = tex2D(_MainTex, i.uv); albedo *= _Color; fixed4 output = albedo; return output; }
今回はテクスチャを指す albedoに _Colorでメインカラーが積算されています。
これをShaderGraphで表すと次のようになります。
Input同士を積算する[Multiply]ノードとMainColorを接続し最終的にColorに渡しています。
以上でMRTKStandardShaderのテクスチャを扱う代替えShaderができました。
今後も引き続き実装していきます。