Libgdx 3D纹理透明度

8
我遇到了一个问题,就是某个贴图的透明区域无法显示。这个贴图是一个硬币在立方体上的渲染效果,但我无法让四个角落的部分显示为透明,它们只会呈现为白色/灰色。
我已确认启用了G20.GL_Blend,所以不可能是这个原因。
以下是我在render()方法里使用的代码(我尝试了不同的组合):
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
    Gdx.gl20.glEnable(GL20.GL_BLEND);
    Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
    Gdx.gl20.glBlendEquation(GL20.GL_BLEND);
    
    modelBatch.begin(cam);
    texture.bind();
    modelBatch.render(instance, environment);
    modelBatch.end();
        
    Gdx.gl20.glDisable(GL20.GL_TEXTURE_2D);
3个回答

11

链接失效了。我的看法是,现在的回答存在不足之处。 - Madmenyo

2
你需要向你的 ModelInstance 添加一个 BlendingAttribute:
modelInstance.materials.get(0).set(
    new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
)

您还可以将其添加到ModelBuilder代码中(在其中创建可以创建ModelInstances的模型时):

new Material(
    TextureAttribute.createDiffuse(yourTransparentTexture), 
    new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA))
)

-2
ModelBatch.begin(...)会通过调用Gdx.gl.glDisable(GL20.GL_BLEND)禁用混合。因此,请确保在调用ModelBatch.begin()之后启用混合。
modelBatch.begin(camera); // resets Blending to false
// enable Blending
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
// draw mesh
mesh.render(shader, GL20.GL_TRIANGLES);
modelBatch.end();

来源:https://dev59.com/PnbZa4cB1Zd3GeqPHpqL#66820414 这个回答正在被踩,我不明白为什么... 看一下ModelBatch.begin(...)的内部。
public void begin (final Camera cam) {
    if (camera != null) throw new GdxRuntimeException("Call end() first.");
    camera = cam;
    if (ownContext) context.begin();
}

调用RenderContext.begin()方法。
public void begin () {
    Gdx.gl.glDisable(GL20.GL_DEPTH_TEST);
    depthFunc = 0;
    Gdx.gl.glDepthMask(true);
    depthMask = true;
    Gdx.gl.glDisable(GL20.GL_BLEND); // <--- SEE HERE
    blending = false;
    Gdx.gl.glDisable(GL20.GL_CULL_FACE);
    cullFace = blendSFactor = blendDFactor = 0;
    textureBinder.begin();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接