c++ - OpenGL (GLFW/GLEW) 屏幕上没有任何显示

标签 c++ 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)强制性的。程序对象也是如此。您必须指定自己的 shaders并且不能使用固定函数流水线。 glLoadIdentity 调用引用已弃用的矩阵堆栈功能,该功能也在核心配置文件中删除。

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

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

关于c++ - OpenGL (GLFW/GLEW) 屏幕上没有任何显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441935/

相关文章:

c++ - 不同编译器的不同输出 - C 和 C++

c++ - 如何使用 glut 和 openGL 改变颜色?

c++ - GLFW get Monitors count = 0,附加了另外两个监视器

opengl - 关于低于 GL 3.2 的 GLFW 行为的问题

c++ - 将 C++ 方法作为函数指针传递?

c++ - 模板元编程如何专注于集合

c++ 运算符重载 += 有效但 << 无效

c++ - OpenCV 无法从 isight 网络摄像头捕获图像

c++ - `xxxx' : looks like a function definition, 但是没有参数列表;跳过明显的 body

c# - 纹理映射 - 拉伸(stretch)