【问题标题】:libgdx shader in actor演员中的 libgdx 着色器
【发布时间】:2018-03-24 22:58:45
【问题描述】:

我有自定义组,由一些演员组成,并且还在其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
}

组中的所有演员都已绘制,但未绘制自定义着色器。

不确定我做得对。我哪里错了?

【问题讨论】:

    标签: libgdx kotlin


    【解决方案1】:

    不要进行那些直接的 OpenGL 调用,因为这些是 SpriteBatch 自己管理的 GL 参数,因此您可能会弄乱它稍后绘制的其他演员的默认值。您可以设置混合功能并直接在批次上启用混合。 SpriteBatch 默认已经禁用深度测试和遮罩。

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

    但是,如果您只是在绘制自定义网格,那么对批处理的着色器来说完全没有意义。相反,您应该在此方法的开头调用batch.end(可能在调用super.draw 之后),并在此方法的末尾调用batch.begin。如果没有看到您的自定义着色器或您如何设置网格,则无法确定是否有其他问题阻止您查看网格。

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 2021-10-06
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多