2015-02-07 5 views
1

У меня есть оригинальный образ: http://i.stack.imgur.com/7qYW2.pngКак закрасить текстуры [Libgdx]

Как я могу рисовать поверх изображения, чем получить следующее: http://i.stack.imgur.com/w3ij3.png

PS: этот код не правильный:

public void render() { 
    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    batcher.begin(); 
    batcher.setColor(Color.BLUE); 
    batcher.draw(texture, x, y, width, height); 
    batcher.end(); 
} 
+0

Что вы точно пытаетесь сделать? Этот код должен делать это. – Veljko

+0

@Veljko, этот код сделать только оттенок. – Berelem00

+0

Yup, тогда вы должны использовать простой шейдер фрагмента. Это переопределяет цвет пикселя текстуры. – Veljko

ответ

0

Полный действительный код:

 String vertexShader = "attribute vec4 a_position;\n" + 
       "attribute vec4 a_color;\n" + 
       "attribute vec2 a_texCoord0;\n" + 
       "\n" + 
       "uniform mat4 u_projTrans;\n" + 
       "\n" + 
       "varying vec4 v_color;\n" + 
       "varying vec2 v_texCoords;\n" + 
       "\n" + 
       "void main() {\n" + 
       " v_color = a_color;\n" + 
       " v_texCoords = a_texCoord0;\n" + 
       " gl_Position = u_projTrans * a_position;\n" + 
       "}"; 

     String fragmentShader = "#ifdef GL_ES\n" + 
       "precision mediump float;\n" + 
       "#endif\n" + 
       "\n" + 
       "varying vec4 v_color;\n" + 
       "varying vec2 v_texCoords;\n" + 
       "uniform sampler2D u_texture;\n" + 
       "uniform mat4 u_projTrans;\n" + 
       "\n" + 
       "void main() {\n" + 
       "  vec4 color = v_color * texture2D(u_texture, v_texCoords);\n" + 
       "  if(color.a == 0.0) gl_FragColor = vec4(color.r, color.g, color.b, 0.0);\n" + 
       "  else gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);" + 
       "}"; 

     ShaderProgram shaderProgram = new ShaderProgram(vertexShader,fragmentShader); 

     public void render() { 
      Gdx.gl.glClearColor(0, 0, 0, 1); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

      batch.begin(); 
      batch.setShader(shaderProgram); 
      batch.draw(texture, x, y, width, height); 
      batch.end(); 

     } 
0

Вы можете использовать фрагмент шейдер со следующей логикой:

if(alpha of the pixel is 1.0) then pixel=cyan 
else pixel=white 

это, конечно, требует пространства, которое окружает пингвина быть прозрачным (а = 0)

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

void main() { 
    vec4 color=v_color * texture2D(u_texture, v_texCoords); 
    if(color.a==1.0)gl_FragColor=vec4(0.5,0.5,1,1); 
    else gl_FragColor=vec(0.0,0.0,0.0,0.0); 
} 
+0

Тем не менее, в связанной картинке есть большая серая тень. Возможно, было бы лучше установить цвет на голубой, если альфа точно равна 1, и установите его (0,0,0,0) в противном случае. (Не проверял альфа-канал на связанном изображении, поэтому не уверен). – MPeti

+0

@MPeti, звучит лучше, ответ был прав. – SteveL

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