2015-09-02 2 views
0

я в настоящее время спрайта по умолчанию пакета: сlibgdx - как настроить рассылку спрайтов для смешивания/тени как это?

batch = new SpriteBatch(); 

Я прочитал об использовании шейдеров, чтобы изменить, как партия рисует каждый спрайт. В моей игре я пытаюсь создать «ночной» эффект - я хочу, чтобы каждый пиксель на экране был черным, кроме пикселей, которые уже белые. Для белых пикселей я хочу оттенок синего. Очевидно, что я новичок в libgdx и openGL. Может ли кто-нибудь, кто знаком с смешиванием или шейдерами, помочь мне с этим? Что мне делать с моим спрайтом для достижения эффекта, который я описываю?

ответ

1

эффект, который вы хотели бы достичь, можно было бы сделать что-то вроде этого.

Vertex Shader

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() 
{ 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

Фрагмент шейдеры

precision mediump float; 

varying vec4 v_color; 
varying vec2 v_texCoords; 
uniform sampler2D u_texture; 
uniform mat4 u_projTrans; 

bool equals(float a, float b) { 
    return abs(a-b) < 0.0001; 
} 

bool isWhiteShade(vec4 color) { 
    return equals(color.r, color.g) && equals(color.r, color.b); 
} 

void main() { 
    vec4 color = texture2D (u_texture, v_texCoords) * v_color; 
    if(isWhiteShade(color)) { 
     color *= vec4(0, 0, 1, 1); 
    } 
    else { 
     color *= vec4(0, 0, 0, 1); 
    } 
    gl_FragColor = color; 
} 

Добавьте их в папку активов, а затем передать в качестве аргументов при создании экземпляра ShaderProgram и, конечно, не забывайте применять эту программу для шейдерного ваш SpriteBatch.

+0

Это потрясающе! Спасибо, что дал мне отправную точку. – SheerSt

0

Чтобы быть честным, это не имеет (почти) ничего общего с SpriteBatch - все, что вам нужно сделать с ним просто применяем созданный Shader

batch.setShader(ShaderProgram shader) 

шейдерам тема очень и очень широко (и если честно независимо от Libgdx), и нет простого ответа на ваш вопрос без информации о том, что он должен делать. Кроме того, если честно, сначала попробуйте прочитать что-нибудь о шейдерах и вернуться к SO, когда у вас возникнут проблемы с этим.

Вы можете начать прямо здесь:

https://github.com/libgdx/libgdx/wiki/Shaders

+0

Как насчет batch.setBlendFunction()? Может ли это мне помочь? – SheerSt

+0

Nope - это о смешении цветов - определение того, как прозрачные цвета должны быть смешаны, чтобы сделать его одним из сумм других –

Смежные вопросы