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

标签 c++ opengl rendering sdl sdl-2

我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 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

关于c++ - 使用 SDL_Renderer 绘制 2D 内容,使用 SDL_GLContext 绘制 OpenGL 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28307814/

相关文章:

c++ - 如何在另一个 C++ 命名空间内的全局命名空间中定义 friend ?

c++ - GLEW + cmake 链接失败 "undefined reference to symbol glDrawElements"+ "DSO missing from command line"

c - OpenGL VBO 仅在渲染时上传到 GPU

Jquery tmpl 和谷歌搜索引擎优化

c++ - 堆分配与 std::vector

c++ - 在 Visual Studio 2012 Express 中设置 C++ 调试环境

c++ - C++17 中的数组赋值

opengl - 图形管道的哪些部分是使用 CPU 和 GPU 完成的?

html - 与仅链接到硬文件相比,为网站使用内联/base64 图像要快多少?

javascript - 渲染对象实例中的颜色不正确,我完全不知道整个该死的世界为什么