Как я могу использовать единообразную переменную структуры в Unity CG / HLSL? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу сделать вершинно-фрагментный шейдер в единстве.Я знаю о GLSL, но сначала попробуйте программирование на cg / hlsl.

Если я установил единицы в «графический API для openGLCore», я могу использовать структурные переменные.единообразное среднее значение, свойства шейдера.(glsl назовите его единообразным)

но я установил «единство» на «графический API для Direct3D», он не может работать.ошибка компиляции.

это ошибка.

    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;

Я не могу найти, как решить.если я использую struct в функции (local varialble), это не проблема.но мне нужно глобальное (единообразное) ....

это невозможно?

пс.в cg / hlsl эта «единая переменная» называется как?это просто свойства?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Я думаю, вы можете использовать cbuffer или использовать для этого макросы CBUFFER_START (имя) и CBUFFER_END.Они в основном как структуры, но они называются cbuffer.ссылка документ: https://docs.unity3d.com/Manual/SL-BuiltinMacros.html

0 голосов
/ 11 февраля 2019

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

    }

}
...