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

Opengl GLSL,文字常量输入布局限定符,opengl,struct,glsl,constants,Opengl,Struct,Glsl,Constants,我想知道我是否有这样的东西: layout (location = attr.POSITION) in vec3 position; 例如,Attr是一个常量结构 const struct Attr { int POSITION; } attr = Attr(0); 我已经试过了,但它抱怨 着色器状态无效:0(34):错误C0000:语法错误,意外 整型常量,应为标识符或模板标识符或类型 令牌“”处的标识符 或者,如果无法使用结构,我是否可以使用其他东西来声明文本输入限定符,例如at

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

layout (location = attr.POSITION) in vec3 position;
例如,
Attr
是一个常量结构

const struct Attr
{
    int POSITION;
} attr = Attr(0);
我已经试过了,但它抱怨

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


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

GLSL没有
const-struct
声明。但是,它有编译时常量值:

const int position_loc = 0;
的规则表示,用常量表达式初始化的常量限定变量本身就是常量表达式

也没有规则规定这种常量限定变量的类型必须是基本类型:

struct Attr
{
  int position;
};
const Attr attr = {1};
由于
attr
是使用包含常量表达式的初始化列表初始化的,
attr
本身就是常量表达式。这意味着
attr.position
也是一个常量表达式,是整数类型的表达式之一

这样的编译时积分常量表达式可以在中使用,但仅当您使用GLSL 4.40或ARB_ehanced_布局时:

layout(location = attr.position) in vec3 position;
在该版本之前,您需要使用实际的文本。这意味着你能做的最好的事情就是定义:

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

好的,我将坚持使用
#define