2013-12-12 226 views
3

我正在尝试更改精灵(其颜色为红色和灰色),颜色为白色。将精灵颜色更改为白色

sprite.setColor(1, 1, 1, 1); 

但是什么都没有发生。

如何更改所有的白色精灵颜色?请,谢谢你

+0

您更希望是这样的:乘0,0,0,1和反转颜色通道。 –

回答

3

如果您想要将精灵中所有形状的颜色更改为白色,那么唯一的办法就是使用像素着色器并设置它们不是黑色的所有碎片(我假定黑色渲染为在你的游戏中进行transperant)到白色。类似的东西:

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.r!=0 && color.g!=0 && color.b!=0){ 
     gl_FragColor=vec4(1,1,1,1); 
    } 
    else{ 
     gl_FragColor=color; 
    } 
} 

如果你是不幸的,你使用OpenGL 1.0(固定管道),我建议你改用GLES 2.0,现在你是一个beginer.Fixed管道是从90年代,我们是在2013年!

的代码:

初始化

ShaderProgram.pedantic = false; 

    ShaderProgram defaultShader=SpriteBatch.createDefaultShader(); 

    ShaderProgram shaderWhiteTexture=new ShaderProgram(Gdx.files.internal("vertexShader.vs").readString(),Gdx.files.internal("fragShader.fs").readString()); 

渲染

//Render the textures with the normal colors 
spriteBatch.begin(); 
spriteBatch.draw(sprite1,sprite2,sprite3...);//or whatever code u use to render them 
spriteBatch.end(); 

//Render the textures with the shader 
spriteBatch.setShader(shaderWhiteTexture); 
spriteBatch.begin(); 
spriteBatch.draw(sprite4,sprite5,sprite6...);//or whatever code u use to render them 
spriteBatch.end(); 
spriteBatch.setShader(defaultShader); 

着色

//vertexShader.vs: 
attribute highp vec4 a_position; 
attribute highp vec4 a_color; 
attribute highp vec2 a_texCoord0; 
uniform mat4 u_projTrans; 

varying highp vec4 v_color; 
varying highp vec2 v_texCoords; 

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

//fragShader.fs: 
varying highp vec4 v_color; 
varying highp vec2 v_texCoords; 
uniform sampler2D u_texture; 
void main() { 

    gl_FragColor = vec4(0.0); 

    highp vec4 color = texture2D(u_texture, v_texCoords); 

    if(color.a > 0.0) { 
     gl_FragColor = vec4(1.0,0,0,1.0); 
} 

} 

编着问老板:现在与透明质感

什么已被添加?

1 . the highp precision to variables 
2 . the fragmentShader file Main() fonction edited 
+0

我使用的是OpenGL 2.0,但我并不是很擅长ShaderProgram,我想渲染一个白色的精灵,然后其他人使用它们的原始颜色 – LeSam

+0

@ user2372006,所以为了确保我们正在谈论相同的事情,想在本场比赛中像老板一样呈现它http://www.youtube.com/watch?v=OWB6Bu0zCSE 10:00:00 – SteveL

+0

是的,这正是我想要的 – LeSam

-2

在我之前的答案是正确的! 你可以这样做:sprite.setColor(new Color(Color.WHITE)); 这是更简单的你,我认为...

+1

白色不影响精灵,请检查我的答案。 – Lestat

+1

@Tekkzz这和我在问题 – LeSam

+0

中写的完全一样的代码不是不行!你的颜色定义是错误的!你的不是一种颜色! – Tekkzz

1

这将无法正常工作。白色不影响较深的颜色(阅读:每隔一种颜色)。

这实际上是精灵默认,所以它完全按照您创建它的图像呈现(这就是您没有看到更改的原因)。如果您要使用Sprite Color来影响在运行时呈现精灵的方式,请考虑将其变为白色,然后将其更改为任何其他颜色。

+0

好的,但我不能让精灵全白作为默认,因为精灵包含不同的颜色(红色,灰色,一些蓝色等),是否有另一种解决方案来显示白色精灵而不使用sprite.setColor? – LeSam

+1

afaik,no。除非你使用OpenglEs2.0,并且知道如何使用着色器,但我不知道。我会创建一个全白的不同sprite,并在需要时渲染它。 – Lestat

+0

如果你的加载简单的形状像一个_circle或rectangle_或其他形状成精灵,那么你可以使用**形状渲染**来获得不同的颜色形状,这是很容易...... 但如果不是那么它的如上所述,最好以白色加载所有的精灵。 – srikanth

1

你可以没有任何OpenGL2功能或着色器,或者通过使用模板缓存精灵或其他任何疯狂的事情的预whiteouted副本实现这一目标。

首先,您将精灵绘制到模具缓冲区,然后在模具上绘制一个适当颜色的填充矩形,它将只绘制模具的位置,留下彩色轮廓。

这里是如何工作的:

//Turn off drawing to the color buffers 
Gdx.gl.glColorMask(false, false, false, false); 

//Enable drawing to the stencil buffer 
Gdx.gl.glEnable(GL10.GL_STENCIL_TEST); 

//Set the stencil mask you want to use, mask 1 is as good as any other 
Gdx.gl.glStencilMask(1); 

//When drawing, Always attempt to draw a 1 into mask 1 for every pixel 
Gdx.gl.glStencilFunc(GL10.GL_ALWAYS, 1, 1); 
//When drawing, replace whatever is currently in the mask 
Gdx.gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); 

//unlike the name would have you believe, this call actually sets the 'color' 
//to clear the stencil with and doesnt actually clear the stencil. We want to 
//set the mask to all 0's 
Gdx.gl.glClearStencil(0); 
//This then clears the stencil buffer with all 0's 
Gdx.gl.glClear(GL10.GL_STENCIL_BUFFER_BIT); 

//A sprite typically has transparent pixels, and we don't want to draw them 
//into the mask, so filter out pixels with an alpha less than 0.5f. Only 
//those greater are drawn into the stencil buffer 
Gdx.gl.glEnable(GL10.GL_ALPHA_TEST); 
Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0.5f); 

//Draw the sprite into the stencil buffer 
spriteBatch.begin(); 
spriteBatch.draw(...) 
spriteBatch.end(); 

//Finished filtering the alpha channel 
Gdx.gl.glDisable(GL10.GL_ALPHA_TEST); 

//Now that we want to use the mask instead of drawing into it so we turn 
//drawing to the color buffer back on 
Gdx.gl.glColorMask(true, true, true, true); 
//Set us up to only draw where the stencil buffer equals 1 
Gdx.gl.glStencilFunc(GL10.GL_EQUAL, 1, 1); 
//And since drawing into the mask is actually still on, we set this to keep the 
//values in the stencil buffer, and not overwrite them 
Gdx.gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); 

//Draw a coloured rectangle over the mask, and it will only draw pixels where the 
//stencil buffer has been set giving you a silhoutte of your sprite! You can also 
//use a transparent rect and draw over a normal render of your sprite to fade the 
//sprite up into whatever color you want 
shapeRenderer.begin(ShapeType.Fill); 
shapeRenderer.rect(...); 
shapeRenderer.end(); 

//Done with the stencil 
Gdx.gl.glDisable(GL10.GL_STENCIL_TEST); 
相关问题