如何在unity cg / hlsl中使用结构统一变量?

时间:2019-02-11 06:55:33

标签: unity3d shader hlsl cg

我要统一制作顶点片段着色器。 我了解GLSL,但首先尝试进行cg / hlsl编程。

如果我将“ openGLCore的图形API”设置为统一,则可以使用结构统一变量。均匀变量均值,着色器属性。 (glsl称之为统一)

但是我将统一设置为“ Direct3D的图形API”,它无法工作。编译错误。

这是错误。

    Shader error in 'HLSL/Phong_cg': Fragment program 'frag': Struct variable 
    'u_material' is ignored. Only instancing constant buffers can have struct 
    variables (on d3d11)

这是代码。

        struct MATERIAL {
            fixed4 ambient_color;
            fixed4 diffuse_color;
            fixed4 specular_color;
            fixed4 emissive_color;
            float specular_exponent;
        };
        uniform MATERIAL u_material;

我找不到解决方法。 如果我在函数(局部变量)中使用结构,则没有问题。但我需要全局(统一)。...

这不可能吗?

ps。在cg / hlsl中,这个“统一变量”叫什么?只是属性?

2 个答案:

答案 0 :(得分:0)

在Unity中,制服通过材料属性块链接。您需要做的是先将它们定义为属性,然后在CGPROGRAM块中再次定义它们以使其在着色器代码中可用。 Unity材质会将在所有使用的着色器上设置的所有属性记为键值对,并会尝试将它们匹配到合适的位置。

Shader "Name" {
    Properties {
        _MyProperty1("Texture Name", 2D) = "white{}
        _MyProperty2("Color name", Color) = (1, 1, 1, 1)
        _MyRangeProperty("Float with a slider range", Range(0, 1)) = 0
        _MyVectorProperty("Vector name", Vector) = (0, 0, 0, 0)
    }

    SubShader {
        Pass {
            CGPROGRAM

            sampler2D _MyProperty1;
            fixed4 _MyProperty2;
            half _MyRangeProperty;
            float4 _MyVectorProperty;

            ENDCG
        }

    }

}

答案 1 :(得分:0)

我认为您可以为此使用cbuffer或CBUFFER_START(name)和CBUFFER_END宏。它们基本上就像结构,但它们称为cbuffer。 参考文件:https://docs.unity3d.com/Manual/SL-BuiltinMacros.html