首页 > 解决方案 > 可以为表面着色器应用数据输入设置顶点 alpha 吗?

问题描述

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

    #pragma surface surf Standard alpha
    #pragma target 3.0

    struct Input
    {
        float2 uv_MainTex;
        float tranparency;
    };

    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.transparency = v.color.a;
    }

    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 时反映 someAlpha:

o.Alpha = c.a; //Can I do c.a * IN.transparency ?

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

标签: unity3dshaderhlslcg

解决方案


是的。您可以COLOR向对象添加语义Input

struct Input {
    float4 uv_MainTex;
    float4 color : 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.color = v.color;
}

然后使用它surf

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

最后,通过更改为:告诉 Unityfoo在表面着色器之前用作顶点着色器:#pragma surface surf Standard alpha

#pragma surface surf Standard alpha vertex:foo

推荐阅读