我无法弄明白,我怎么告诉libgdx在透明贴花后面绘制我的绿色球体。
以下是我的问题的示例图片:
贴花创作:前两个参数是宽度和高度,最后一个标志是否透明。
Decal.newDecal(count * (GUTTER + BUTTONWIDTH) + GUTTER, 2 * GUTTER + BUTTONHEIGHT,
new TextureRegion(new Texture(Gdx.files.internal("icons/uibg.png"))), true);
球体创作:
builder.createSphere(
FINGERTIPRADIUS * 2, FINGERTIPRADIUS * 2, FINGERTIPRADIUS * 2,
6, 6,
new Material(ColorAttribute.createDiffuse(Color.GREEN)),
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
渲染方法:
this.models = new ModelBatch();
this.decals = new DecalBatch(new CameraGroupStrategy(camera));
...
// adding decals and models to render queue
...
public void update(float deltaTime){
super.update(deltaTime);
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
models.begin(camera);
for (Entity entity : queue) {
ModelInstance model = Mappers.Object.get(entity).instance;
models.render(model, environment);
}
decals.flush();
models.end();
queue.clear();
}
我感谢每一个建议。
//修改
将Blending属性添加到球体,并添加.7不透明度。这有效。但我想问题是贴花和模型渲染之间的问题,因为背景中的网格是贴花,可以通过黑色透明贴花看到,但球体不能。
新材料代码:
Material mat = new Material();
mat.set(ColorAttribute.createDiffuse(Color.GREEN));
mat.set(new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, 0.7f));
fingerTip = builder.createSphere(
FINGERTIPRADIUS * 2, FINGERTIPRADIUS * 2, FINGERTIPRADIUS * 2,
6, 6,
mat,
VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
这是另一张照片:两个中间球体没有像它们那样在透明贴花后面渲染。
答案 0 :(得分:1)
在models.end()
之前致电decals.flush()
。必须在不透明的东西之后绘制透明的东西。现在你首先绘制贴花,所以它在绘制球体之前将其深度写入缓冲区。
如果您的模型也是透明的,这会变得更加复杂。您需要以某种方式使用您的模型对贴花进行分类,并在冲洗贴花之前冲洗后部模型,最后冲洗附近的模型。