代码之家  ›  专栏  ›  技术社区  ›  Rob Perkins

对于没有法线数据的三角形网格,如何设置DirectX 9,使背面消隐处于禁用状态,z缓冲处于启用状态,而gouraud着色处于工作状态?

  •  1
  • Rob Perkins  · 技术社区  · 16 年前

    我一直很难为PresentParameters和DirectX设备识别正确的参数,因此可以同时使用顶点级别的gouraud着色和z缓冲区。一些三角形网格工作正常,另一些三角形的背景三角形出现在靠近摄影机的三角形前面。

    这方面的一个例子如下: http://gallery.me.com/robert.perkins/100045/zBufferGone

    现在正在按如下方式设置PresentParameters。我意识到这是C++而不是C++,但我认为它足够有描述性,并且参数通过C++代码。这会产生图片中的图像;在参考设备上的行为相同:

                 pParams = new PresentParameters()
                        {
                            BackBufferWidth = this.ClientSize.Width,
                            BackBufferHeight = this.ClientSize.Height,
                            AutoDepthStencilFormat = Format.D16,
                            EnableAutoDepthStencil = true,
                            SwapEffect = SwapEffect.Discard,
                            Windowed = true
                        };
                _engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);
    
                _engineDX9.DefaultCamera.NearPlane = 0;
                _engineDX9.DefaultCamera.FarPlane = 10;
                _engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
                _engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
                _engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
                _engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
                _engineDX9.BackColor = Color.White;
                _engineDX9.FillMode = FillMode.Solid;
                _engineDX9.CullMode = Cull.None;
    
                _engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;
    

    我的所有其他安装尝试,甚至在参考设备上,都返回COM错误代码({“D3DERR_INVALIDCALL:Invalid call(-2005530516)”)。正确的设置参数是什么?

    PresentParameters::PresentParameters()
    {
        BackBufferWidth = 640;
        BackBufferHeight = 480;
        BackBufferFormat = Format::X8R8G8B8;
        BackBufferCount = 1;
    
        Multisample = MultisampleType::None;
        MultisampleQuality = 0;
    
        SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
        DeviceWindowHandle = IntPtr::Zero;
        Windowed = true;
        EnableAutoDepthStencil = true;
        AutoDepthStencilFormat = Format::D24X8;
        PresentFlags = SlimDX::Direct3D9::PresentFlags::None;
    
        FullScreenRefreshRateInHertz = 0;
        PresentationInterval = PresentInterval::Immediate;
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Goz    16 年前

    它在哪里返回无效呼叫?

    编辑2:您是否已打开DirectX控制面板中的debug spew以查看它是否告诉您错误是什么?

    Edit3:您已尝试将backbufferWidth和Height设置为0?backbuffercount设置为什么?也值得在backbuffer上尝试“Format.D24S8”吗?它“可能”你的图形卡不支持16位(虽然不太可能)。您是否已在caps中检查您尝试创建的模式是否有效?顺便说一句,我想您正在使用的CLR语言会自动设置未设置为0的参数?一、 就我个人而言,在这种情况下,我总是喜欢直言不讳。。。。

    PS我猜在这里,因为我是一个本地的C++ DX9编码器,而不是CLR SLIMDX编码器…

    编辑5:我真的走错了路。创建产生“不正确”设备的设备没有任何问题。不要弄乱当前参数,因为它们很好。Z缓冲出现问题的主要原因是将比较函数设置为“始终”。这意味着,无论z缓冲区包含什么,都会对像素进行pas,并将其z写入z缓冲区,覆盖已经存在的内容。我敢打赌这就是你的Z缓冲问题。

    推荐文章