2016-09-24 9 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. Спрайты хранят собственные данные вершин, поэтому вы их окрашиваете, вызывая setColor на Sprite вместо SpriteBatch. Sprites игнорируют любой цвет, установленный в пакете. С другой стороны, текстуры и TextureRegions используют последний цвет, который был установлен в пакете.

Кроме того, вы не можете использовать переменные атрибута вершины в шейдере фрагмента. Вы уже скопировали a_color в v_color в свой шейдер вершин, поэтому вы используете v_color в вашем шейдере фрагмента. Я понятия не имею, что вы пытаетесь сделать с gl_Color.

+0

Хорошо спасибо! – red1575