2016-12-23 3 views
0

Ich möchte ein Quad mit OpenGL zeichnen, aber es funktioniert nicht, seit ich die Indizierung eingeführt. Ohne Indizes mein Code hat gut funktioniert und ich konnte glDrawArrays verwenden:Probleme beim Rendern eines Quadrats in OpenGL mit Hilfe von Indezes

#define GLEW_STATIC 
#include <GL\glew.h> 
#include <GLFW\glfw3.h> 
#include <GL\glew.h> 
#include <glm.hpp> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 

#define WIDTH 800 
#define HEIGHT 600 
#define TITLE "Dynamic" 

GLFWwindow* window; 
int vaoID; 


std::vector<float> vertices = {-0.5f, 0.5f, 0,  -0.5f, -0.5f, 0,  0.5f, -0.5f, 0, 0,  0.5f, 0.5f, 0}; 
std::vector<int> indices = { 0, 1, 3, 3, 1, 2 }; 
void loadToVAO(std::vector<float> vertices, std::vector<int> indices); 

void update() { 
    loadToVAO(vertices, indices); 
    while (!glfwWindowShouldClose(window)) { 
     glfwPollEvents(); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glClearColor(1, 0, 0, 1); 
     //glDrawArrays(GL_TRIANGLES, 0, 6); 
     glDrawElements(GL_TRIANGLES, 6, GL_INT, 0); 
     glfwSwapBuffers(window); 
    } 
} 

int main() { 
    if (!glfwInit()) 
     std::cout << "Couldn't initialize GLFW!" << std::endl; 

    window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL); 
    glfwMakeContextCurrent(window); 
    glfwSwapInterval(1); 

    if (GLEW_OK != glewInit()) 
     std::cout << "GLEW is not working!" << std::endl; 

    std::cout << "Your GL version: " << glGetString(GL_VERSION) << std::endl; 
    //glEnable(GL_CULL_FACE); 
    //glCullFace(GL_BACK); 
    update(); 
} 

void loadToVAO(std::vector<float> vertices, std::vector<int> indices) { 
    GLuint vertexVBO; 
    GLuint indicesVBO; 
    GLuint vaoID; 
    glGenBuffers(1, &vertexVBO); 
    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 
    glGenBuffers(1, &indicesVBO); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexVBO); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesVBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) * sizeof(int), &indices[0], GL_STATIC_DRAW); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) * sizeof(float), &vertices[0], GL_STATIC_DRAW); 
    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); 
    glEnableVertexAttribArray(0); 
} 

Antwort

1

Auch der sizeof Betreiber ist das Problem, da es die Größe des zugrunde liegenden Typs zurückgibt und nicht die Größe einiger Daten ein Zeiger auf. In der Zeile

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) * sizeof(int), &indices[0], GL_STATIC_DRAW); 

sizeof(indices) == sizeof(std::vector<int>), die die Größe des Vektors Objekts und nicht die Größe der Daten, die in dem Vektor enthalten ist. Der richtige Code hier wäre indices.size() zu verwenden, die die Anzahl der Elemente in dem Vektor zurückgibt:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(int), &indices[0], GL_STATIC_DRAW); 

Das gleiche gilt für den Upload der Eckpunkte.

Bearbeiten: Sie sollten Vektoren auch nicht nach Wert übergeben, es sei denn, es ist absolut notwendig. Atm Der Inhalt beider Vektoren wird kopiert, wenn Sie sie an loadToVAO übergeben. Wenn Sie die Funktionssignatur in

ändern, werden die Vektoren als Referenz übergeben und die Daten werden nicht kopiert.

Verwandte Themen