gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:02 25 4
gpt4 key购买 nike

在调用 glVertexAttribPointer(GLuint index, ...) 之后,顶点属性默认禁用为 docs

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

为什么我们必须使用额外的功能来启用它?有人可以说出一个有用的案例吗?

在研究过程中,我了解到以下内容:

  • 通过在 GLSL 或 glBindAttribLocation 中使用 layout(location = x) 限定符,我们可以显式设置位置,而不是让 OpenGL 生成它。但这不是我要问的重点。

  • glEnableVertexAttribArray 不能用于绘制具有多个着色器的一个 VAO。由于使用程序对象查询属性位置,因此可以假设位置是特定于着色器的;那么人们会期望,我们可以在运行正确的着色器之前启用正确的属性位置。但是测试这个,我注意到,一个位置值可以在不同的着色器中出现不止一次;此外,输出看起来是错误的。如果您想查看代码,请询问。

  • 属性位置存储在 VAO 中。

最佳答案

这个设置是完全合理的。启用和禁用它都有非常有效的用例。

入口点的名称已经强烈暗示了原因。请注意 glEnableVertexAttribArray() 中的 Array 部分。此调用不会“启用属性”。它允许使用来自数组的顶点属性值,意思是:

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

属性的当前值是通过调用 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/48037365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com