2016-09-24 210 views
0

我想渲染许多精灵,并且我想用着色器为每个精灵着色(彩虹效果)。 (雪碧纹理最初是在灰度)使用SpriteBatch和顶点颜色为每个精灵设置颜色?

首先我做了一个制服,在那里我传递了一种颜色,我在着色器之外计算了颜色。这工作得很好,但速度太慢。

然后我发现它太慢了,因为我每次都会将这个制服设置多次。我发现:

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着色器,也可能是为什么现在不绘制任何东西。我想我错过了一些东西,我无法弄清楚什么。

我该如何为一个颜色的精灵着色?这样它的工作很快?

+0

您不需要自定义着色器,默认的SpriteBatch着色器已经支持着色。 – Xoppa

回答

1

Sprite类和TextureRegion类有很大不同。 Sprite存储他们自己的顶点数据,所以你通过在Sprite上调用setColor而不是SpriteBatch来着色它们。精灵会忽略批处理中设置的任何颜色。另一方面,纹理和纹理区域使用在批处理中设置的最新颜色。

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

+0

好的,谢谢! – red1575