الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 1

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


D3DCOLOR clr = D3DCOLOR_ARGB(0,255,0,0); // أحمر مع شفافية تامة
 
... // عملية الضغط
D3DXLoadSurfaceFromSurface(...); // باستخدام هذا الإجراء
...
 
D3DCOLOR decompressedClr = DecompressColor(0,0);
 
// هنا أجد أن قيمة اللون بعد الضغط أصبحت سوداء تماماً
assert( decompressedClr != D3DCOLOR_ARGB(0,0,0,0) ); // يفشل
 
أنا أريد الحفاظ على القيمة اللونية للبكسل حتى وإن كانت قيمة ألفا له تساوي صفراً... فهل هناك طريقة في مكتبة D3DX لتفادي هذا التصرف؟

(أستخدم عدة تطوير دايركت إكس - الإصدار مارس 2009)

شكراً.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير مدير وسام البهنسي مشاركة 2

وفي 27/رجب/1430 06:46 م، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:

لدي صورة مع قناة ألفا وأودّ أن أضغطها بصيغة DXT1

في 27/رجب/1430 06:46 م، قال وسام البهنسي بهدوء وتؤدة:

أريد الحفاظ على القيمة اللونية للبكسل حتى وإن كانت قيمة ألفا له تساوي صفراً

حسناً، بعد الاطلاع على مواصفات ضغط DXT1 فإن ما أطالب به أساساً غير مدعوم. فالضاغط ووحدة معاينة الإكساء (texture sampler) كليهما مجبوران على افتراض اللون الأسود التام في حال كون التكسل شفافاً.
الحل الالتفافي للتغلب على هذه العقبة والوصول إلى ما أريده هو الكذب على الضاغط والمعاين وإخبارهما بأن الإكساء أساساً لا يوجد به شفافية بينما أخزن البت الخاص بالشفافية في إحدى القنوات اللونية (البت الأعلى من قناة اللون الأخضر مثلاً) وأكشف عن هذا البت في المظلل وأتعامل معه كما يجب.
 
حسناً، عودة إلى العمل ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز