3D基元,XNA 4.0上的透明纹理问题

Bev*_*vin 4 c# xna textures

我需要画一大堆立方体,每一面都有(可能)独特的纹理.一些纹理也具有透明度的一部分.具有透明纹理的立方体后面的立方体应该透过透明纹理显示.但是,我绘制立方体的顺序似乎决定了透明度是否有效,这是我想要避免的.看这里:

cubeEffect.CurrentTechnique = cubeEffect.Techniques["Textured"];

Block[] cubes = new Block[4];
cubes[0] = new Block(BlockType.leaves, new Vector3(0, 0, 3));
cubes[1] = new Block(BlockType.dirt, new Vector3(0, 1, 3));
cubes[2] = new Block(BlockType.log, new Vector3(0, 0, 4));
cubes[3] = new Block(BlockType.gold, new Vector3(0, 1, 4));


foreach(Block b in cubes) {
    b.shape.RenderShape(GraphicsDevice, cubeEffect);
}
Run Code Online (Sandbox Code Playgroud)

这是Draw方法中的代码.它产生了这个结果: 第一张图片http://oi53.tinypic.com/av4tv7.jpg

如您所见,叶子立方体后面的纹理在另一侧是不可见的.当我在数组中反转索引3和0时,我得到这个: 正确的形象

很明显,绘图的顺序正在影响立方体.我怀疑它可能与混合模式有关,但我不知道从哪里开始.

Emp*_*ean 7

您依靠深度缓冲来实现遮挡.此技术仅适用于不透明对象.

要为包含透明对象的场景实现正确的遮挡:

  1. 将DepthBufferEnable和DepthBufferWriteEnable设置为true

  2. 绘制所有不透明的几何体

  3. 将DepthBufferEnable设置为true,但将DepthBufferWriteEnable更改为false

  4. 按照与相机的距离对alpha混合对象进行排序,然后按照从后到前的顺序绘制它们

由Shawn Hargreaves 从深度排序alpha混合对象中提取