在 OpenGL 中屏幕上没有任何显示 (GLFW/GLEW)

Nothing appears on screen in OpenGL (GLFW/GLEW)

最近,我一直在从 LWJGL(我有经验)过渡到 C++ 的 OpenGL API。我休假 this tutorial 因为我无法让我的 vbo 类 正常工作。代码如下:

#include "GL/glew.h"
#include "GLFW/glfw3.h"

#include <stdlib.h>
#include <stdio.h>

using namespace std;

GLFWwindow* window;

void init()
{

}

static const GLfloat g_vertex_buffer_data[] =
{
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

void render()
{
    glViewport(0, 0, 640, 480);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glDeleteBuffers(1, &vertexbuffer);

    glfwSwapBuffers(window);
    glfwPollEvents();
}

static void errorCallback(int error, const char* desc)
{
    fputs(desc, stderr);
}

static void keyCallback(GLFWwindow* window, int key, int scanCode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

void initWindow()
{
    glfwSetErrorCallback(errorCallback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    window = glfwCreateWindow(640, 480, "Hello, world!", NULL, NULL);

    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);
    glfwSetKeyCallback(window, keyCallback);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
        exit(EXIT_FAILURE);
}

void destroyWindow()
{
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

int main(int argCount, char **args)
{
    initWindow();
    init();
    while (!glfwWindowShouldClose(window))
        render();
    destroyWindow();
}

我一遍又一遍地阅读它并浏览了互联网。但是,我读过的其他帖子是更明显的错误。我可能在这里犯了一个非常明显的错误,我知道我每帧都创建一个缓冲区是多么低效,但这只是为了测试我是否可以让它工作。如果有人能告诉我我在这里做错了什么,我将不胜感激!

您正在使用 OpenGL 3.3 核心配置文件。在这种情况下,使用 Vertex Array Objects (VAO) is mandatory. The same is true for program objects. You have to specify your own shaders 不能使用固定函数流水线。 glLoadIdentity 调用指的是已弃用的矩阵堆栈功能,该功能也在核心配置文件中删除。

您的 glDrawArrays 调用应该生成一个 GL_INVALID_OPERATION,因为您在绘制调用时没有程序对象和 VAO 绑定。我通常建议至少为调试版本添加 GL 错误检查。如果您的目标 GL 版本支持它,我建议改用 debug context。这将使在开发过程中更容易发现错误。

另请注意,其中 none 个问题与从使用 LWJGL 的 java 切换到 C++ 有关。如果您之前使用带有 java 的遗留上下文/核心配置文件,您也可以在 C++ 中这样做(尽管我强烈建议您改为学习现代 GL),如果您使用现代的,您会遇到同样的问题LWJGL 的核心配置文件上下文。