如何Direct3D Alpha混合

时间:2012-05-16 07:26:56

标签: c# direct3d alphablending blending

我试图在混合平行六面体容器内显示几个3D对象。 获得的结果不令人满意。

第一个数字似乎是正确的 https://picasaweb.google.com/lh/photo/QabTkrf2zyIMP0UEuZvmTdMTjNZETYmyPJy0liipFm0?feat=directlink

第二个是错的 https://picasaweb.google.com/lh/photo/JqnZqeTuomNLqDR5vhizadMTjNZETYmyPJy0liipFm0?feat=directlink

我在c#

中使用托管directx

初​​始化:

DxDeviceArea.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, MaxSizeArea * 2);
DxDeviceArea.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, MaxSizeArea / 2f), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
DxDeviceArea.RenderState.Lighting = true;
DxDeviceArea.RenderState.CullMode = Cull.CounterClockwise;
DxDeviceArea.RenderState.SourceBlend = Blend.SourceAlpha;
DxDeviceArea.RenderState.DestinationBlend = Blend.InvSourceAlpha;
DxDeviceArea.RenderState.AlphaBlendEnable = true;
DxDeviceArea.RenderState.BlendOperation = BlendOperation.Add;
DxDeviceArea.RenderState.AlphaTestEnable = true;
//Set light
DxDeviceArea.Lights[0].Type = LightType.Directional;
DxDeviceArea.Lights[0].Diffuse = Color.White;
DxDeviceArea.Lights[0].Direction = new Vector3(0, 0, -1);
DxDeviceArea.Lights[0].Enabled = true;

在渲染功能中,第一步是绘制对象内部 第二个是绘制混合边框。

在绘制第二个i之前,我将cullmode从CounterClockwise切换到None

DxDeviceArea.RenderState.CullMode = Cull.None;

轮换

//rotation
DxDeviceArea.Transform.World *= Matrix.RotationY((-PosX / 300F)) * Matrix.RotationX(PosY / 300F);

我如何击败显示问题?

1 个答案:

答案 0 :(得分:0)

为了正确绘制透明表面,您必须按深度排序并从后向前渲染它们。您还必须在渲染透明对象时禁用z缓冲区测试。