2013-05-21 24 views
1

这里是代码为main.cppshaders的粘贴容器。它使用devil,glload和glfw。运行在Windows和Linux上。任何名为pic.png的png都会加载。opengl中缓冲区数据的问题=只在我缓冲比需要更多字节时画出

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

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浮动更多)它渲染罚款。

我的显示方法。

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(); 
} 

这是怎么发生的?

+0

为什么这是低票?我的问题缺乏解决所需的细节吗?我不这么认为... – Andrew

回答

3

glVertexAttribPointer的第二个参数是组件的数量,对于纹理坐标,它是2和3的正常值。

+0

谢谢yngum :) – Andrew

+0

欢迎你。 :) – yngccc