使用SDL_GLContext使用SDL_Renderer和OpenGL填充2D内容

时间:2015-02-03 20:09:37

标签: c++ opengl rendering sdl sdl-2

我一直在学习SDL 2D编程,现在我想创建一个使用SDL和OpenGL组合的程序。我这样设置:

SDL_Init(SDL_INIT_VIDEO);

window = SDL_CreateWindow("SDL and OpenGL", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);

context = SDL_GL_CreateContext(window);

该程序现在只是一个黑色窗口,使用OpenGl显示白线。以下是渲染的代码:

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);         

glBegin(GL_LINES);     
glVertex2d(1, 0);
glVertex2d(-1, 0);
glEnd();

SDL_GL_SwapWindow(window);  

所以问题是,我想使用纯SDL和SDL_Renderer对象另外渲染纹理,就像我之前没有使用OpenGL那样。我试过了,但它没有奏效。甚至可以这样做以及如何做到这一点?我做的是创建一个SDL_Renderer,然后在绘制OpenGL之后做这个:

SDL_Rect fillRect;
fillRect.w = 50;
fillRect.h = 50;
fillRect.x = 0;
fillRect.y = 0; 

SDL_SetRenderDrawColor(renderer, 100, 200, 100, 0);
SDL_RenderFillRect(renderer, &fillRect);

SDL_RenderPresent(renderer);    

但这不起作用。矩形未显示,但在几毫秒内它略显出现。我觉得OpenGL渲染会覆盖它。

2 个答案:

答案 0 :(得分:3)

SDL使用OpenGL(或在某些情况下使用Direct3D),OpenGL具有影响程序中GL调用的内部状态。当前版本的SDL没有明确指出它改变或依赖于哪个状态的任何调用,并且它不包括重置为已知状态的功能。这意味着您不应该将SDL_Renderer与OpenGL混合使用。

但是,如果您现在真的想要这个功能,可以试试SDL_gpu(注意:我是作者)。它支持与OpenGL调用和自定义着色器混合。您可能希望指定所需的OpenGL API版本(例如,使用GPU_InitRenderer(GPU_RENDERER_OPENGL_1,...))并重置SDL_gpu使用每个帧的GL状态(GPU_ResetRendererState())。查看SDL_gpu源代码库中的3d演示了解更多信息。

https://github.com/grimfang4/sdl-gpu/blob/master/demos/3d/main.c

答案 1 :(得分:0)

您可以使用SDL渲染到SDL_Surface,然后将其转换为纹理&使用OpenGL将其上传到GPU。