【问题标题】:Set color per sprite using SpriteBatch and vertex color?使用 SpriteBatch 和顶点颜色设置每个精灵的颜色?
【发布时间】:2017-02-02 03:24:07
【问题描述】:

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

首先,我使用制服进行此操作,并在其中传递了一种颜色,该颜色是我在着色器之外计算的。效果很好,但是太慢了。

然后我发现它太慢了,因为我每帧设置了很多次制服。我发现了以下内容:

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

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

我尝试这样做:

在渲染()中:

        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 着色器不是很熟悉,这可能就是为什么它现在什么都不画了。我想我错过了一些东西,我无法弄清楚是什么。

如何为精灵着色?让它工作得很快?

【问题讨论】:

  • 你不需要自定义着色器,默认的 SpriteBatch 着色器已经支持着色。

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


【解决方案1】:

Sprite 类和 TextureRegion 类之间有很大的不同。 Sprite 存储自己的顶点数据,因此您可以通过在 Sprite 而不是 SpriteBatch 上调用 setColor 来为它们着色。 Sprites 忽略 Batch 上设置的任何颜色。另一方面,Textures 和 TextureRegions 使用已在 Batch 上设置的最新颜色。

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

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多