具有固定单元格大小的统一网格着色器

问题描述 投票:0回答:0

我正在开发一个网格着色器,无论游戏对象的形状如何,其网格单元格的大小应始终完全相同。例如,如果将着色器应用于具有不同缩放比例的两个立方体,网格的单元格仍应具有相同的大小(与以下屏幕截图中显示的当前着色器不同)。 Current shader whose cells change when scaling the gameobject

我已经尝试使用世界空间,但无法获得有效的结果。我对着色器编程也很陌生,所以非常感谢任何帮助。

Shader "Unlit/ProceduralGrid"
{
    Properties
    {
        _LineColor("Line Color", Color) = (1,1,1,1)
        _BGColor("Background Color", Color) = (0,0,0,0)
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _GridSize("Grid Size", Range(1,100)) = 5
        _LineThickness("Line Thickness", Range(0,1)) = 0.05
    }

        SubShader
        {
            Tags {"Queue" = "Transparent" "RenderType" = "Transparent" }
            LOD 100

            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                struct appdata
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                };

                struct v2f
                {
                    float2 uv : TEXCOORD0;
                    float4 vertex : SV_POSITION;
                };

                half _Glossiness = 0.0;
                half _Metallic = 0.0;
                float4 _LineColor;
                float4 _BGColor;
                sampler2D _MainTex;

                float _GridSize;
                float _LineThickness;


                v2f vert(appdata v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    float2 uv = i.uv;


                    fixed4 c = float4(0.0,0.0,0.0,0.0);

                    float brightness = 1.;

                    float gsize = floor(_GridSize);


                    gsize += _LineThickness;

                    float2 id;

                    id.x = floor(uv.x / (1.0 / gsize));
                    id.y = floor(uv.y / (1.0 / gsize));

                    float4 color = _BGColor;
                    brightness = _BGColor.w;

                    if (frac(uv.x*gsize) <= _LineThickness || frac(uv.y*gsize) <= _LineThickness)
                    {
                        brightness = _LineColor.w;
                        color = _LineColor;
                    }
                    
                    if (brightness == 0.0) {
                        clip(c.a - 1.0);
                    }


                    c = fixed4(color.x*brightness,color.y*brightness,color.z*brightness,brightness);
                    return c;
                }
                ENDCG
            }
        }
}
c# unity3d shader fragment-shader vertex-shader
© www.soinside.com 2019 - 2024. All rights reserved.