java - Shader程序与SpriteBatch

标签 java libgdx

我正在尝试用我自己的着色器程序绘制网格:

   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() 调用达到?

如果是这样,那么您的着色器处于 Activity 状态,而 Batch 实例希望完全控制 GPU 中的 OpenGL 状态。但是,当您的着色器运行时,它将对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(); // <--
}

关于java - Shader程序与SpriteBatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22684890/

相关文章:

java - 在 Java 中更快地 ping 服务器?

android - libgdx 中 Actor 的操作

java - 补间运动速度控制

java - 获取 spritesheet libgdx java 中的特定行

java - 如何在 swing 应用程序中正确放置 libgdx 应用程序?

Javassist仪器

java - Android Firebase 数据库不断更新值(value)

java - 无法处理零件,因为即使现有的 multipartResolver 也没有提供多部分配置

java - JPanel 没有出现在 JDialog 中

java - LIBGDX 水平和垂直视差背景