2016-09-24 290 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