可以为曲面着色器appdata输入设置顶点alpha吗?

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

我的着色器会做一些数学运算来确定顶点alpha,所以我有一个函数可以在数据传递到我的surf函数中之前进行此操作。

    void foo(inout appdata_full v, out Input o) {
        UNITY_INITIALIZE_OUTPUT(Input, o);
        float someAlpha;
        [...some maths to create someAlpha value...]
        v.color.a = someAlpha;
    }

    half _Glossiness;
    half _Metallic;
    fixed4 _Color;

    UNITY_INSTANCING_BUFFER_START(Props)
    UNITY_INSTANCING_BUFFER_END(Props)

    void surf (Input IN, inout SurfaceOutputStandard o)
    {
        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Alpha = c.a;
    }

然后,当我使用Input IN时,我希望在设置Alpha时反映出某些Alpha:

o.Alpha = c.a;

目前,绝对没有任何反应。如何在冲浪中使用我想要的alpha值?

unity3d glsl shader
1个回答
0
投票

是。您需要向COLOR对象添加Input语义:

struct Input {
    float4 uv_MainTex;
    float4 vertColor : COLOR;
    };

然后在foo中分配给它(尽管如果有#pragma surface surf,则可能没有必要:]

void foo(inout appdata_full v, out Input o) {
    UNITY_INITIALIZE_OUTPUT(Input, o);
    float someAlpha;
    [...some maths to create someAlpha value...]
    v.color.a = someAlpha;

    o.vertColor = v.color;
}

然后在surf中使用它:

void surf (Input IN, inout SurfaceOutputStandard o)
{
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    fixed4 vertexColor = IN.vertColor;
    o.Albedo = c.rgb;
    o.Metallic = _Metallic;
    o.Smoothness = _Glossiness;
    o.Alpha = vertexColor.a * c.a; // you may or may not want to combine alpha like this
}
© www.soinside.com 2019 - 2024. All rights reserved.