如何在片段着色器中平铺部分纹理

时间:2019-06-25 14:47:57

标签: opengl glsl defold

使用Defold游戏引擎,它将图集中的纹理强制为2的幂(384x216-> 512x256)。 Defold不支持视差背景,只有以下选项:

  1. 使用代码管理多个精灵定位
  2. 在单个精灵上使用着色器对其进行管理。

第一个选项不是一种优雅且优化的方法,因此我选择了选项Nr.2。

我有一个非常简单的着色器代码,它可以使用初始精灵的比例和偏移量。如果sprite的大小为2的幂,它可以工作。但是,我几乎不了解此知识,所以我不知道如何平铺纹理的一部分(最初不是2的幂)。我可以计算出比例为vec2(384/512,216/256)的制服。

varying mediump vec2 var_texcoord0;
uniform lowp sampler2D texture_sampler;
uniform lowp vec4 tint;
uniform lowp vec4 scale;
uniform lowp vec4 offset;
void main()
{
   // Pre-multiply alpha since all runtime textures already are
   lowp vec2 uv = vec2(var_texcoord0.x *scale.x +offset.x, var_texcoord0.y *scale.y +offset.y);
   gl_FragColor = tint * texture2D( texture_sampler, uv);
}

我希望得到平铺的背景,但是由于2的强制力量,它有空白空间。

1 个答案:

答案 0 :(得分:2)

所以我在Defold社区获得了帮助,最终得到了这样的片段着色器:

varying mediump vec2 var_texcoord0;

uniform lowp sampler2D texture_sampler;
uniform lowp vec4 tint;
uniform lowp vec4 size; //actually vec2 of pecentage (x,y)
uniform lowp vec4 scale;
uniform lowp vec4 offset;

void main()
{
    lowp vec2 uv = vec2(var_texcoord0.x *scale.x +offset.x, var_texcoord0.y *scale.y +offset.y);
    uv = vec2(mod(uv.x, size.x), mod(uv.y, size.y));
    gl_FragColor = tint * texture2D( texture_sampler, uv);
}