2016-12-23 113 views
0

我想用OpenGL画一个四边形,但是它不起作用,因为我引入了索引。如果没有索引我的代码工作正常,我可以用glDrawArrays用OpenGL渲染四边形的问题

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

回答

1

再次,sizeof运营商的问题,因为它返回的基本类型的大小,而不是一些数据大小的指针指向。在线路

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

sizeof(indices) == sizeof(std::vector<int>)它是矢量对象的大小和包含于载体中的数据的大小。这里的正确的代码是使用indices.size()返回矢量中元素的个数:

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

同样为顶点的上传。

编辑:你不应该通过价值传递载体,除非它是绝对必要的。当您将它们传递给loadToVAO时,Atm将复制这两个向量的内容。如果将函数签名更改为

void loadToVAO(std::vector<float>& vertices, std::vector<int>& indices) 

向量通过引用传递并且数据不会被复制。