首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DirectX 9中,如何让zbuffer正常工作?

在DirectX 9中,如何让zbuffer正常工作?
EN

Stack Overflow用户
提问于 2010-01-19 09:58:33
回答 2查看 2.3K关注 0票数 2

我一直没有成功地获得一个简单的立方体几何体与着色打开正确显示。

这是c#代码,但是值直接通过SlimDX传递给C++代码。

代码语言:javascript
复制
            pParams.BackBufferWidth = 0;
            pParams.BackBufferHeight = 0;
            pParams.BackBufferCount = 1;
            pParams.BackBufferFormat = Format::X8R8G8B8;
            pParams.Multisample = MultisampleType::None;
            pParams.MultisampleQuality = 0;
            pParams.DeviceWindowHandle = this.Handle;
            pParams.Windowed = true;
            pParams.AutoDepthStencilFormat = Format.D24X8;
            pParams.EnableAutoDepthStencil = true;
            pParams.PresentFlags = PresentFlags.None;
            pParams.FullScreenRefreshRateInHertz = 0;
            pParams.PresentationInterval = PresentInterval.Immediate;
            pParams.SwapEffect = SwapEffect.Discard;

..。是用于设置Direct3D9Device对象的PresentParameter结构中的值。

在渲染过程中,SetRenderState的调用方式如下:

代码语言:javascript
复制
        this.D3DDevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, this.BackColor, 10000.0f, 0);
        this.D3DDevice.SetRenderState(RenderState.Ambient, false);
        this.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
        this.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
        this.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.LessEqual);
        this.D3DDevice.BeginScene();

同样,这被传递到C++代码,它将值封送到C++程序员不会害怕的调用中。

基本体是漫反射着色顶点(D3DFVF_XYZ | D3DFVF_DIFFUSE)。线框视图如下所示:wireframe view http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

较近的一对较大的三角形是立方体的近面。

填充后的视图如下所示:full view 1 http://gallery.me.com/robert.perkins/100045/Z-fighting/web.jpg

或者,在随后的呈现调用中:full view 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

我不知道该怎么解决这个问题。我应该从哪里开始寻找呢?

编辑:其中一帧的摄影机投影矩阵如下所示:

代码语言:javascript
复制
{[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
  [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
  [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
  [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}

并且,视图矩阵如下所示:

代码语言:javascript
复制
camera.ViewMatrix = {[[M11:0.6281456 M12:0.7659309 M13:0.1370506 M14:0] 
                      [M21:0.7705086 M22:-0.5877584 M23:-0.2466911 M24:0] 
                      [M31:-0.1083957 M32:0.2605566 M33:-0.9593542 M34:0] 
                      [M41:-3.225646 M42:-1.096823 M43:20.91392 M44:1]]}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-19 17:42:45

将Z-Buffer清除为1.0f,而不是10000.0f。

从SDK中的清除文档中:

代码语言:javascript
复制
[in] Clear the depth buffer to this new z value which ranges from 0 to 1.. 

查看投影矩阵和视口设置可能也很有用...

编辑:如何构建投影矩阵?您已将zNear设置为0,将zFar设置为1。尝试将您的zNear设置为0.001f,将zFar设置为1000.0f,看看这是否对您有帮助……

票数 2
EN

Stack Overflow用户

发布于 2010-01-19 10:29:18

预感:在清除之前尝试启用Z-Buffer。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2090574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档