在我的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,绘图方法和渲染方法是如何协同工作的!
感谢您的时间
答案 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进行绘制调用,这会花费一些性能。