代码之家  ›  专栏  ›  技术社区  ›  elect

GLSL,文字常量输入布局限定符

  •  1
  • elect  · 技术社区  · 10 年前

    我想知道我是否会有这样的东西:

    layout (location = attr.POSITION) in vec3 position;
    

    例如 Attr 是一个常量结构

    const struct Attr
    {
        int POSITION;
    } attr = Attr(0);
    

    我已经试过了,但它会抱怨

    着色器状态无效:0(34):错误C0000:语法错误,意外 整数常量,应为标识符或模板标识符或类型 令牌“”处的标识符

    或者,如果无法使用结构,我可以使用其他东西来声明文字输入限定符,例如 attr.POSITION ?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Nicol Bolas    10 年前

    GLSL没有这样的东西 const struct 公告但是,它有编译时常量值:

    const int position_loc = 0;
    

    规则适用于 constant expressions 假设用常量表达式初始化的常量限定变量本身就是常量表达式。

    没有规则规定这样一个常量限定变量的类型必须是基本类型:

    struct Attr
    {
      int position;
    };
    const Attr attr = {1};
    

    自从 attr 用包含常量表达式的初始化列表初始化, 吸引(attr) 本身就是一个常量表达式。这意味着 attr.position 也是一个常量表达式,是整型表达式之一。

    这样的编译时积分常量表达式可以用于 layout qualifiers ,但仅当您使用GLSL 4.40或ARB_ehanced_layouts时:

    layout(location = attr.position) in vec3 position;
    

    在此版本之前,您需要使用实际的文字。这意味着你能做的最好的就是 #define :

    #define position_loc 1
    layout(location = position_loc) in vec3 position;
    

    现在,就我个人而言,我永远不会依赖结构体操中这种完整的常量表达。很少有人依赖它们,因此驱动程序代码很少以这种方式进行测试。因此,遇到驱动程序错误的可能性相当大。这个 #定义 这种方法在实践中更有可能奏效。