في DirectX 9 ، كيفية الحصول على Zbuffer للعمل بشكل صحيح؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

لقد لم تنجح في الحصول على هندسة مكعب بسيطة مع تشغيل التظليل لعرضها بشكل صحيح.

هذا هو رمز C# ، ولكن يتم تمرير القيم من خلال SlimDX مباشرة إلى رمز C ++.

            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;

... هي القيم في بنية presprayster المستخدمة لإعداد كائن direct3d9device الخاص بي.

أثناء العرض ، يسمى setrenderstate على النحو التالي:

        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 عرض http://gallery.me.com/robert.perkins/100045/z-fightingwireframe/web.jpg

الزوج القريب من المثلثات الأكبر هو الوجه القريب للمكعب.

يشبه المنظر المملوء مثل هذا:عرض كامل 1 http://gallery.me.com/robert.perkins/100045/z-fighting/web.jpg

أو هذا ، في مكالمة تقديم لاحقة:عرض كامل 2 http://gallery.me.com/robert.perkins/100045/zfight2/web.jpg

لست متأكدًا من كيفية إصلاح هذا. أين يجب أن أبدأ في البحث؟

تحرير: تبدو مصفوفة إسقاط الكاميرا مثل هذا لأحد الإطارات:

{[[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]]}

ويبدو أن مصفوفة العرض هكذا:

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]]}
هل كانت مفيدة؟

المحلول

امسح Z-buffer إلى 1.0F وليس 10000.0F.

من المستندات الواضحة في SDK:

[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 ومعرفة ما إذا كان ذلك يساعدك على الإطلاق ...

نصائح أخرى

حدس: جرب تمكين Z-buffer قبل أن تنطق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top