着色器程序与SpriteBatch

时间:2014-03-27 10:33:07

标签: java libgdx

我正在尝试使用我自己的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();
}

为什么会出现这种奇怪的行为?

1 个答案:

答案 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(); // <--
}