モチベーションと目標
前回に書いた通り,GLSLは諦めてCg/HLSLに移行することにしました.今回の目標は『以前にGLSLで実装した内容をCg/HLSL用に書き換える』です.
http://mugichoko.hatenablog.com/entry/2019/02/12/091328mugichoko.hatenablog.com
C#スクリプト
ここで書いたC#スクリプトと同じなので再利用できます.
Cg/HLSLコード
ほぼGLSLのコードと同じです.ちなみに,『Alan ZucconiさんのVertex and fragment shaders in Unity3D』のサイトを参考にして書き換えていきました.
GLSL版との主な相違点は以下の通りです.
- 9~10行目
#pragma
で対象となるShaderの種類を明記して,関数名を決めておく - 12~22行目 Vertex ShaderとFragment Shaderに入出力するデータの形式をあらかじめ明記しておく
得られる結果は同じなので,省略します.
Shader "Custom/TextureMappingShader" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct vsIn { float4 position : POSITION; float4 texCoord : TEXCOORD0; }; struct fsIn { float4 position : SV_POSITION; float4 texCoord : TEXCOORD0; }; fsIn vert(vsIn input) { fsIn o; o.texCoord = input.texCoord; o.position = UnityObjectToClipPos(input.position); return o; } uniform sampler2D texSampler; half4 frag(fsIn input) : COLOR { return tex2D(texSampler, input.texCoord.xy); } ENDCG } } }
追記
以下のように,Pass
を後ろに回す書き方もありとのこと.
Shader "Custom/TextureMappingShader" { SubShader { CGINCLUDE struct vsIn { float4 position : POSITION; float4 texCoord : TEXCOORD0; }; struct fsIn { float4 position : SV_POSITION; float4 texCoord : TEXCOORD0; }; fsIn vert(vsIn input) { fsIn o; o.texCoord = input.texCoord; o.position = UnityObjectToClipPos(input.position); return o; } uniform sampler2D texSampler; half4 frag(fsIn input) : COLOR { return tex2D(texSampler, input.texCoord.xy); } ENDCG Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } }