我如何设置的DirectX 9,使背面剔除处于关闭状态,Z缓冲是,和高洛德着色的作品,为三角形网格没有法线数据?

StackOverflow https://stackoverflow.com/questions/2082065

  •  21-09-2019
  •  | 
  •  

我一直有识别正确的参数为PresentParameters和DirectX装置,所以,可以有顶点级高洛德着色和使用Z缓冲器的两个难度。一些三角形网格的工作正常,其他有出现在三角形其是近到照相机的前面背景三角形。

这方面的一个例子是在这里找到: http://gallery.me.com /robert.perkins/100045/zBufferGone 。输入数据是面顶点的简单列表。在每个小面的顶点的缠绕顺序是不确定的(来自各种CAD软件出口函数)和没有法线数据。

在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:无效呼叫(-2005530516)”})。什么是正确的设置参数?

编辑:哪些接口与DirectX9的默认设置像这样的C ++类:

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;
}
有帮助吗?

解决方案

如果它返回一个无效电话?

编辑:我假设在新EngineDX9电话吗?您已经尝试在本参数设定装置窗口句柄?

编辑2:你有没有打开调试喷涌在DirectX控制面板,查看是否它会告诉你是什么错误

EDIT3:试图backbufferWidth和高度设置为0?什么是backbuffercount设置?也可能是值得尝试“Format.D24S8”的后备缓冲?它“可能”你的显卡不支持16位(尽管可能性不大)。你有没有在你所要创建的模式是有效的帽子检查?我asssume,顺便说一句,您所使用的自动的CLR语言设置你不要设置为0的参数?我本人总是倾向于是在这种情况下显式....

PS我猜这里是因为我是个原生C ++ DX9编码器不是一个CLR SlimDX编码器...

Edit4:我敢肯定它缺乏窗口句柄的...我可能是错的,但是,这是我可以看到真的错了您的设置的唯一的事情。一个窗口DX9设备需要的窗口。顺便说一句设置宽度和高度为0,只使用窗口要设置的设备太的大小...

编辑5:我真的在这里标题下了错误的路线。没有什么错的创作所产生的“不正确”设备的设备。做他们都很好,本参数不乱。你必须与你的Z缓冲问题的主要原因是,你设置的比较功能始终。这意味着,无论什么样的Z缓冲包含,PAS像素,写它的Z到Z缓冲区改写无论是已经存在。我打赌这其中就有你的Z缓冲问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top