كيف أقوم بإعداد DirectX 9 بحيث يتم إيقاف إعدام الخلفية ، وتراجع Z ، ويعمل Gouraud Daying ، لشبكات مثلث بدون بيانات Normalts؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

لقد واجهت صعوبة في تحديد المعلمات الصحيحة لجهاز PresprayPeters و DirectX ، بحيث يمكن أن يكون هناك تظليل على مستوى القمة على مستوى القمة واستخدام المخزن المؤقت AZ. تعمل بعض الشبكات المثلثات بشكل جيد ، والبعض الآخر لديه مثلثات الخلفية التي تظهر أمام مثلثات الأقرب إلى الكاميرا.

تم العثور على مثال على ذلك هنا: http://gallery.me.com/robert.perkins/100045/zbuffergone. بيانات الإدخال هي قائمة بسيطة من القمم في الجوانب. إن ترتيب تعويذة القمم في كل جانب غير محدد (يأتي من مختلف وظائف تصدير برامج CAD) ولا توجد بيانات Normalts.

يتم إعداد 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)"}). ما هي معلمات الإعداد الصحيحة؟

تحرير: فئة C ++ التي تتفاعل مع DirectX9 تحدد الإعدادات الافتراضية مثل هذا:

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

المحلول

أين تعيد مكالمة غير صالحة؟

تحرير: أنا أفترض في مكالمة enginex9 الجديدة؟ هل حاولت إعداد مقبض نافذة الجهاز في المعلمات الحالية؟

تحرير 2: هل قمت بتشغيل تصحيح الأخطاء في لوحة التحكم DirectX لمعرفة ما إذا كان يخبرك ما هو الخطأ؟

EDIT3: لقد حاولت ضبط BackbufferWidth و Right إلى 0؟ ما الذي تم تعيين BackbufferCount؟ قد يستحق أيضًا تجربة "Format.d24S8" على backbuffer؟ لا تدعم بطاقة الرسومات "ممكنة" 16 بت (من غير المحتمل). هل قمت بتسجيل الوصول إلى القبعات التي تحاول إنشائها صالحة؟ أفكر ، راجع للشغل ، أن لغة CLR التي تستخدمها تقوم بتعيين المعلمات التي لا تعمل على 0؟ أنا شخصياً أفضل أن أكون صريحًا في مثل هذه الحالات ....

ملاحظة: أنا أظن هنا لأن im a native c ++ dx9 poder وليس مشفر clr slimdx ...

EDIT4: أنا متأكد من أنه عدم وجود مقبض النوافذ ... ربما أنا مخطئ ولكن هذا هو الشيء الوحيد الذي يمكنني رؤيته خطأ حقًا في الإعداد الخاص بك. يتطلب جهاز DX9 نافذة نافذة. BTW Set Width and Relight to 0 فقط لاستخدام النافذة التي تقوم بتعيين حجم الجهاز أيضًا ...

تحرير 5: لقد كنت حقًا أتجه إلى الطريق الخطأ هنا. لا حرج في إنشاء الجهاز الذي أنتج جهازك "غير الصحيح". لا تعبث مع المعلمات الحالية فهي بخير. السبب الرئيسي الذي تواجهه لديك مشاكل في تعزيز Z الخاص بك هو أن تقوم بتعيين وظيفة المقارنة دائمًا. هذا يعني أنه ، بغض النظر عن ما يحتويه Z-buffer ، قم بتشكيل البكسل واكتب z في الكتابة فوق Z-buffer كل ما هو موجود بالفعل. كنت أراهن فيها تكمن في مشكلتك في تعزيز Z.

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