提问人:huzzm 提问时间:2/4/2015 最后编辑:Martin Ghuzzm 更新时间:4/14/2021 访问量:8745
使用 SDL_Renderer 绘制 2D 内容,使用 SDL_GLContext 绘制 OpenGL 内容
Drawing 2D stuff with SDL_Renderer and OpenGL stuff with SDL_GLContext
问:
我学习 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 渲染正在覆盖它。
答:
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
评论
您可以使用 SDL 渲染到SDL_Surface,然后将其转换为纹理并使用 OpenGL 将其上传到 GPU。
示例代码:http://www.sdltutorials.com/sdl-tip-sdl-surface-to-opengl-texture
评论