如何编写可在Unity中平滑导入的地理法线的着色器?

时间:2019-05-22 08:43:56

标签: unity3d fragment-shader vertex-shader shaderlab

在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
}

0 个答案:

没有答案