使用 SpriteBatch 和顶点颜色设置每个精灵的颜色?
Set color per sprite using SpriteBatch and vertex color?
我想渲染许多精灵,并且我想使用着色器为每个精灵着色(以获得彩虹效果)。 (精灵纹理最初是灰度)
首先,我用制服来做,我传递了一种颜色,这是我在着色器外计算的。效果很好,但是太慢了。
然后我发现它太慢了,因为我每帧设置了很多次统一。我发现了以下内容:
[...] Tinting a sprite in OpenGL can easily be done by defining the vertex colors. Since the vertices in this case are defined by SpriteBatch.draw(), you should set the tint with 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 着色器,这也许就是为什么现在它不绘制任何东西的原因。我想我错过了什么,我不知道是什么。
如何给 sprite 着色?这样它才能快速工作?
Sprite class 和 TextureRegion class 有很大区别。 Sprite 存储自己的顶点数据,因此您可以通过在 Sprite 上调用 setColor
而不是 SpriteBatch 来为它们着色。精灵忽略批处理上设置的任何颜色。另一方面,Textures 和 TextureRegions 使用已在 Batch 上设置的最新颜色。
此外,您不能在片段着色器中使用顶点属性变量。您已经在顶点着色器中将 a_color
复制到 v_color
,因此您在片段着色器中使用 v_color
。我不知道你想用 gl_Color
做什么。
我想渲染许多精灵,并且我想使用着色器为每个精灵着色(以获得彩虹效果)。 (精灵纹理最初是灰度)
首先,我用制服来做,我传递了一种颜色,这是我在着色器外计算的。效果很好,但是太慢了。
然后我发现它太慢了,因为我每帧设置了很多次统一。我发现了以下内容:
[...] Tinting a sprite in OpenGL can easily be done by defining the vertex colors. Since the vertices in this case are defined by SpriteBatch.draw(), you should set the tint with 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 着色器,这也许就是为什么现在它不绘制任何东西的原因。我想我错过了什么,我不知道是什么。
如何给 sprite 着色?这样它才能快速工作?
Sprite class 和 TextureRegion class 有很大区别。 Sprite 存储自己的顶点数据,因此您可以通过在 Sprite 上调用 setColor
而不是 SpriteBatch 来为它们着色。精灵忽略批处理上设置的任何颜色。另一方面,Textures 和 TextureRegions 使用已在 Batch 上设置的最新颜色。
此外,您不能在片段着色器中使用顶点属性变量。您已经在顶点着色器中将 a_color
复制到 v_color
,因此您在片段着色器中使用 v_color
。我不知道你想用 gl_Color
做什么。