使用SpriteBatch和顶点颜色设置每个精灵的颜色?

时间:2016-09-24 09:31:00

标签: libgdx glsl shader fragment-shader vertex-shader

我想渲染许多精灵,我想使用着色器为每个精灵着色(用于彩虹效果)。 (精灵纹理最初为灰度)

首先我用制服做了它,在那里我传递了一种颜色,我在着色器外面计算了颜色。这很好,但是太慢了。

然后我发现它太慢了,因为我每帧都要多次设置那个制服。我找到了以下内容:

https://gamedev.stackexchange.com/questions/83145/set-color-by-uniform-per-sprite-using-libgdx-spritebatch

  

[...]通过定义顶点颜色可以轻松地在OpenGL中着色精灵。由于这种情况下的顶点是由SpriteBatch.draw()定义的,因此您应该使用SpriteBatch.setColor()设置色调。 [...]

我试图这样做:

在render()中:

        batch.setShader(shader);
        batch.setColor(.5f, .3f, 1, 1);
        sprite.draw(batch);
        batch.setColor(1, 1, 1, 1);
        batch.setShader(null);

顶点着色器:

void main() {
 v_color = a_color;
 v_texCoords = a_texCoord0;
 gl_Position = u_projTrans * a_position;
 }

片段着色器:

void main() {
    v_color = a_color*gl_Color*2.0;
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}

好吧,我对GLSL着色器并不熟悉,这也许就是为什么现在它没有画任何东西。我想我错过了什么,我无法弄清楚是什么。

如何用颜色调色精灵?这样它运作得很快?

1 个答案:

答案 0 :(得分:1)

Sprite类和TextureRegion类之间存在很大差异。 Sprite存储自己的顶点数据,因此您可以通过调用Sprite上的setColor而不是SpriteBatch来对它们进行着色。精灵忽略批处理上设置的任何颜色。另一方面,纹理和TextureRegions使用批处理上设置的最新颜色。

此外,您不能在片段着色器中使用顶点属性变量。您已在顶点着色器中将a_color复制到v_color,因此您在片段着色器中使用v_color。我不知道你在那里尝试用gl_Color做什么。