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

10-06 11:22