Я хочу сделать шейдер вершинных фрагментов в единстве. Я знаю о GLSL, но сначала попробуйте программировать cg/hlsl.
если я устанавливаю для Unity значение «графический API для openGLCore», я могу использовать struct uniform переменные. однородное переменное среднее, свойства шейдера. (glsl называет это униформой)
но я устанавливаю Unity на «графический 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;
не могу найти как решить. если я использую структуру в функции (локальная переменная), это не проблема. но мне нужен глобальный (униформа)....
это невозможно?
пс. в cg/hlsl эта «универсальная переменная» называется как? это просто свойства?





В 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
}
}
}
Я думаю, вы можете использовать cbuffer или макросы CBUFFER_START(имя) и CBUFFER_END. В основном они похожи на структуры, но называются cbuffer.
справочный документ: https://docs.unity3d.com/Manual/SL-BuiltinMacros.html
Я знаю это. определять в свойствах не нужно. я хочу, как использовать структурную переменную... вы имеете в виду, что это невозможно?