首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将精灵色变白

将精灵色变白
EN

Stack Overflow用户
提问于 2013-12-12 20:33:37
回答 4查看 2.1K关注 0票数 3

我试图改变雪碧的颜色(红色和灰色),白色。

代码语言:javascript
复制
sprite.setColor(1, 1, 1, 1);

但什么都没发生。

我怎样才能改变所有雪碧的白色颜色?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-17 16:02:17

如果您想要将雪碧中所有形状的颜色更改为白色,那么唯一可以做到的方法是使用像素着色器,并将它们不是黑色的所有片段(我假设在您的游戏中以黑体呈现)设置为白色。就像这样:

代码语言:javascript
复制
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年!

守则:

初始化

代码语言:javascript
复制
  ShaderProgram.pedantic = false;

  ShaderProgram defaultShader=SpriteBatch.createDefaultShader();

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

渲染

代码语言:javascript
复制
//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);

阴影

代码语言:javascript
复制
//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);
}

}

由问题所有者编辑的 :现在使用透明纹理

添加了什么?

代码语言:javascript
复制
1 . the highp precision to variables
2 . the fragmentShader file Main() fonction edited
票数 4
EN

Stack Overflow用户

发布于 2013-12-12 21:02:45

那不管用。白色不会影响更深的颜色(读:其他颜色)。

这实际上是sprite的默认设置,因此它的呈现与您创建它的映像完全相同(这就是您没有看到更改的原因)。如果要使用雪碧颜色影响雪碧在运行时的呈现方式,请考虑将其变为白色,然后将其更改为任何其他颜色。

票数 1
EN

Stack Overflow用户

发布于 2013-12-19 00:27:19

您可以通过使用模具缓冲区来实现这一点,而无需任何OpenGL2函数或着色器,也不需要雪碧的预白副本或任何其他疯狂的东西。

首先将您的sprite绘制到模具缓冲区,然后在模具上绘制一个颜色适当的矩形,它将只绘制模板所在的位置,留下一个彩色剪影。

以下是它的工作原理:

代码语言:javascript
复制
//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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20553664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档