VBO не будет отображаться (sdl с glew)

#c #opengl #sdl #glew #vbo

#c #opengl #sdl #glew #vbo

Вопрос:

Я только начинаю использовать 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, amp;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, amp;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, amp;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, amp;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))
  

Но я просто не могу заставить что-либо отображать — применить ту же текстуру и т.д. для куба в немедленном режиме отображается нормально.

Странно то, что иногда отображается что-то очень странное, которое каждый раз отличается — так что, возможно, это какая-то ошибка инициализации?

Комментарии:

1. Множественное число «index» — это «индексы» или «indexes».

2. Что говорит вам glGetError ()?

3. glDrawElements Работает ли у вас без VBO?

4. Кстати, offsetof (который является стандартным макросом) был бы намного лучше вашего BUFFER_OFFSET .

5. glGetError(), похоже, возвращает GL_NO_ERROR

Ответ №1:

Изменение amp;m_vertices and amp;m_indeces на m_vertices и m_indeces в вызове на glBufferSubData() сработало!

Ответ №2:

Ни один из ваших размеров не соответствует комментариям, я подозреваю, что вы читаете конец VBO.

Комментарии:

1. Привет, извините, я, очевидно, забыл исправить комментарии — я думаю, что размеры правильные, потому что в настоящее время я пытаюсь отобразить только одну грань, которая должна быть описана 4 структурами вершин (в комментариях указано 24, потому что для полного куба x6 граней) то же самое касается количества индексов