简单 VBO 示例的问题

Posted

技术标签:

【中文标题】简单 VBO 示例的问题【英文标题】:Trouble with simple VBO example 【发布时间】:2012-11-29 19:16:47 【问题描述】:

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

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

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

此代码运行,但我得到的只是一个黑屏,而我预计会看到一个白色三角形。我尽量避免像着色器/纹理这样的花哨的东西,直到我至少在屏幕上画了一些东西。

如果重要,我将在 Linux 上通过 Mesa 驱动程序使用 OpenGL 版本 2.1 编译:gcc -o test -lGL -lglfw -lm test.c

我做错了什么?如果我需要指定颜色信息,有什么简单的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

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

如果您没有着色器,您应该使用glEnableClientStateglVertexPointer 来处理顶点数据。

默认颜色是 (1,1,1,1),所以我认为你现在应该可以接受颜色了。

【讨论】:

glEnableClientStateglVertexPointer 不是已弃用吗?这就是我使用其他两个的原因。 @tjameson:不;它们被删除,而不是被弃用。固定功能管道的其余部分也是如此。如果您想依赖非核心 3.1+ OpenGL 功能,您需要一个着色器来渲染。 我想这是给出问题的最佳答案。我决定弄清楚着色器(实际上并不太难),现在它正在工作。谢谢@NicolBolas,这正是我想要的。

以上是关于简单 VBO 示例的问题的主要内容,如果未能解决你的问题,请参考以下文章

iPhone Cheetah 3D OpenGL ES 顶点缓冲对象 (VBO) 示例

未能在 OpenGL/Android 中使用 VBO

使用 OpenGL 的 VBO 的问题

OpenGL - 正确地将 VAO 定义与 VBO 和其他缓冲区创建分开

为啥使用 VBO 和/或 IBO 而不是简单的顶点数据?

如何动态编辑 VBO