Libgdx着色器,渲染和绘制混乱

时间:2014-06-25 12:40:35

标签: opengl libgdx shader render draw

在我的Libgdx Scene2D阶段我试图让一个演员用白色闪烁。 使用OpenGLES 2.0,我知道我需要使用着色器来实现这一点,我在实现它时遇到了问题。

我的目标是在给定特定游戏事件的情况下为纯白色的演员着色。问题是这个特定的事件,舞台上的一切都变成白色(所有演员和背景),而不仅仅是选定的演员纹理。

My World class是创建舞台的地方。它呈现如下:

public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
update();
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
}

在舞台中,我使用MyActor类中定义的actor。这个班有自己的 绘制方法,我试图用着色器为纯白色的演员着色。这是绘制方法:

public void draw(Batch batch, float alpha) {
    if (flashing) {
        batch.setShader(shader);            
    }

    batch.flush();

    Color color = getColor();
    batch.setColor(color.r, color.g, color.b, color.a * alpha);

    batch.draw(tr, getX(), getY(), side/2, side/2, side, side, getScaleX(), getScaleY(), 0);        
}

显然我对批处理有问题。它不是将这个演员涂成白色,而是为所有东西着色。即使在布尔值闪烁= false之后,它仍保持白色;

以下是我在actor类MyActor中设置着色器的方法:

ShaderProgram shader;
String vertexShader =
        "attribute vec4 a_position; \n" +
        "attribute vec4 a_color;\n" +
        "attribute vec2 a_texCoord0; \n" +
        "uniform mat4 u_projTrans; \n" +
        "varying vec4 v_color; \n" +
        "varying vec2 v_texCoords; \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" + "varying vec4 v_color;\n" +
        "varying vec2 v_texCoords;\n" +
        "uniform sampler2D u_texture;\n" +
        "uniform float grayscale;\n" +
        "void main()\n" +
        "{\n" +
        "vec4 texColor = texture2D(u_texture, v_texCoords);\n" +
        "float gray = dot(texColor.rgb, vec3(5, 5, 5));\n" +
        "texColor.rgb = mix(vec3(gray), texColor.rgb, grayscale);\n" +
        " gl_FragColor = v_color * texColor;\n" +
        "}";

然后开始:

shader = new ShaderProgram(vertexShader, fragmentShader);

我做错了什么?

我不得不承认我可能无法正确理解批量的MyActor,绘图方法和渲染方法是如何协同工作的!

感谢您的时间

1 个答案:

答案 0 :(得分:3)

这里的问题是,您从未将Shader设置回默认Shader,因此您的Spritebatch始终使用“纯白”Shader。 作为setShader(ShaderProgram shader) sais的javadock,您可以通过调用Shader重置setShader(null)
另一种可能性是使用另一个Texture作为纯白色,简单地说:

Texture t = flashing ? whiteTexture : defaultTexture;

draw Texture t 只是一个建议:如果不是绝对必要的话,请不要使用batch.flush(),因为flush()会对GPU进行绘制调用,这会花费一些性能。