演员中的libgdx着色器

时间:2018-03-24 22:58:45

标签: libgdx kotlin

我有自定义组,由一些演员组成,并在其draw()

中使用自定义着色器

看起来像:

override fun draw(batch: Batch, parentAlpha: Float) {
    super.draw(batch, parentAlpha)
    Gdx.gl.glDepthMask(false)
    Gdx.gl.glEnable(GL20.GL_BLEND)
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
    val sh = stage.batch.shader // Save current shader
    stage.batch.shader = shader // Set custom shader
    shader.begin()
    shader.setUniformMatrix("u_projTrans", stage.camera.combined)
    shader.setUniformf("u_color", color)
    shader.setUniformf("u_scale", scale)
    shader.setUniformf("u_radius", radius)
    shader.setUniformf("u_pos_center", v)
    mesh.render(shader, GL20.GL_TRIANGLES, 0, 6)
    shader.end()
    stage.batch.shader = sh // Restore default shader
}

绘制了组中的所有actor,但不是自定义着色器。

不确定我是否正确使用。哪里我错了?

1 个答案:

答案 0 :(得分:0)

不要进行那些直接的OpenGL调用,因为那些是SpriteBatch为自己管理的GL参数,所以你可能会搞乱其后来绘制的其他actor的默认值。您可以直接设置混合功能并在批处理上启用混合。默认情况下,SpriteBatch已禁用深度测试和屏蔽。

如果要使用该着色器绘制该组的子项,请在设置着色器参数后移动super.draw。请勿致电shader.begin()end(),因为这些是由批处理的。

但是如果你只是绘制那个自定义网格物体,那么你根本不应该弄乱批处理的着色器是没有意义的。相反,您应该在此方法的开头调用batch.end(可能在调用super.draw之后),并在此方法结束时调用batch.begin。如果没有看到自定义着色器或如何设置网格,则无法确定是否存在阻止您查看网格的其他问题。