着色器中的统一边框宽度,忽略视图距离

时间:2018-10-23 13:35:43

标签: unity3d glsl shader mesh

我有一个2d网格(所有顶点的z坐标均为0)。我使用网格法线创建线边界。因此,每个法线都在网格内部。
着色器使用2次传递。第一次通过时,全网格以黑色绘制。然后在第二遍绘制内部网格。看起来不错,但是当我缩放线宽时也可以缩放,但是我希望它保持恒定。

image 1

image 2

我要使线宽保持恒定。我尝试使用fwidth,但没有结果。这是着色器代码

Shader "Custom/Outline" {
 Properties
 {
     _Color("Color", Color) = (1, 1, 1, 1)
     _OutlineExtrusion("Outline Extrusion", float) = 0
 }

 SubShader
 {    
     //inner polygon
     Pass
     {                            
         Blend SrcAlpha OneMinusSrcAlpha      
         Stencil
         {
             Ref 4
             Pass replace
         }

         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag

         // Properties
         uniform float _OutlineExtrusion;

         struct vertexInput
         {
             float4 vertex : POSITION;
             float3 normal : NORMAL;
             float4 color : COLOR;
         };

         struct vertexOutput
         {
             float4 pos : SV_POSITION;
             float4 color : COLOR;
         };

         vertexOutput vert(vertexInput input)
         {
             vertexOutput output;

             float4 newPos = input.vertex;

             float3 normal = normalize(input.normal);
             newPos += float4(normal, 0.0) * _OutlineExtrusion;

             output.pos = UnityObjectToClipPos(newPos);

             output.color = input.color;

             return output;
         }

         float4 frag(vertexOutput input) : COLOR
         {
             return input.color;
         }

         ENDCG
     }

     //bigger polygon
     Pass
     {
         Stencil
         {
             Ref 4
             Comp notequal
         }
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag

         float4 _Color;

         struct vertexInput
         {
             float4 vertex : POSITION;
         };

         struct vertexOutput
         {
             float4 pos : SV_POSITION;
         };

         vertexOutput vert(vertexInput input)
         {
             vertexOutput output;

             output.pos = UnityObjectToClipPos(input.vertex);

             return output;
         }

         float4 frag(vertexOutput input) : COLOR
         {
             return _Color;
         }

         ENDCG
     }

 }

}

0 个答案:

没有答案