opengl - OpenGL 中 `glEnableVertexAttribArray(GLuint index)` 的目的是什么?

标签 opengl opengl-es glsl

调用后glVertexAttribPointer(GLuint index, ...)默认情况下,顶点属性被禁用为 docs

By default, all client-side capabilities are disabled, including all generic vertex attribute arrays.



为什么我们必须使用额外的功能启用它?有人可以说出一个案例,这在哪些地方有用?

在研究时,我了解到以下内容:
  • 通过使用 layout(location = x) GLSL 中的限定符或 glBindAttribLocation我们可以明确地设置位置,而不是让 OpenGL 生成它。但这不是我的问题的重点。
  • glEnableVertexAttribArray不能用于使用多个着色器绘制一个 VAO。当使用程序对象查询属性位置时,人们会假设位置是特定于着色器的;那么人们会期望,我们可以在运行正确的着色器之前启用正确的属性位置。但是测试这个,我注意到,一个位置值可以在不同的着色器中出现多次;此外,输出看起来是错误的。如果您想查看代码,请询问。
  • 属性位置存储在 VAO 中。
  • 最佳答案

    该设置完全有意义。启用和禁用它都有非常有效的用例。

    入口点的名称已经给出了一个强有力的提示。请注意 Array参加 glEnableVertexAttribArray() .此调用不会“启用该属性”。它允许使用来自 的顶点属性值。阵列 , 意义:

  • 如果启用,每个顶点使用一个来自数组的单独值。
  • 如果禁用,则属性的当前值用于所有顶点。

  • 属性的当前值是通过调用 glVertexAttrib[1234]f() 来设置的。家庭。您希望在下一次绘制调用中为所有顶点使用相同属性值的用例的典型代码序列是:
    glDisableVertexAttribArray(loc);
    glVertexAttrib4f(loc, colR, colG, colB, colA);
    

    与每个顶点从数组中获取自己的属性值的情况相比:
    glEnableVertexAttribArray(loc);
    glVertexAttribPointer(loc, ...);
    

    现在,从数组中获取属性肯定更为常见。所以你可能会争辩说默认值对于现代 OpenGL 的使用来说是不幸的。但是设置和更改它的调用绝对仍然非常有用。

    关于opengl - OpenGL 中 `glEnableVertexAttribArray(GLuint index)` 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39264296/

    相关文章:

    c++ - 如何重用相同的顶点着色器来绘制不同的 gl_Position

    linux - 如何在 Linux (Gnome) 中多路复用多个视频流

    c++ - OpenGL 4.3 上的 ETC2 纹理压缩的视频内存

    c++ - 将 GL 模型 View 矩阵转换为世界坐标

    opengl - 在 OpenGL 着色器中检测 NaN 的最佳方法

    matrix - glsl 向量*矩阵与 hlsl 不同

    c++ - OpenGL - 如何调整窗口大小

    opengl - 是否必须为几何着色器中发出的每个顶点设置每个变量?

    unix - 调整图像大小(jpeg 或解压缩图像)

    android - PowerVR - glDrawElements 上的 GL_OUT_OF_MEMORY