gpt4 book ai didi

c++ - 使用 VBO 渲染顶点的问题 - OpenGL

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:45 24 4
gpt4 key购买 nike

我正在将我的顶点数组函数转移到 VBO 以提高我的应用程序的速度。

这是我原来的工作顶点数组渲染函数:

void BSP::render()
{
glFrontFace(GL_CCW);

// Set up rendering states
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);

glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].u);

// Draw
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, indices);

// End of rendering - disable states
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

效果很好!

现在我将它们移到 VBO 中,我的程序实际上导致我的显卡停止响应。我的顶点和索引的设置完全相同。

新设置:

vboId 在 bsp.h 中设置如下: GLuint vboId[2];

当我运行 createVBO() 函数时没有出现错误!

void BSP::createVBO()
{

// Generate buffers
glGenBuffers(2, vboId);

// Bind the first buffer (vertices)
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

// Now save indices data in buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

}

以及 VBOS 的渲染代码。我很确定它就在这里。只想渲染 VBO 中的内容,就像我在顶点数组中所做的那样。

渲染:

void BSP::renderVBO()
{
glBindBuffer(GL_ARRAY_BUFFER, vboId[0]); // for vertex coordinates
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId[1]); // for indices

// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr

// draw the bsp area
glDrawElements(GL_TRIANGLES, numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

glDisableClientState(GL_VERTEX_ARRAY); // deactivate vertex array

// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

不确定错误是什么,但我很确定我的渲染函数有误。希望有一个更统一的教程,因为网上有很多,但他们经常相互矛盾。

最佳答案

除了 Miro 所说的(GL_UNSIGNED_BYTE 应该是 GL_UNSIGNED_SHORT),我认为你不想使用 numVerticesnumIndices,就像在您的非 VBO 调用中一样。

glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);

否则您的代码看起来非常有效,如果这不能解决您的问题,则可能错误出在其他地方。

顺便说一句,BUFFER_OFFSET(i) 通常只是 ((char*)0+(i)) 的定义,因此您也可以直接传入字节偏移量,尤其是0的时候。

编辑: 刚刚发现另一个。如果您使用用于非 VBO 版本的确切数据结构(我在上面假设),那么您当然需要使用 sizeof(Vertex) 作为 glVertexPointer .

关于c++ - 使用 VBO 渲染顶点的问题 - OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039211/

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