OpenGL中没有任何内容出现在屏幕上(GLFW / GLEW)

时间:2015-12-23 18:50:09

标签: c++ opengl glfw glew

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

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

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

1 个答案:

答案 0 :(得分:2)

您正在使用OpenGL 3.3核心配置文件。在这种情况下,使用Vertex Array Objects (VAO) 必需。程序对象也是如此。您必须指定自己的shaders,并且无法使用固定功能pipleline。 glLoadIdentity调用是指已弃用的矩阵堆栈功能,也会在核心配置文件中删除。

您的glDrawArrays调用应生成GL_INVALID_OPERATION,因为您在绘制调用时没有程序对象且没有绑定VAO。我通常建议至少为调试版本添加GL错误检查。如果您要定位的GL版本支持它,我建议您使用debug context。它会使开发过程中的定位误差变得更加容易。

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