之前我已经使用过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;
}
答案 0 :(得分:0)
我可能是一个内置支持的驱动程序&#34;例如,如果您在Linux中从源代码编译SDL,则会出现问题。
尝试使用&#34; flags = 0&#34;在SDL_CreateRenderer中(pWindow,-1,0);
然后测试实际选择的渲染器(这是在C中):
SDL_RendererInfo ri;
SDL_GetRendererInfo(pRenderer, &ri);
int n = SDL_GetNumRenderDrivers();
printf("Rendering drivers (%i):", n);
for(int i = 0; i < n; i++) {
SDL_RendererInfo info;
SDL_GetRenderDriverInfo(i, &info);
printf(" '%s'", info.name);
}
printf(", active = '%s'\n", ri.name);
完整源代码为here