opengl =中缓冲区数据的问题仅在我缓冲比需要更多的字节时绘制

Issue with buffer data in opengl = only draws if I buffer more bytes than needed

本文关键字:绘制 字节 缓冲 缓冲区 数据 问题 opengl      更新时间:2023-10-16

这是代码main.cpp和着色器的粘贴箱。它使用了devIL、glload和glfw。在windows和linux上运行。

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

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个浮点数。因此是108字节。如果我缓冲108字节,它会搞砸纹理坐标。如果我缓冲116字节,(2浮动更多)它呈现良好。

My display method.

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,对于normal是3。