如何使用结构匀变速团结CG / HLSL?

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

我想做出统一的顶点,片段着色器。我知道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,这种“统一变量”叫什么?它只是属性?

unity3d shader hlsl cg
2个回答
0
投票

在Unity,制服通过材料特性块相连。什么,你需要做的是,首先将它们定义为属性,然后在CGPROGRAM块再次定义他们,使他们在着色器代码中。统一材料还记得在所有使用的着色器设置为键 - 值对所有的属性,并会尝试在它们匹配,其中,以适应这些。

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
        }

    }

}

0
投票

我想你可以使用cbuffer或使用CBUFFER_START(名称)和CBUFFER_END宏说。他们基本上是结构一样,但他们被称为cbuffer。 REF DOC:https://docs.unity3d.com/Manual/SL-BuiltinMacros.html

© www.soinside.com 2019 - 2024. All rights reserved.