麻烦简单的VBO示例

时间:2012-11-29 19:16:48

标签: c opengl-es vbo

我正在尝试运行一个超级简单的GLFW和VBO示例,但是我被卡住了。我已将glBeginglEnd用于其他项目,但我正在尝试更新我的代码以使用OpenGL ES 2,但是现在我只想尽可能向前兼容。 / p>

从网上的一些例子中,我想出了以下代码:

#include <stdlib.h>
#include <GL/glfw3.h>
#include <stdio.h>

#define bool int
#define true 1
#define false 0

const int width = 800;
const int height = 600;
bool opened = true;

GLuint glTriangle;
GLfloat triangle[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

void init() {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glGenBuffers(1, &glTriangle);
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle);
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_STATIC_DRAW);
}

void display() {
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, glTriangle);

    glVertexAttribPointer(0L, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);
}

int windowClose(GLFWwindow window) {
    opened = false;
    return GL_TRUE;
}

void main() {
    if (!glfwInit()) {
        printf("glfwInit didn't work\n");
        return;
    }

    GLFWwindow window = glfwCreateWindow(width, height, GLFW_WINDOWED, "Test", 0);
    glfwMakeContextCurrent(window);

    init();

    glfwSetWindowCloseCallback(window, windowClose);

    glfwSwapInterval(1);

    while(opened) {
        display();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwTerminate();
}

此代码运行,但是当我希望看到一个白色三角形时,我得到的只是黑屏。我试图避免像着色器/纹理这样的任何东西,直到我至少得到一些画在屏幕上的东西。

如果重要的话,我正在通过Mesa驱动程序在Linux上使用OpenGL 2.1版编译:{{1​​}}。

我做错了什么?如果我需要指定颜色信息,那么这是一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

您不应该将glEnableVertexAttribArray / glVertexAttribPointer与固定管道一起使用。 可能工作(我不是肯定的,我认为attrib 0可能是顶点attrib数组的别名,但不确定)。这样做并不正确。

如果您没有着色器,则应使用glEnableClientStateglVertexPointer作为顶点数据。

默认颜色是(1,1,1,1),所以我觉得你现在应该对颜色没问题了。