gpt4 book ai didi

c++ - glGenVertexArrays 和 glGenBuffers 参数

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:15 27 4
gpt4 key购买 nike

在关于 OpenGL 3.0+ 的教程中,我们以这种方式创建顶点数组对象和顶点缓冲区对象:

GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

在这里,VAO 是一个unsigned int(GLuint),我们在函数glGenVertexArray 中将它的地址传递给它。但是,根据文档,该函数的第二个参数应该是 array of unsigned int (GLuint*)。 VBO 和 glGenBuffers 也是如此。我不明白为什么上面的代码可以使用这样的参数。

我已经尝试用这个替换上面的代码(并在我的代码的其他地方做必要的修改):

GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);

它编译并执行,但我得到了一个意想不到的行为:我的纹理矩形使用第一种语法呈现,而不是第二种语法。我也不明白为什么会这样。

编辑:谢谢。如前所述,第二个代码中存在索引错误。

最佳答案

规范中的函数签名是:

void glGenVertexArrays( GLsizei n,
GLuint *arrays);

因此 arrays 需要一个 GLuint pointer 可以有效写入 n * sizeof(GLuint) 字节的数据。

可以这样写:

GLuint VAO, VBO; 
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);

因为 glGenVertexArrays 想要一个指向 GLuint 的指针,其中写入 n * sizeof(GLuint) 字节的数据是有效的 (在你的情况下 1) 并且因为 VAO 可以保存这个数据量,所以这样写是正确的。如果您每次调用仅创建一个 ID,则更可取。

正如其他人所说,数组中的第一个元素的索引为 0。就此而言,它必须是:

GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);

如果你想在一次调用中创建更多元素,你想使用 std::array 而不是 []

std::array<GLuint,3> VAOs;
std::array<GLuint,3> VBOs;

glGenVertexArrays(VAOs.size(), &VAOs[0]);
glGenBuffers(VBOs.size(), &VBOs[0]);

注意 unsigned intGLuint 不一定是相同的类型或大小,unsigned int 有一个最小保证数字范围,但是大小在不同的平台上仍然会有所不同。另一方面,GLuint 具有定义的大小。

关于c++ - glGenVertexArrays 和 glGenBuffers 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45860198/

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