关于C#:使用SDL_Renderer绘制2D材质和使用SDL_GLContext绘制OpenGL材质

Drawing 2D stuff with SDL_Renderer and OpenGL stuff with SDL_GLContext

一段时间以来,我一直在学习有关SDL 2D编程的知识,现在我想使用SDL和OpenGL结合创建一个程序。我是这样设置的:

1
2
3
4
5
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显示白线。这是渲染的代码:

1
2
3
4
5
6
7
8
9
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);        

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

SDL_GL_SwapWindow(window);

问题是,我想像以前在没有OpenGL的情况下一样,使用纯SDL和SDL_Renderer对象另外渲染纹理。我尝试了一下,但是没有用。甚至有可能做到这一点,以及如何做到?我所做的是创建一个SDL_Renderer,然后在绘制OpenGL内容后执行以下操作:

1
2
3
4
5
6
7
8
9
10
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,...))并重置GL状态,即SDL_gpu使用每个帧的GL状态(GPU_ResetRendererState())。在SDL_gpu源存储库中查看3d演示以获取更多信息。

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


您可以使用SDL渲染到SDL_Surface,然后将其转换为纹理