带有着色器的 SDL_Renderer 和 SDL_Texture?

Posted

技术标签:

【中文标题】带有着色器的 SDL_Renderer 和 SDL_Texture?【英文标题】:SDL_Renderer & SDL_Texture with shaders? 【发布时间】:2018-10-17 16:09:29 【问题描述】:

我正在使用 C++ 中的 SDL2 开发游戏,当前代码使用 SDL_Texture 和 SDL_Renderer 来处理精灵。问题是 HUD 应该有一个圆形的生命值条,而目前关于如何做到这一点的想法是使用灰度类型的图像并使用带有浮点数或字节传递给它的着色器进行渲染。有什么方法可以在执行此操作时继续使用 SDL_Renderer?

编辑:SDL_gpu 是否允许我将 OpenGL 和 SDL_Texture-esque 渲染结合起来,从而能够重用大量旧代码?

【问题讨论】:

【参考方案1】:

我为我的图形切换到 SDL-GPU,它允许在 GPU_Image 上使用 GLSL 着色器,这相当于 SDL_Texture。基本的着色器格式如下,使用 GPU_ShaderBlock 设置图像统一:

base.vert

#version 150

attribute vec3 gpu_Vertex;
attribute vec2 gpu_TexCoord;
attribute vec4 gpu_Color;
uniform mat4 gpu_ModelViewProjectionMatrix;

varying vec4 color;
varying vec2 texCoord;

void main (void) 

    color = gpu_Color;
    texCoord = vec2 (gpu_TexCoord);

    gl_Position = gpu_ModelViewProjectionMatrix * vec4 (gpu_Vertex, 1.0);


base.frag

#version 150

varying vec4 color;
varying vec2 texCoord;

uniform sampler2D tex;

void main (void) 

    gl_FragColor = texture (tex, texCoord);


这允许您根据需要使用 GLSL 着色器来操作纹理。一个简单的例子是所要求的圆形健康栏。我将使用的着色器示例获取红色值,如果它低于介于 0.0f 和 1.0f 之间的生命值浮点数,它将用半透明的红色替换它,如果它更高,则使其透明。这使您可以使用如下图所示的图像:

这是通过片段着色器(与上面相同的顶点着色器)运行的:

health.frag

#version 150

varying vec4 color;
varying vec2 texCoord;
varying float healthFloat;

uniform sampler2D tex;
uniform float health;

void main (void) 

    vec4 texColor = texture (tex, texCoord);

    if (texColor.x <= health) 

        texColor = vec4 (1.0, 0.0, 0.0, 0.8);

     else 

        texColor = vec4 (0.0, 0.0, 0.0, 0.0);

    

    gl_FragColor = texColor;


这给了我们一个看起来像这样的结果:

【讨论】:

以上是关于带有着色器的 SDL_Renderer 和 SDL_Texture?的主要内容,如果未能解决你的问题,请参考以下文章

SDL_Renderer opengl 冲突

用 SDL_Renderer 绘制 2D 东西,用 SDL_GLContext 绘制 OpenGL 东西

VAO 不使用着色器渲染颜色

带有着色器的 2D 照明 - 受窗口大小影响的光半径

带有片段着色器的 GLSL 仅渲染黑色 GL_POINTS

带有顶点/片段着色器的光。使用不同的变量。 (openGL)