gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:45:54 24 4
gpt4 key购买 nike

最近,我一直在从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com