gpt4 book ai didi

c++ - opengl 中的缓冲区数据问题 = 仅当我缓冲的字节数超过需要时才绘制

转载 作者:行者123 更新时间:2023-11-30 02:55:08 25 4
gpt4 key购买 nike

这里是代码 main.cpp 的粘贴箱和 shaders .它使用 devIL、glload 和 glfw。在 windows 和 linux 上运行。任何名为 pic.png 的 png 都将加载。

我以相当正常的方式缓冲我的数据。只是一个简单的三角形。

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//vX vY vZ vW nX nY nZ U V
float bufferDataThree[9*3] = {
-1.0f, -1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f, 0.0f,0.0f,
1.0f, -1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f, 0.0f,1.0f,
1.0f, 1.0f, 0.0f,1.0f, 0.0f,1.0f,0.0f, 1.0f,1.0f};
//TOTAL 4 + 3 + 2 = 9;
glBufferData(GL_ARRAY_BUFFER, (9*3)*4, bufferDataThree, GL_STATIC_DRAW); //Doesnt Work
//glBufferData(GL_ARRAY_BUFFER, (10*3)*4, bufferDataThree, GL_STATIC_DRAW); //Works

有 9*3 = 27 个 float 。因此 108 字节。如果我缓冲 108 个字节,它会搞砸纹理坐标。如果我缓冲 116 个字节,(多 2 个 float )它呈现得很好。

我的展示方式。

void display()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(program);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,tbo);

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float), 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float),(void*) (4*sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float),(void*) ((4+3)*sizeof(float)));

glDrawArrays(GL_TRIANGLES,0,3);
glDisableVertexAttribArray(0);
glUseProgram(0);

glfwSwapBuffers();
}

这怎么会发生?

最佳答案

glVertexAttribPointer 的第二个参数是组件的数量,对于纹理坐标,它是 2,对于法线是 3。

关于c++ - opengl 中的缓冲区数据问题 = 仅当我缓冲的字节数超过需要时才绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679020/

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