在Unity中编码了一些着色器。我正在使用大纲功能制作一个,我以本教程vid中的信息为基础:https://www.youtube.com/watch?v=pMq--FUR5VE
下面是代码的提纲传递。在此过程中,它基本上只是根据_OutlineThickness值将对象的每个顶点推出,从而使该过程中的对象更大。然后,使用“ Cull Front”仅渲染后部部分将使轮廓变得很有趣。
现在一切正常。但是我注意到,在具有硬边的geo上,轮廓看起来好像不对,因此我始终需要在建模时仅制作软边。但是现在,我发现我想保留着色器主遍的硬边,而只想柔化轮廓遍的边。
考虑一些可以平均化地理法线但仅在“轮廓”通道中的代码。也许像“ Cull Front”之类的东西只会剔除Outline通道。
Pass {
Name "OUTLINE"
Tags{ "RenderType" = "Opaque" }
Cull Front
CGPROGRAM
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
half4 _OutlineColor;
half _OutlineThickness;
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 color : COLOR;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex + normalize(v.normal)*((_OutlineThickness * v.color) / 100));
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return _OutlineColor;
}
ENDCG
}