我试图改变雪碧的颜色(红色和灰色),白色。
sprite.setColor(1, 1, 1, 1);但什么都没发生。
我怎样才能改变所有雪碧的白色颜色?
发布于 2013-12-17 16:02:17
如果您想要将雪碧中所有形状的颜色更改为白色,那么唯一可以做到的方法是使用像素着色器,并将它们不是黑色的所有片段(我假设在您的游戏中以黑体呈现)设置为白色。就像这样:
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;
}
}如果您是不幸的,并且您使用了OpenGLE1.0(固定管道),我建议您切换到gles 2.0,因为您是一个来自90‘的beginer.Fixed管道,我们在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发布于 2013-12-12 21:02:45
那不管用。白色不会影响更深的颜色(读:其他颜色)。
这实际上是sprite的默认设置,因此它的呈现与您创建它的映像完全相同(这就是您没有看到更改的原因)。如果要使用雪碧颜色影响雪碧在运行时的呈现方式,请考虑将其变为白色,然后将其更改为任何其他颜色。
发布于 2013-12-19 00:27:19
您可以通过使用模具缓冲区来实现这一点,而无需任何OpenGL2函数或着色器,也不需要雪碧的预白副本或任何其他疯狂的东西。
首先将您的sprite绘制到模具缓冲区,然后在模具上绘制一个颜色适当的矩形,它将只绘制模板所在的位置,留下一个彩色剪影。
以下是它的工作原理:
//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);https://stackoverflow.com/questions/20553664
复制相似问题