我正在尝试使用自己的shaderProgram绘制网格:
private static String vertexShader =
"attribute vec4 a_position; \n"
+ "attribute vec4 a_color;\n"
+ "attribute vec2 a_texCoords;\n"
+ "uniform mat4 u_worldView;\n"
+ "varying vec4 v_color;"
+ "varying vec2 v_texCoords;"
+ "void main() \n"
+ "{ \n"
+ " v_color = a_color; \n"
+ " v_texCoords = a_texCoords; \n"
+ " gl_Position = u_worldView * a_position; \n" +
"} \n";
private static String fragmentShader =
"#ifdef GL_ES \n"
+ "precision mediump float; \n"
+ "#endif \n"
+ "varying vec4 v_color;\n"
+ "void main() \n"
+ "{ \n"
+ " gl_FragColor = v_color; \n"
+ "}";
在我的
draw
方法中,我用它来绘制一些多边形:public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
shader.begin();
shader.setUniformMatrix("u_worldView", u_projTrans);
mesh.render(shader, GL20.GL_TRIANGLE_FAN);
Gdx.gl20.glLineWidth(15);
shader.end();
}
我还将SelectBox添加到舞台上,并且在shaderProgram第一次执行后,SelectBox不会绘制其选择列表。
当我尝试从列表中选择一个时-它会被选择,但列表的纹理不会绘制。我认为问题出在我的shaderProgram中,在使用它之后,SpriteBatch无法为SelectBox列表重新绘制纹理。
public void render() {
Gdx.gl.glClearColor(0.933333f, 0.933333f, 0.933333f, 1f);
Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT );
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
stage.act();
stage.draw();
batch.end();
}
为什么会有这种奇怪的行为?
最佳答案
我假设您的draw
方法(执行shader.begin()
和shader.end()
的方法)是通过stage.draw()
调用到达的?
如果是这样,则着色器处于活动状态,而Batch
实例希望完全控制GPU中的OpenGL状态。但是,当shader
运行时,它将更改batch
所不期望的OpenGL状态。解决方法是在启用着色器之前“结束”批处理。就像是:
public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
batch.end(); // <---
shader.begin();
shader.setUniformMatrix("u_worldView", u_projTrans);
mesh.render(shader, GL20.GL_TRIANGLE_FAN);
Gdx.gl20.glLineWidth(15);
shader.end();
batch.begin(); // <--
}