我正在尝试使用我自己的shaderProgram绘制一个Mesh:
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();
}
为什么会出现这种奇怪的行为?
答案 0 :(得分:0)
我假设您通过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(); // <--
}