使用 SDL_Renderer 绘制 2D 内容,使用 SDL_GLContext 绘制 OpenGL 内容

Drawing 2D stuff with SDL_Renderer and OpenGL stuff with SDL_GLContext

提问人:huzzm 提问时间:2/4/2015 最后编辑:Martin Ghuzzm 更新时间:4/14/2021 访问量:8745

问:

我学习 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 渲染正在覆盖它。

C++ OpenGL 渲染 SDL-2

评论

0赞 genpfault 2/4/2015
不要混搭 SDL Renderer 和 OpenGL,这条路上会埋下痛苦和疯狂。至少在这个时间点
0赞 huzzm 2/4/2015
好吧,这是不可能的。太糟糕了。

答:

4赞 Jonny D 2/10/2015 #1

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

评论

0赞 10/30/2016
链接已断开。
0赞 Vladimir Gamalyan 1/6/2018
SDL_gpu是否支持压缩纹理(如 DDS)而无需在加载时解压缩?
0赞 Jonny D 1/7/2018
目前没有任何对压缩纹理格式的支持(截至 2018 年 1 月),并且通常对格式的支持很少。更多的格式是可取的,当然,如果你需要更快地实现它,也欢迎补丁。
2赞 Ivan Rubinson 6/27/2016 #2

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

示例代码:http://www.sdltutorials.com/sdl-tip-sdl-surface-to-opengl-texture

评论

1赞 congusbongus 3/14/2017
这个答案值得详细说明。你能提供一些简短的代码示例吗?如何有效地将表面流式传输到 opengl 纹理中?
0赞 Frank Hale 3/1/2021
我一直在不停地寻找将近一天,但还没有找到一个适用于 2021 年 SDL2 的完整示例。我找到的几乎每个答案都说类似的东西,只需使用 Surface 渲染然后转换它,等等......我希望它被完整地记录下来。