关于Direct3D

wmesci 2012-09-19 01:57:04
渲染多个模型的时候出现模型位置前后不对,如图:


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

深度缓存神马的已经开启了,相关代码如下(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);//还原前一渲染目标
...全文
174 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
迹I柳燕 2012-09-19
  • 打赏
  • 举报
回复
同求呀同求……
wmesci 2012-09-19
  • 打赏
  • 举报
回复
自挽。。。

17,748

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧