glewInit() 失败与 "Missing GL version" , SDL2 OpenGL 上下文, cygwin 编译器
glewInit() fails with "Missing GL version", SDL2 OpenGL context, cygwin compiler
下面的程序创建了一个窗口,该窗口除了在按esc时关闭外什么都不做。当我用cygwin编译它时,没有任何错误。我使用的GLEW来自Cygwin Ports,SDL2版本为2.0.3,来自他们网站的SDL2-devel-2.0.3-mingw.tar.gz
下载。我在编译的可执行文件的目录中有SDL2.dll。
链接到:-lSDL2 -lSDL2main -lGLEW -lGLU -lGL -lSDL2 -lSDL2main -lGLEW -lGLU -lGL
,两次以确保所有内容都已链接。
还编译有:-std=c++11
在我的电脑上,打印出以下程序:
OpenGL Vendor: (null)
OpenGL Renderer: (null)
OpenGL Shading Language Version: (null)
OpenGL Extensions: (null)
Error initializing GLEW! Missing GL version
程序似乎不起作用。主要的问题是,如果我尝试调用,例如glGenVertexArrays
,程序将与STATUS_ACCESS_VIOLATION
一起崩溃。(请参阅此处的崩溃代码。我认为这与GLEW的错误Missing GL version
有关。
#include <cstdio>
#include <chrono>
#include <thread>
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <SDL2/SDL_opengl.h>
#include <GL/glu.h>
const int width = 1000;
const int height = 500;
bool Running = true;
#undef main
int main (int argc, char *argv[]) {
FILE* cdebug = fopen("cdebug.txt", "w");
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(cdebug, "SDL could not initialize! SDL Error: %sn", SDL_GetError()); fflush(cdebug);
}
#define setAttr(attr, value)
if (SDL_GL_SetAttribute(attr, value) < 0) {
fprintf(cdebug, "SDL failed to set %s to %s, SDL Error: %sn", #attr, #value, SDL_GetError()); fflush(cdebug);
}
setAttr(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
setAttr(SDL_GL_CONTEXT_MINOR_VERSION, 3);
setAttr(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
setAttr(SDL_GL_RED_SIZE, 8);
setAttr(SDL_GL_GREEN_SIZE, 8);
setAttr(SDL_GL_BLUE_SIZE, 8);
setAttr(SDL_GL_DEPTH_SIZE, 24);
setAttr(SDL_GL_DOUBLEBUFFER, 1);
#undef setAttr
/*
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
*/
SDL_Window *window = SDL_CreateWindow(
"test",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
640, 480,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
);
if (window == NULL) {
fprintf(cdebug, "Window could not be created! SDL Error: %sn", SDL_GetError()); fflush(cdebug);
}
SDL_GLContext GLContext = SDL_GL_CreateContext(window);
if (GLContext == NULL) {
fprintf(cdebug, "OpenGL context could not be created! SDL Error: %sn", SDL_GetError()); fflush(cdebug);
}
if (SDL_GL_MakeCurrent(window, GLContext) < 0) {
fprintf(cdebug, "OpenGL context could not be made current! SDL Error: %sn", SDL_GetError()); fflush(cdebug);
}
fprintf(cdebug, "OpenGL Vendor: %sn", glGetString(GL_VENDOR));
fprintf(cdebug, "OpenGL Renderer: %sn", glGetString(GL_RENDERER));
fprintf(cdebug, "OpenGL Shading Language Version: %sn", glGetString(GL_SHADING_LANGUAGE_VERSION));
fprintf(cdebug, "OpenGL Extensions: %sn", glGetString(GL_EXTENSIONS));
fflush(cdebug);
glewExperimental = GL_TRUE;
{
GLenum glewError = glewInit();
if (glewError != GLEW_OK) {
fprintf(cdebug, "Error initializing GLEW! %sn", glewGetErrorString(glewError)); fflush(cdebug);
}
}
SDL_Event event;
while (Running) {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYUP: {
switch (event.key.keysym.scancode) {
case SDL_SCANCODE_ESCAPE:
Running = false;
break;
}
break;
}
}
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(window);
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
SDL_GL_DeleteContext(GLContext);
SDL_DestroyWindow(window);
window = NULL;
SDL_Quit();
return 0;
}
您正在以不应该的方式混合cygwin和mingw。
如果使用cygwin的工具链和-lGL
等,则链接到cygwin中的OpenGL,它不是windows上的原生OpenGL库,而是cygwin X服务器提供的实现GLX协议的OpenGL库。
mingw版本的SDL将在windows上使用本机GL-lib(opengl32.dll
),使用wgl API。因此SDL甚至可能为您创建一个上下文,但您的程序调用的GL函数属于一个完全不同的GL实现——您的程序从未为其创建GL上下文。
解决方案是坚持使用其中一个:完全使用cygwin、一个cygwin版本的SDL和一个cygwin X服务器。然而,这不是我建议的路径。我不知道这是否会给你带来一些硬件加速。
更有用的解决方案是,对于整个项目,不使用cygwin,而是使用mingw版本的GLEW。这将产生一个完全原生的windows二进制库,它将使用具有驱动程序提供的所有功能的原生OpenGL库,而不需要cygwin的dll,尤其是不需要cygwin的X服务器。
我设法让事情以一种奇怪的方式进行。
我使用的是SDL2的自编译版本,但SDL网站提供的SDL2-devel-2.0.3-mingw.tar.gz
似乎也能正常工作,并且使用它们的组合(如mingw版本的libs和自编译.dll)似乎也能工作。
对于GLEW,我使用自己的编译版本。为了编译这个,我使用了他们网站的来源glew-1.11.0.zip
并提取了这个。然后我编辑了glew-1.11.0/Makefile
,并将第24行编辑为SYSTEM = cygming
。然后,在第7行和第8行的glew-1.11.0/config/Makefile.cygming
中,我删除了-mno-cygwin
标志(因此该行为CC := gcc
和LD := gcc
),并将-D_WIN32
添加到第10行(因此该行将变为CFLAGS.SO = -DGLEW_BUILD -D_WIN32
)。然后在glew-1.11.0
中,我运行make all
并让它编译。之后,我将glew-1.11.0/include/GL
复制到我的includes目录中。接下来,我将glew-1.11.0/lib/libglew32.dll.a
复制到我的libs文件夹中。我还将glew-1.11.0/lib/glew32.dll
复制到了.exe的文件夹中。然后,为了使它不产生链接器错误,我必须在#include <GL/glew.h>
之前放置一个#define _WIN32
。
为了链接所有内容,我设法用最少的-lSDL2 -lSDL2main -lglew32.dll -lopengl32
编译了它。
- SDL2 OpenGL窗口立即关闭
- 用SDL TTF显示带有SDL2和OpenGL的文本
- 用SDL2和OpenGL显示蓝色
- 使用 SDL2 指定 OpenGL 版本
- SDL2要么丢失OpenGL上下文或未定义的函数
- SDL2 OpenGL SDL2_TTF:显示文本
- iOS中的垂直同步(SDL2/OpenGL ES)
- 我的OpenGL和SDL2代码有什么问题
- 如何将opengl 3.3渲染到SDL2纹理中
- SDL2 OpenGL 4.2上下文,具有0个颜色位和0个深度位
- OpenGL 4.1 SDL2 Mac操作系统
- 我是否正在删除 sdl2 和 opengl 正确的 c++
- 有没有人有PBO + SDL2.0 + OpenGL的例子
- 如何使用索引的 PNG 图像作为 SDL2/OpenGL 的纹理
- 如何在 SDL2.0 OpenGL 中调整视口大小
- SDL2 - 检查是否创建了 OpenGL 上下文
- SDL2 主滴答系统(openGL)
- SDL2 + OpenGL = Gnome 3 错误地抱怨"Program not responding"
- Android NDK SDL2 OpenGL ES 2 影子映射(定向)- 是否可能
- OpenGL/SDL2双深度缓冲