【问题标题】:Strange way of declaring variables in hlsl在 hlsl 中声明变量的奇怪方式
【发布时间】:2015-09-10 08:35:05
【问题描述】:

我找到了this 在 hlsl 中实现 Phong 闪电的示例。这是第一个 sn-p,我看到你在 hlsl 中声明变量的奇怪语法,如下所示:

float3 materialEmissive : EMISSIVE;
float3 materialAmbient : AMBIENT;

通常,而不是EMISSIVEAMBIENT,我曾经在寄存器中声明位置,例如:

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

为什么我要从链接中声明像示例中的变量?我查看了 DirectX 文档,但没有找到 EMMISIVEAMBIENT 是否是 hlsl 中的一些关键字。

【问题讨论】:

    标签: directx hlsl vertex-shader pixel-shader


    【解决方案1】:

    在这种情况下,EMISSIVEAMBIENT 是所谓的语义。它们描述了该变量应包含的内容(而不是存储位置)。

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

    【讨论】:

    • 上面的 OP 示例不是旧版 Effects 框架使用的 DirectX Standard Annotations and Semantics Reference 示例。它在自定义工具中可能有一些意义,但我相当肯定它在其他方面毫无意义,HLSL 编译器只是容忍它作为自定义语义名称。
    • 请注意,像 EMISSIVEWORLDVIEWPROJ 这样的语义对于传统的 Direct3D 9 固定功能管道确实有一些意义,但它们不适用于 Direct3D 10+ 着色器或 Direct3D 9 可编程同时提供 VS 和 PS 时的管道。
    • 我不明白你的意思。它们绝对是语义(GetVariableBySemantic 可以使用)。我没有说它们会触发一些自动行为。
    • 对,既有“语义”,也有“注释”,两者都与旧的Effects 系统相关,而不是与 HLSL 相关,也不是 Direct3D 本身使用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多