Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx 在hlsl中声明变量的奇怪方式_Directx_Hlsl_Vertex Shader_Pixel Shader - Fatal编程技术网

Directx 在hlsl中声明变量的奇怪方式

Directx 在hlsl中声明变量的奇怪方式,directx,hlsl,vertex-shader,pixel-shader,Directx,Hlsl,Vertex Shader,Pixel Shader,我找到了在hlsl中实现Phong lightning的示例。这是我第一次看到在hlsl中声明变量的奇怪语法,如下所示: float3 materialEmissive : EMISSIVE; float3 materialAmbient : AMBIENT; 在通常情况下,我不使用EMISSIVE或AMBIENT来声明寄存器中的位置,例如: float3 materialEmissive : register(c0); float3 materialAmbient : register(c1

我找到了在hlsl中实现Phong lightning的示例。这是我第一次看到在hlsl中声明变量的奇怪语法,如下所示:

float3 materialEmissive : EMISSIVE;
float3 materialAmbient : AMBIENT;
在通常情况下,我不使用
EMISSIVE
AMBIENT
来声明寄存器中的位置,例如:

float3 materialEmissive : register(c0);
float3 materialAmbient : register(c1);

为什么我要从link声明示例中的变量?我查看了DirectX文档,但没有发现
EMMISIVE
AMBIENT
是hlsl中的一些关键词。

在这种情况下,
EMISSIVE
AMBIENT
就是所谓的语义。它们描述了变量应该包含什么(而不是存储在哪里)


着色器编译器可以访问这些语义来为变量创建句柄。例如,Effect Framework和早期版本的DirectX允许您通过其语义名称指定全局变量。这将实际着色器实现(即变量名)从接口分离到外部世界(即语义)。

上面的OP示例不是遗留效果框架使用的示例。它在自定义工具中可能有一些意义,但我敢肯定它在其他方面毫无意义,HLSL编译器只是允许它作为自定义语义名称。请注意,像
EMISSIVE
worldwiewproj
这样的语义对传统Direct3D 9固定函数管道确实有一些意义,但当您同时提供VS和PS时,它们不用于Direct3D 10+着色器或Direct3D 9可编程管道。我不明白您的观点。它们绝对是语义(可由使用)。我没有说它们会触发一些自动行为。对,有“语义”和“注释”,它们都与遗留系统相关,而不是HLSL或Direct3D本身使用。