2015-04-03 260 views
0

我对OpenGL非常陌生,现在我想了解VAO和VBO。在每个顶点没有绘制C++ OpenGL颜色

VAO只是一个VBO的集合。

每个VBO是一个对象的属性,对象,颜色在每个对象的顶点的顶点的坐标等

在下面的代码,顶点结构定义一个顶点,其是位置的2个属性和顶点的颜色。因此,需要2个维也纳国际组织来存储这些信息。

我的问题是:我能够在屏幕上绘制三角形,但每个顶点的颜色似乎没有绘制。为什么会发生?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <glm/glm.hpp> 

// create vertex buffer 
GLuint vertexbuffer; 
struct Vertex{ 
    GLdouble position[3]; 
    GLfloat color[3]; 
}; 
static const GLfloat vertex_data[] = { 
    -0.7f, -0.7f, 0.0f, 
    0.7f, -0.7f, 0.0f, 
    0.0f, 1.0f, 0.0f 
}; 

void SetupGeometry(){ 
    const struct Vertex triangle[3] = { 
     {{-0.7, -0.7, 0.0}, {1.0f, 0.0f, 0.0f}}, 
     {{0.7, -0.7, 0.0}, {0.0f, 1.0f, 0.0f}}, 
     {{0.0, 1.0, 0.0}, {0.0f, 0.0f, 1.0f}} 
    }; 

    //GLuint VertexArrayID; 
    //glGenVertexArrays(1, &VertexArrayID); 
    //glBindVertexArray(VertexArrayID); 

    //generate 1 buffer, put the resulting identifier in vertex buffer 
    glGenBuffers(1, &vertexbuffer); 

    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); 

    // give our vertices to OpenGL 
    glBufferData(GL_ARRAY_BUFFER, 3*sizeof(struct Vertex), triangle, GL_STATIC_DRAW); 

    // GLuint index, GLuint size, GLenum type, GLboolean normalized, GLsizei stride, const void *offset 
    glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, sizeof(struct Vertex), (void*) offsetof(struct Vertex, position)); 

    // any newly created VAO disables array access for all attributes 
    // array access is enabled by binding the VAO in SetupGeometry and calling: 
    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(struct Vertex), (void*) offsetof(struct Vertex, color)); 
    glEnableVertexAttribArray(1); 
} 

void SetupShaders(void){ 

} 

void Render(int i){ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glDrawArrays(GL_LINE_LOOP, 0, 3); 
} 

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods){ 
    if((key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) && action != GLFW_PRESS){ 
     glfwSetWindowShouldClose(window, GL_TRUE); 
    } 
} 

int main(void) { 
    /* Create a windowed mode window and its OpenGL context */ 
    GLFWwindow* window; 
    if(!glfwInit()) { 
      printf("Failed to start GLFW\n"); 
      exit(EXIT_FAILURE); 
    } 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) { 
     glfwTerminate(); 
     printf("GLFW Failed to start\n"); 
     return -1; 
    } 
    /* Make the window's context current */ 
    glfwMakeContextCurrent(window); // IMPORTANT: Must be done so glew recognises OpenGL 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    int err = glewInit(); 
    if (glewInit() != GLEW_OK) { 
     /* Problem: glewInit failed, something is seriously wrong. */ 
     fprintf(stderr, "Error initializing GLEW: %s\n", glewGetErrorString(err)); 
    } 
    fprintf(stderr, "Glew done\n"); 
    fprintf(stderr, "GL VERSION INFO %s\n", glGetString(GL_VERSION)); 
    glfwSetKeyCallback(window, key_callback); 

    SetupGeometry(); 
    while(!glfwWindowShouldClose(window)){ 
     Render(0); 
     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 
} 
+0

您不必为每个顶点属性具有不同的VBO。您可以将一个结构作为顶点,并为所有顶点都有一个VBO。 我明白,那不能回答你的问题;只是觉得你应该知道。 – 2015-04-03 22:47:04

+0

谢谢!我不想成为一个懒惰的狐狸,所以我只想在深入潜水之前弄清楚事情:) – 2015-04-03 22:51:02

+1

VAO不是VBO的集合。一个VAO实际上是对如何在一组维也纳组织中解开数据的说明。如果您有多个属性,则不需要使用多个VBO,如果需要,可以将所有属性放在一个VBO中。请参阅:http://stackoverflow.com/questions/21652546/what-is-the-role-of-glbindvertexarrays-vs-glbindbuffer-and-what-is-their-relatio/21652955#21652955 – 2015-04-03 23:20:05

回答

1

您似乎没有包含任何着色器。您需要使用片段着色器来设置三角形的颜色值。 This link应该可以帮到你。

+2

并且为了防止链接教程开始让您像对待我一样受挫,请使用[本系列](https://www.youtube.com/watch?v=hQ2I8D2ogrs&list=PLSPw4ASQYyynKPY0I-QFHK0iJTjnvNUys)。这两篇教程似乎涵盖了大部分观点。 – 2015-04-03 23:20:40