2011-05-16 45 views
0

我刚开始使用VBOs(使用SDL/glew)。我试图从一个立方体的简单例子开始 - 实际上此刻只是一个立方体的一个面 - 但我不能得到任何东西来显示VBO不会显示(sdl与glew)

我的顶点结构定义如下:

struct Vertex 
{ 
float x, y, z;   //Vertex coords 
float tx, ty;   //Texture coords 
float nx, ny, nz;  //Normal coords 
}; 

立方体然后,像这样产生的:

 Vertex temp; 

     //NOTE: Perspective is from looking at the cube from the outside 
    //Just trying to display one face for the moment to simplify 
     //Back face ------------------------------------------------------------------------------------------ 
     temp.x = 0.f; temp.y = 0.f; temp.z = 0.f;  //Bottom Right - 0 
     temp.nx = 0.f; temp.ny = 0.f; temp.nz = 1.f; // This stays the same for the rest of the face 
     temp.tx = 1.f; temp.ty = 0.f; 
     m_vertices.push_back(temp); 

     temp.x = 0.f; temp.y = m_fHeight; temp.z = 0.f;   //Top Right - 1 
     temp.tx = 1.f; temp.ty = 1.f; 
     m_vertices.push_back(temp); 

     temp.x = m_fWidth; temp.y = m_fHeight; temp.z = 0.f; //Top Left  - 2 
     temp.tx = 0.f; temp.ty = 1.f; 
     m_vertices.push_back(temp); 

     temp.x = m_fWidth; temp.y = 0.f; temp.z = 0.f; //Bottom Left - 3 
     temp.tx = 0.f; temp.ty = 0.f; 
     m_vertices.push_back(temp); 

     m_indeces.push_back(0); m_indeces.push_back(1); m_indeces.push_back(2); 
     m_indeces.push_back(2); m_indeces.push_back(3); m_indeces.push_back(0); 


     //Generate the vertex buffer 
     glGenBuffers(1, &m_vertexBufferID); 
     //Bind the vertex buffer                         
     glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID); 
     //Fill the vertex buffer - size is 24*sizeof(Vertex) bcs 6 faces with 4 corners 
     glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 4, NULL, GL_STATIC_DRAW); 
     glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * 4, &m_vertices); // Actually upload the data 

     //Set up the pointers 
     glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12)); 
     glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20)); 
     glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0)); 


     //Generate the index buffer 
     glGenBuffers(1, &m_indexBufferID);          
     //Bind the index buffer                       
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBufferID); 
     //Fill the index buffer- size is 36*sizeof(uint) bcs 6 traingle coords in 1 face * 6 faces 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte) * 6, NULL, GL_STATIC_DRAW); 
     glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLubyte) * 6, &m_indeces); // Actually upload the data 

然后将其发送在一个单独的函数来呈现:

glBindBuffer(GL_ARRAY_BUFFER, vertexID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexID); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

// Resetup the pointers. 
glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(12)); 
glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(20)); 
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0)); 

//Draw the indexed elements 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0)); 

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

和BUFFER_OFFSET()是一个simaple宏定义为:

// A helper macro to get a position 
#define BUFFER_OFFSET(i) ((char *)NULL + (i)) 

但我不能得到任何显示 - 应用相同的纹理等以直接模式的立方体显示了罚款。

奇怪的是偶尔会有一些非常奇怪的东西被显示出来,每次都会有所不同 - 也许这是某种初始化错误?

+0

多个“索引”是“索引”或“索引”。 – 2011-05-16 22:50:55

+0

glGetError()告诉你什么? – 2011-05-16 22:52:43

+0

没有VBO的'glDrawElements'是否适合你? – 2011-05-16 22:58:34

回答

0

你的大小都不符合评论,我怀疑你读了VBO的结尾。

+0

嗨,对不起,我显然忘了修改评论 - 我认为大小是正确的,因为我目前只是试图渲染一个面,应该由4个顶点结构来描述(在它的评论中说24是因为一个完整的立方体x6面对)同样的事情去为零数 – woofbluddywoof 2011-05-16 23:00:56

1

Huzzah !!更改&m_vertices&m_indecesm_verticesm_indeces在呼叫glBufferSubData()工作!

a-thank-yoh!

+1

不要忘记接受你的答案。 – genpfault 2011-12-15 20:56:42