gpt4 book ai didi

c++ - 使用索引 VBO 的正确方法

转载 作者:行者123 更新时间:2023-11-28 02:06:08 24 4
gpt4 key购买 nike

我正在开发一个简单的 3D 引擎。我目前有一个包含多个 VAO 的工作设置,我可以在渲染循环期间在它们之间切换,但它们都没有使用索引缓冲区。

我现在正在尝试添加一个由 4 个 VBO 组成的新 VAO:顶点位置、颜色、法线和索引。

一切都编译并运行,但对第二个 VAO(带有索引顶点)的绘图调用不渲染。我确定我的设置某处有问题,所以我添加了这段代码,其中包括所有 VAO 和 VBO 生成、调用和使用。此代码中是否有任何问题,这是设置所有内容的正确方法吗?

VAO1 有 3 个缓冲区:位置、颜色、法线

VAO2 有 3 个缓冲区:位置、颜色、法线和顶点索引

//Initalize vaos and vbos
GLuint vao1, vbo1[3];
GLuint vao2, vbo2[4];

//Generate Vertex arrays:
glGenVertexArrays(1, &vao1);
glGenVertexArrays(1, &vao2);

//Generate Buffers:
glGenBuffers(3, vbo1);
glGenBuffers(4, vbo2);

//Initalize Bufferdata vectors:
vector<GLfloat> VertPosBuffer1Vector;
vector<GLfloat> VertNormalBuffer1Vector;
vector<GLfloat> VertColorBuffer1Vector;

vector<GLfloat> VertPosBuffer2Vector;
vector<GLfloat> VertNormalBuffer2Vector;
vector<GLfloat> VertColorBuffer2Vector;
vector<GLuint> VertIndexBuffer2Vector;

//Fill Buffers:
//(not included but all vectors are filled with data)

//VAO 1
glBindVertexArray(vao1);

//Vertex position buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer1Vector.size(), &VertPosBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);

//Vertex color buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer1Vector.size(), &VertColorBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);

//Vertex normal buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo1[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer1Vector.size(), &VertNormalBuffer1Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(2);

//VAO 2
glBindVertexArray(vao2);

//Vertex position buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer2Vector.size(), &VertPosBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(0);

//Vertex color buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer2Vector.size(), &VertColorBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(1);

//Vertex normal buffer:
glBindBuffer(GL_ARRAY_BUFFER, vbo2[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer2Vector.size(), &VertNormalBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(2);

//Vertex index buffer:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo2[3]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*VertIndexBuffer2Vector.size(), &VertIndexBuffer2Vector[0], GL_STATIC_DRAW);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);

//unbind vao
glBindVertexArray(0);
//bind first vao
glBindVertexArray(vao1);

//RENDERLOOP

//render objects from vao1 using:
glDrawArrays(GL_TRIANGLES, start, size);

//switch vao
glBindVertexArray(0);
glBindVertexArray(vao2);

//render objects from vao2 using:
glDrawElements(
GL_TRIANGLES,
start,
GL_UNSIGNED_INT,
(void*)0
);

我已检查缓冲区中的数据是否正确。

着色器不接收任何索引信息是否正确?着色器会和我没有使用索引缓冲区一样吗?

谢谢

最佳答案

索引不是顶点属性。所以你需要做的是删除这两行:

glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glEnableVertexAttribArray(3);

我还注意到您使用变量“start”作为 glDrawElements 的计数参数。我不知道 start 和 size 的值,但我假设您应该使用“size”作为 glDrawElements 中的第二个参数。

关于c++ - 使用索引 VBO 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37373303/

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