【问题标题】:GLSL OpenGL 3.x how to specify the mapping between generic vertex attribute indices and semantics?GLSL OpenGL 3.x 如何指定通用顶点属性索引和语义之间的映射?
【发布时间】:2012-03-05 03:39:52
【问题描述】:

我正在从 HLSL 切换到 GLSL

在顶点缓冲区中定义顶点属性时,必须调用

glVertexAttribPointer(  GLuint      index, 
    GLint   size, 
    GLenum      type, 
    GLboolean   normalized, 
    GLsizei     stride, 
    const GLvoid *      pointer);

并传递一个索引。但是如何指定哪个索引映射到着色器中的哪个语义?

例如gl_Normal。如何指定在顶点着色器中使用 gl_Normal 时,我希望它是索引为 1 的通用顶点属性?

【问题讨论】:

    标签: opengl glsl opengl-3


    【解决方案1】:

    在 GLSL 中没有“语义”之类的东西。只有属性索引和顶点着色器输入。

    有两种顶点着色器输入。在 3.1 中删除的种类(以“gl_”开头的种类)和用户定义的种类。移除的种类不能设置为glVertexAttribPointer;这些变量中的每一个都有自己的特殊功能。 gl_NormalglNormalPointergl_ColorglColorPointer 等。但这些功能不再存在于核心 OpenGL 中。

    用户定义的顶点着色器输入与属性索引相关联。每个命名输入通过以下方式之一分配一个索引,从最覆盖到默认:

    1. 通过使用 GLSL 3.30 或 ARB_explicit_attrib_location 扩展语法layout(location = #),其中# 是属性索引。因此,如果我有一个名为 position 的输入,我会给它索引 3,如下所示:

      layout(location = 3) in vec4 position;
      

      这是我首选的处理方法。 Explicit_attrib_location 可用于几乎所有仍受支持的硬件(非英特尔)。

    2. 通过glBindAttribLocation 显式关联。您在链接程序之前调用此函数。要做到以上,我们会这样做:

      GLuint program = glCreateProgram();
      glAttachShader(program, some_shader);
      glBindVertexAttrib(program, 3, "position");
      glLinkProgram(program);
      

      您可以设置多个属性。实际上,您可以将多个属性名称设置为同一个索引。这样做的想法是能够自动设置一堆映射并让 OpenGL 找出哪个与实际的着色器代码一起工作。因此,您可以将“位置”和“轴”映射到索引 3,只要您不将着色器放入具有这两个输入的系统中,就可以了。

    3. 让 OpenGL 分配它。如果您没有以其他方式之一为属性分配属性索引,则 GLSL 链接器将为您分配它。您可以使用glGetAttribLocation 获取属性后链接。

      我真的不建议这样做,因为 OpenGL 会任意分配索引。因此,每个使用名为position 的属性的着色器都可能在不同的索引中具有位置。我不认为这是个好主意。因此,如果您不能在着色器中显式设置它,那么至少在链接之前在您的 OpenGL 代码中显式设置它。这样,您可以对属性索引 0 的含义、索引 1 的含义等有一个约定。

    【讨论】:

    • 是的,制服是独立于顶点属性的概念。
    • 除了个人偏好之外,让 OpenGL 任意分配索引还有什么缺点吗?我为我的项目构建了一个小抽象,它会自动检索每个着色器的索引并让我将缓冲区绑定到它们。我看不出手动弄乱索引有什么好处。
    • @Gigo:一个完善的属性索引约定允许您使用具有不同着色器的相同 VAO,而无需不断地重新调用 glVertexAttribPointer。要做到这一点,您需要经常调用该函数,这远远超出了必要的范围。
    • @NicolBolas 好的,我刚刚阅读了您的另一篇文章,这使您的观点非常清楚。 gamedev.stackexchange.com/a/42154
    • 不错。 glBindVertexAttrib 应该是 glBindAttribLocation 吗?
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2021-05-21
    • 2016-10-21
    相关资源
    最近更新 更多