【发布时间】:2016-09-29 06:38:01
【问题描述】:
我之前已经使用过 SDL2,现在我尝试将它与 openGL 2.1 一起使用。 但是当我尝试创建渲染器时,我得到“无效的渲染器”。 为了创建渲染器,我之前已经为简单的 SDL2 项目使用了同一行,但使用 openGL 似乎无法正常工作。 有人知道为什么吗? 我试图更改 CreateRenderer 的标志,除了“SDL_RENDERER_SOFTWARE”之外,我对所有这些标志都有这个错误,但是我无法正确抓取输入,当鼠标光标离开窗口时,我有这个错误:“无效窗口”。
这是我的代码:
#include <SDL2/SDL.h>
#include <GL/glut.h>
#include <iostream>
const int WIDTH = 500, HEIGHT = 500;
using namespace std;
SDL_Window* pWindow;
SDL_Renderer* pRenderer;
SDL_Event event;
void initOGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70,(double)WIDTH/HEIGHT,1,1000);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}
void initSDL()
{
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
cout << "Video init failed" << endl;
exit(EXIT_FAILURE);
}
cout << "Video initialized" << endl;
// Window creation
pWindow = SDL_CreateWindow("Test OGL w/ SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
if (!pWindow)
{
cout << "Window creation failed" << endl;
exit(EXIT_FAILURE);
}
cout << "Window created" << endl;
// Renderer creation
pRenderer = SDL_CreateRenderer(pWindow, -1, SDL_RENDERER_ACCELERATED);
if (!pRenderer)
{
cout << "Renderer creation failed" << endl;
}
cout << "Renderer created" << endl;
// OGL version
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
// OGL context
SDL_GLContext contexteOGL = SDL_GL_CreateContext(pWindow);
if (!contexteOGL)
{
cout << "Echec création du contexte" << endl;
}
cout << "Contexte créé" << endl;
}
int main(int argc, char const *argv[])
{
initSDL();
initOGL();
cout << "SDL_ERROR : " << SDL_GetError() << endl;
return 0;
}
【问题讨论】:
-
如果您确实需要 OpenGL 2.1,我建议您索取兼容性配置文件。但您的平台可能不支持它。 2.1 现在真的很老了,你应该使用更新的标准版本 >= 3.0
-
混合
SDL_CreateRenderer和SDL_GL_CreateContext看起来不是一个好主意。充其量,它将用新的上下文替换上下文。如果您不使用 SDL2 渲染 API,请不要创建渲染器,只需设置上下文并使用 GL 进行绘制。 -
感谢您的回答。 Jan Henke :是的,但我认为我的硬件不支持 >= openGL 加上我一点也不熟悉,我没有时间重新启动和翻译我的代码,因为它是一个项目,我只剩下一个月了:/ keltar:是的,但我认为我需要 SDL 来处理纹理,不是吗?
-
@JoutenJouJouHakujou 不,如果您不打算使用
SDL_RenderCopy类的函数,则不需要 SDL_Renderer。实际上使用 SDL 来创建窗口/上下文、输入处理和线程,同时将所有绘图留给 GL 是一种常见的做法,甚至在 SDL2 之前也是如此(SDL -
@JoutenJouJouHakujou 通过手动生成 GL 纹理并将
surface->pixels输入其中,例如第二个帖子opengl.org/discussion_boards/showthread.php/…。 “无效渲染器”SDL 错误和if(!pRenderer)触发是不同的东西 - 我很难相信您仍然可以使用 NULL 渲染器,而“无效渲染器”可能在初始化期间被标记但实际上不是错误(选择 stackoverflow.com/questions/31628174/sdl2-invalid-renderer来自“相关问题”,令人惊讶的是这正是我想到的问题)。