【问题标题】:C++ OpenGL Color at each Vertex not drawn未绘制每个顶点的C ++ OpenGL颜色
【发布时间】:2015-04-03 22:37:01
【问题描述】:

我对 OpenGL 非常陌生,目前我正在尝试了解 VAO 和 VBO。

VAO 只是 VBO 的集合。

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

在下面的代码中,Vertex 结构体定义了顶点的 2 个属性,即顶点的位置和颜色。因此,需要 2 个 VBO 来存储这些信息。

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

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

【问题讨论】:

  • 您不必为每个顶点属性设置不同的 VBO。您可以将单个结构作为 Vertex,并为所有顶点设置一个 VBO。我很感激,这并不能回答你的问题;只是觉得你应该知道。
  • 谢谢!我不想成为一只懒惰的狐狸,所以我只想在深入研究之前把事情弄清楚:)
  • VAO 不是 VBO 的集合。 VAO 实际上是对如何在 VBO 集合中解包数据的描述。如果您有多个属性,则不需要使用多个 VBO,如果需要,可以将所有属性放在一个 VBO 中。见:stackoverflow.com/questions/21652546/…
  • 这与我今天早些时候回答的另一个问题相同:stackoverflow.com/questions/29426874/…

标签: c++ opengl


【解决方案1】:

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

【讨论】:

  • 如果链接的教程开始像我一样让您感到沮丧,请结合使用this series。这两篇教程似乎涵盖了大部分内容。
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 2014-12-18
  • 2015-12-25
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
相关资源
最近更新 更多