unity模型法线可视化shader

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Custom/ShowNormals"
{
	Properties
	{
		_LineLength("LineLength",float) = 0.03
		_LineColor("LineColor",COLOR) = (1,0,0,1)
	}
		SubShader
	{
		Pass
		{
			Tags { "RenderType" = "Opaque" }
			LOD 200

			CGPROGRAM
				#pragma target 5.0
				#pragma vertex VS_Main
				#pragma fragment FS_Main
				#pragma geometry GS_Main
				#include "UnityCG.cginc" 

				float _LineLength;
				fixed4 _LineColor;
				

				struct GS_INPUT
				{
					float4    pos       : POSITION;
					float3    normal    : NORMAL;
					float2  tex0		: TEXCOORD0;
				};
				struct FS_INPUT
				{
					float4    pos       : POSITION;
					float2  tex0		: TEXCOORD0;
				};
				//step1
				GS_INPUT VS_Main(appdata_base v)
				{
					GS_INPUT output = (GS_INPUT)0;
					output.pos = mul(unity_ObjectToWorld, v.vertex);
					//output.pos = UnityObjectToClipPos(v.vertex);
					output.normal = v.normal;
					//float4 viewNormal = mul(UNITY_MATRIX_IT_MV, float4(v.normal, 0));
					float3 worldNormal = UnityObjectToWorldNormal(v.normal);
					output.normal = normalize(worldNormal);
					output.tex0 = float2(0, 0);
					return output;
				}
				[maxvertexcount(4)]
				void GS_Main(point GS_INPUT p[1], inout LineStream<FS_INPUT> triStream)
				{
					FS_INPUT pIn;
					pIn.pos =mul(UNITY_MATRIX_VP, p[0].pos);// UnityObjectToClipPos(p[0].pos);
					pIn.tex0 = float2(0.0f, 0.0f);
					triStream.Append(pIn);
					FS_INPUT pIn1;
					float4 pos= p[0].pos + float4(p[0].normal,0) *_LineLength;
					pIn1.pos = mul(UNITY_MATRIX_VP, pos);
					pIn1.tex0 = float2(0.0f, 0.0f);
					triStream.Append(pIn1);

				}

				//step3
				fixed4 FS_Main(FS_INPUT input) : COLOR
				{
					return _LineColor;
				}
			ENDCG
		}
	}
}

  新建一个Material,选择此shader渲染,然后再要使用的物体上新增加一个Material,把此Material赋值给物体,就可以了,如果不显示,可自行调整shader,实现方法是几何着色器画线。效果如下:

 

posted on 2019-08-15 17:10  stigerzergold  阅读(3973)  评论(0编辑  收藏  举报

导航