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



我想在统一中制作顶点片段着色器。我知道GLSL,但首先尝试cg/hlsl编程。

如果我将 Unity 设置为"openGLCore 的图形 API",我可以使用结构统一变量。 均匀变量平均值,着色器属性。(GLSL称其为统一(

但是我将 Unity 设置为"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 中,这个"均匀变量"叫什么? 它只是属性?

我认为您可以使用cbuffer或使用CBUFFER_START(名称(和CBUFFER_END宏。它们基本上类似于结构,但它们被称为 cbuffer。ref doc:https://docs.unity3d.com/Manual/SL-BuiltinMacros.html

在 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
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新