无法初始化 OpenGL
Can't initialize OpenGL
我无法正常工作。初始化 glew 时出现错误:缺少 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:这是我的第一个 post,如果我遗漏了一些信息,请告诉我!
尝试将 SDL_WINDOW_OPENGL
添加到 window 创建标志。
您缺少 SDL_CreateWindow()
的 SDL_WINDOW_OPENGL
标志。
此外,您必须删除#undef main
。
否则你需要自己做一些低级的初始化,而你并没有这样做。
另一件事:您必须从核心配置文件 (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 上的工作方式。在 Linux 上,有时是必要的,正如@keltar 指出的那样。此外,它还可以防止像 valgring 这样的泄漏检测器对您大喊大叫关于 SDL 内部结构。 )
#include <SDL2\SDL_opengl.h>
- 它是 <GL/gl.h>
的替代品,您不需要它,因为您已经拥有 <GL\glew.h>
.
我无法正常工作。初始化 glew 时出现错误:缺少 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:这是我的第一个 post,如果我遗漏了一些信息,请告诉我!
尝试将 SDL_WINDOW_OPENGL
添加到 window 创建标志。
您缺少 SDL_CreateWindow()
的 SDL_WINDOW_OPENGL
标志。
此外,您必须删除#undef main
。
否则你需要自己做一些低级的初始化,而你并没有这样做。
另一件事:您必须从核心配置文件 (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 上的工作方式。在 Linux 上,有时是必要的,正如@keltar 指出的那样。此外,它还可以防止像 valgring 这样的泄漏检测器对您大喊大叫关于 SDL 内部结构。 )#include <SDL2\SDL_opengl.h>
- 它是<GL/gl.h>
的替代品,您不需要它,因为您已经拥有<GL\glew.h>
.