前提・実現したいこと
シェーダーでモデルの法線を全て同じ方向に向け、インスペクタから操作しようとしているのですが、
どうにも狙った結果が得られません。
シェーダーのプロパティで用意した3つの変数
_NormalX
_NormalY
_NormalZ
をフラグメントシェーダーでnormalに直接代入して法線とする
i.normal = (_NormalX, _NormalY, _NormalZ);
法線の向きは全て同じになっているようなのですが
値を変えて見た目に変化が起きるのは_NormalZだけで、
_NormalX、_NormalYを変えても何も見た目に変化が起きません。
3つの値を変える事で自由に法線を操作したいと考えております。
御教示のほど、よろしくお願いいたします。
該当のソースコード
Shader "Custom/TestShader" { Properties { _MainTex("MainTex", 2D) = "white" {} _NormalX("_NormalX", Range(-1, 1)) = 0 _NormalY("_NormalY", Range(-1, 1)) = 0 _NormalZ("_NormalZ", Range(-1, 1)) = 0 } SubShader { Tags { "Queue" = "Geometry" "RenderType" = "Opaque" } Pass { Tags { "LightMode" = "ForwardBase" } CGPROGRAM #include "UnityCG.cginc" #include "AutoLight.cginc" sampler2D _MainTex; float _NormalX; float _NormalY; float _NormalZ; #pragma target 5.0 #pragma vertex vert #pragma fragment frag struct vertex_input { float4 pos : POSITION; half3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct vertex_output { float4 pos : SV_POSITION; half3 normal: NORMAL; float2 uv : TEXCOORD0; }; //頂点シェーダ vertex_output vert(vertex_input i) { vertex_output re; re.uv = i.uv; re.pos = UnityObjectToClipPos(i.pos); re.normal = UnityObjectToWorldNormal(i.normal); return re; } //フラグメントシェーダ fixed4 frag(vertex_output i) : SV_Target { fixed4 re; re = tex2D(_MainTex, i.uv); i.normal = (_NormalX, _NormalY, _NormalZ); half d = dot(i.normal , normalize(_WorldSpaceLightPos0.xyz)); re *= d; return re; } ENDCG } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/09 11:20