本日はMRTKのShader学習枠です。
MRTKにはHoloLensなどのMxiedRealityデバイスに特化したShaderが提供されています。
前回はShaderとして機能する最低限の構成まで削減して仕組みを見ました。
引き続き中身を見ていきます。
今回はテクスチャを使用できるようにします。
〇テクスチャを使用する。
テクスチャを扱うためにPropertiesに_MainTexの一文を加えます。
Properties { // Main maps. _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) _MainTex("Albedo", 2D) = "white" {} }
また_MainTexの型をCg/HLSL内部(CGPROGRAM ~ ENDCG)でも宣言します。
sampler2D _MainTex;
このままでは画像をどこに貼っていいのかわからないのでメッシュの持っているUV座標に対して貼るように処理を行います。
appdata_t構造体でuvを宣言します。
struct appdata_t { float4 vertex : POSITION; //追加 float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID };
次に頂点シェーダーにuvが渡されるので処理を行います。
appdata_tのuvの情報をv2fのuvに渡しています。
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; }
v2f構造体では頂点シェーダーからの結果を受け取り、フラグメントシェーダーに渡します。
struct v2f { float4 position : SV_POSITION; //追加 float2 uv : TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO };
uvを追加しています。
最後にフラグメントシェーダーで処理が行われます。
albedoとしてuvの位置に_MainTexを配置します。
albedoに_Colorが加算されることで色味を変えることができるようになっています。
fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target { //追加 fixed4 albedo = tex2D(_MainTex, i.uv); albedo *= _Color; fixed4 output = albedo; return output; }
この結果がoutputで返されピクセル色として描画されます。
以上でテクスチャを使用できるようになりました。
画像右がMRTKStandardShader、左が今回テクスチャを使用できるようにしたMRTKStandardResearchです。MRTKStandardResearchShaderは光に関して処理を行っていないためUnlitなShaderになっています。(影が付かない)
〇Shader全体
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. 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" }