[英]Can't initialize OpenGL
我有些麻烦,无法上班。 初始化时,出现错误:缺少GL版本。 我也无法创建上下文:OpenGL未初始化。 这是我的代码:
#include <GL\glew.h>
#include <GL\GLU.h>
#include <SDL2\SDL.h>
#include <SDL2\SDL_opengl.h>
#include <iostream>
#undef main
SDL_GLContext context;
SDL_Renderer * renderer;
SDL_Window * window;
int main(int argc, char *argv[]) {
//init SDL
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
fprintf(stderr, "\n> Unable to initialize SDL: %s\n", SDL_GetError());
}
window = SDL_CreateWindow("Cri Engine 3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
if (window == nullptr)
{
printf("> Window could not be created! SDL Error: %s\n", SDL_GetError());
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
context = SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, context);
if (context == NULL) {
printf("> OpenGL context could not be created! SDL Error: %s\n", SDL_GetError());
}
//Glew
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (GLEW_OK != err) {
fprintf(stderr, "> Error: %s\n", glewGetErrorString(err));
}
fprintf(stdout, "> Using GLEW %s\n", glewGetString(GLEW_VERSION));
glViewport(0, 0, 800, 600);
SDL_Quit();
return 0;
}
这些是我使用的链接器设置(按此顺序):glew32.lib,glu32.lib,opengl32.lib,SDL2.lib,SDL2main.lib。
我确定正确包含了这些库。 PS:这是我的第一篇文章,如果我缺少一些信息,请告诉我!
您缺少SDL_CreateWindow()
SDL_WINDOW_OPENGL
标志。
另外,您必须删除#undef main
。 否则,您将需要自己进行一些低级初始化,而您不需要这样做。
另一件事:必须从核心配置文件( SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
)切换到兼容性配置文件SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
因为当您要求GLEW在Windows上初始化核心配置文件上下文时,它会崩溃。
此外,核心的许多部分都是多余的:
SDL_WINDOW_SHOWN
默认情况下已使用。 SDL_GL_MakeCurrent(window, context);
-只有一个上下文时不需要。 glViewport(0, 0, 800, 600);
-创建上下文时,它将自动为您设置正确的视口。 SDL_Quit();
-程序结束时,您无需调用任何内容 。 它什么都不做,但是会使程序关闭速度变慢。 (至少这就是它在Windows上的工作方式。正如@keltar指出的那样,在Linux上有时有时是必要的。此外,它还可以防止泄漏等泄漏检测器对SDL内部结构大吼大叫。) #include <SDL2\\SDL_opengl.h>
-它代替了<GL/gl.h>
,您不需要它,因为您已经有了<GL\\glew.h>
。 尝试将SDL_WINDOW_OPENGL
添加到窗口创建标志中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.