【问题标题】:Not getting uniform thickness in wireframe shader线框着色器的厚度不均匀
【发布时间】:2017-06-22 10:08:42
【问题描述】:
Shader "Custom/Geometry/Wireframe"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _WireframeVal ("Wireframe width", Range(0.000, 0.035)) = 0.05
        _Color ("color", color) = (1, 1, 1, 1)
        _BackColor ("Back color", color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Glowable" = "True" }


        Pass
        {
            Cull Back
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma geometry geom
            #include "UnityCG.cginc"

            struct v2g {
                float4 pos : SV_POSITION;
            };

            struct g2f {
                float4 pos : SV_POSITION;
                float3 center : TEXCOORD0;
            };

            v2g vert(appdata_base v) {
                v2g o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                return o;
            }


            [maxvertexcount(3)]
            void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {

                float2 p0 = IN[0].pos.xy / IN[0].pos.w;
                float2 p1 = IN[1].pos.xy / IN[1].pos.w;
                float2 p2 = IN[2].pos.xy / IN[2].pos.w;

                float2 edge0 = p1 - p0;
                float2 edge1 = p2 - p1;
                float2 edge2 = p0 - p2;

                float area = abs(edge1.x * edge2.y - edge1.y * edge2.x);

                g2f o;
                o.pos = IN[0].pos;
                o.center = float3(area/length(edge1)  , 0, 0);
                triStream.Append(o);
                o.pos = IN[1].pos;
                o.center = float3(0, 0, area/length(edge2) );
                triStream.Append(o);
                o.pos = IN[2].pos;
                o.center = float3(0, area/length(edge0), 0);
                triStream.Append(o);
            }

            float _WireframeVal;
            fixed4 _BackColor;
            float4 _Color;

            fixed4 frag(g2f i) : SV_Target 
            {

                if(min(i.center.x ,(min(i.center.y,i.center.z))) > _WireframeVal)
                {
                    discard;
                }
                return _BackColor;

            }

            ENDCG
        }


    }
}

这是我的线框着色器代码 我没有得到统一的边缘


此外,当我将宽度几乎减小到零 (0.0001) 时,一些像素的线没有被绘制出来,我该怎么办?我想将线框着色器作为统一构建的线框模式制作,我该如何实现?

【问题讨论】:

    标签: unity3d graphics shader fragment-shader


    【解决方案1】:

    其实那均匀的厚度。由于对象的绘制方式,您只是在考虑在这种情况下“厚度”是什么。

    在面向相机的立方体边缘,看起来它比其他边缘厚。嗯,你说对了一半。那里更多的白色像素被绘制。

    但原因是那里有两条边!每一个都为线框的厚度贡献了所需的值。

    两个蓝色轮廓面红色轮廓面都有助于该边缘的厚度,而在相邻面指向远离相机的角落(例如,蓝色轮廓面的底部边缘),只有 一个 面有助于整体效果。

    当厚度非常小或非常远时(因为 0.2 像素 + 0.2 像素 = 0.4 像素,四舍五入:1 像素),这并不明显,但在较高的厚度值时会变得明显,或者如果您不均匀缩放对象。例如,我在几周前正在做的一个项目中有这个(请注意,我的也绘制了背面,并且 alpha 深度排序已关闭):

    这样做的原因是因为“边”的位置是通过计算三角形的重心坐标来完成的,这只是一个近似值,如果三角形不是等边的,则会给出倾斜的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多