الوصول إلى المخزن المؤقت للعمق 32 بت من تظليل الشظايا؟

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

  •  30-09-2019
  •  | 
  •  

سؤال

أحاول القيام بالتقنية التالية للتظليل ، قرأته على موقع Nvidia ويبدو أنه تقنية جيدة. أفضل ذلك لحساب أحجام الظل على وحدة المعالجة المركزية لأنها تبدو أكثر "حقيقية" ويمكنني استخدام هذا واحد للاحتفال الناعم. :

الممر الأول:

  • ملء العازلة عمق من منظور Light0. انسخ هذا العازلة العمق للممر الثاني. (*)

الممر الثاني:

  • عرض عرض من العين ، ولكل جزء:
    • احصل على موقع XY في المخزن المؤقت العمق المخزن في (*). احصل على قيمة 32 بت المقابلة.
    • حساب المسافة إلى الضوء.
    • تطابق هذه المسافة مع قيمة العازلة العمق المخزنة.
    • إذا كان أكبر ، يتم رسم الجزء في وضع GLDISable (LIGH0) ، وإلا فإنه يتم رسمه مع تمكين الضوء. لهذا الغرض ، أستخدم اثنين من التظليل من الأجزاء وشظايا مزيج/مفتاح بين الاثنين وفقًا لمقارنة المسافة.

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

لكنني جديد على OpenGL ولا أفهم كيفية القيام بأي مما يلي:

  • كيفية الوصول إلى هذا المخزن المؤقت لعمق التمرير الأول في تظليل الشظية دون نسخه إلى نسيج ثنائي الأبعاد. أفترض أن هذا غير ممكن؟
  • إذا كان نسخ المخزن المؤقت للعمق 32 بت إلى نسيج يحتوي على 8 بتات في كل R ، G ، B ، مكون ، ثم إعادة تجميع هذه القيمة في تظليل الشظية هو الشيء الأكثر فعالية الذي يمكنني فعله؟
  • إذا كانت هناك امتدادات متعددة المنصات يمكنني استخدامها لهذا.

شكراً إذا كان بإمكان شخص ما مساعدتي أو إعطائي بعض الأفكار ، فأنا أشعر بالذهول في الوقت الحالي وافتقاري إلى الأجهزة الجيدة ووقت الفراغ الذي يجعل عملية مرهقة لتصحيح/تجربة كل شيء.

هل كانت مفيدة؟

المحلول

الطريقة الأولى هي استخدام FBOs مع نسيج GL_DEPTH_COMPONENT المرفق بمرفق GL_DEPTH_ATTACHMENT.

الطريقة الثانية هي استخدام glcopytexim2d مرة أخرى مع نسيج gl_depth_component.

FBOs هي منصة متقاطعة ومتاحة في كل تطبيق OpenGL الحديث تقريبًا ، يجب أن تتوفر لك.

نصائح أخرى

أنت على حق: تحتاج إلى إنشاء نسيج ثنائي الأبعاد من قيم العازلة العمق من أجل استخدام هذه القيم في الممر الثاني.

فيما يتعلق بالملمس نفسه ، أعتقد أن النسخ من 32Bits العمق العازلة إلى 8 بتات RGBA لن يستخدم أ يقذف لتحويل البيانات: للحصول على قيمة متوسطة النطاق للمخزن المؤقت للعمق (على سبيل المثال 0x80000000) ، ستحصل على نصف نغمة على R و G و B و A على نسيج RGBA الخاص بك:

RGBA[0] = 0x80;
RGBA[1] = 0x80;
RGBA[2] = 0x80;
RGBA[3] = 0x80;

حيث كنت تتوقع: (يلقي)

RGBA[0] = 0x80;
RGBA[1] = 0;
RGBA[2] = 0;
RGBA[3] = 0;

لذلك ، بالنسبة للتنسيق الصحيح ، لست متأكدًا ، لكنني أقترح عليك عدم تعديله أثناء النسخة ، لأنك لا ترغب في الحصول على نقل النفقات العامة.

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