关于Direct3D
渲染多个模型的时候出现模型位置前后不对,如图:
上面是一块平板上面放着一根蜡烛,但是蜡烛的下半部分却被平板给遮住了,本来应该按红线显示出来才对。
深度缓存神马的已经开启了,相关代码如下(C#代码,使用SlimDX库):
创建设备:
var pps = new PresentParameters();pps.AutoDepthStencilFormat = Format.D16;pps.EnableAutoDepthStencil = true;pps.BackBufferWidth = (int)SystemParameters.PrimaryScreenWidth;pps.BackBufferHeight = (int)SystemParameters.PrimaryScreenHeight;pps.BackBufferFormat = Format.X8R8G8B8;pps.SwapEffect = SwapEffect.Discard;pps.Windowed = windowed;pps.PresentationInterval = PresentInterval.Default;pps.Multisample = MultisampleType.FourSamples;device = new Device(d3d, 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing | CreateFlags.FpuPreserve, pps);
Surface surface = Surface.CreateRenderTarget(device, width, height, Format.X8R8G8B8, MultisampleType.None, 0, false);
back = device.GetRenderTarget(0); //保存前一渲染目标device.SetRenderTarget(0, surface);//设置当前渲染目标device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, 0, 1.0f, 0);//设置视图、透视变换矩阵啥的略device.SetRenderState(RenderState.Lighting, true);device.SetRenderState(RenderState.ZEnable, true); //开启Z缓存device.SetRenderState(RenderState.MultisampleAntialias, true);device.SetRenderState(RenderState.NormalizeNormals, true);device.SetRenderState(RenderState.Ambient, Scene.Ambient.ToArgb());device.SetRenderState(RenderState.CullMode, SlimDX.Direct3D10.CullMode.Front);device.SetRenderState(RenderState.FillMode, FillMode.Solid);//设置灯光略device.BeginScene();//循环绘制每个模型for(...){ device.VertexDeclaration = data.VertexDeclaration; //顶点格式 device.SetStreamSource(0, data.VertexBuffer, 0, data.VertexSize);//顶点数据 device.Indices = data.IndexBuffer; //索引数据 device.SetTransform(TransformState.World, data.Transform; //世界变换 device.Material = data.Material; //材质 //纹理 for (int i = 0; i < data.Textures.Count; i++) { device.SetTexture(i, data.Textures[i]); } device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, model.VertexBuffer.Count, 0, model.IndexBuffer.Count / 3);}device.EndScene();device.Present();device.SetRenderTarget(0, back);//还原前一渲染目标