首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于Direct3D解决思路

2012-10-10 
关于Direct3D渲染多个模型的时候出现模型位置前后不对,如图:上面是一块平板上面放着一根蜡烛,但是蜡烛的下

关于Direct3D
渲染多个模型的时候出现模型位置前后不对,如图:


上面是一块平板上面放着一根蜡烛,但是蜡烛的下半部分却被平板给遮住了,本来应该按红线显示出来才对。

深度缓存神马的已经开启了,相关代码如下(C#代码,使用SlimDX库):

创建设备:

C# code
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);



创建渲染目标:
C# code
Surface surface = Surface.CreateRenderTarget(device, width, height, Format.X8R8G8B8, MultisampleType.None, 0, false);



渲染循环:
C# code
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);//还原前一渲染目标





[解决办法]
create RT那儿没设置Zbuffer和stelciel buf

另外,根本不需要自己create rt的,你在create device的时候创建的backbuffer是打开了z buf的。

把切换RT的代码关掉就好了

热点排行