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