带有着色器的 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?的主要内容,如果未能解决你的问题,请参考以下文章