显示顶点法线,切线的shader
顶点法线:垂直于顶点所在三角网格平面的向量
顶点切线:平行于顶点所在三角网格平面的向量
效果图
注意:这个shader在intel集成显卡上貌似显示不出来,在nVidia的显卡上可以显示出来
Shader "Unlit/showNormalTagent" { Properties { _LineLength("LineLength", float) = 0.03 } SubShader { Pass { Tags { "RenderType" = "Opaque" } LOD 100 CGPROGRAM #pragma vertex vert //顶点着色器函数名 #pragma fragment frag //片元着色器函数名 #pragma geometry geom //几何着色器函数名 #include "UnityCG.cginc" float _LineLength; struct geomInput { float4 worldPos : POSITION; float3 normal : NORMAL; float3 tangent : TANGENT; float2 tex0 : TEXCOORD0; }; struct fragInput { float4 pos : SV_POSITION; float2 tex0 : TEXCOORD0; fixed4 color : COLOR; }; geomInput vert(appdata_tan v) { geomInput output = (geomInput)0; output.worldPos = mul(unity_ObjectToWorld, v.vertex); float3 worldNormal = UnityObjectToWorldNormal(v.normal); output.normal = normalize(worldNormal); float3 worldTan = UnityObjectToWorldDir(v.tangent); output.tangent = normalize(worldTan); output.tex0 = float2(0, 0); return output; } [maxvertexcount(4)] void geom(point geomInput p[1], inout LineStream<fragInput> triStream) { fragInput pIn; //法线起点 pIn.pos = mul(UNITY_MATRIX_VP, p[0].worldPos); //裁剪空间 pIn.tex0 = float2(0.0f, 0.0f); pIn.color = fixed4(1, 0, 0, 1); triStream.Append(pIn); fragInput pIn1; //法线终点 float4 pos = p[0].worldPos + float4(p[0].normal, 0) *_LineLength; pIn1.pos = mul(UNITY_MATRIX_VP, pos); pIn1.tex0 = float2(0.0f, 0.0f); pIn1.color = fixed4(0, 1, 0, 1); triStream.Append(pIn1); triStream.Append(pIn); //切线起点 fragInput pIn4; //切线终点 pos = p[0].worldPos + float4(p[0].tangent, 0) * _LineLength; pIn4.pos = mul(UNITY_MATRIX_VP, pos); pIn4.tex0 = float2(0.0f, 0.0f); pIn4.color = fixed4(0, 0, 1, 1); triStream.Append(pIn4); } fixed4 frag(fragInput input) : SV_TARGET { return input.color; } ENDCG } //end of Pass } //end of SubShader } //end of shader
参考
【unity shader】几何着色器初接触_仁界的博客-CSDN博客_unity 几何着色器
unity模型法线可视化shader - stigerzergold - 博客园 (cnblogs.com)