هل تحتوي خامة Base Color لديك مسبقًا على Opacity Map؟ 🤔

من أكثر الأسئلة شيوعًا عند العمل مع خامات PBR: «إذا كانت Base Color لدي بصيغة PNG، فهل ما زلت أحتاج إلى Opacity Map؟»

الجواب المختصر: ليس دائمًا. لنبسّط الأمر.

كل صورة مكوّنة من قنوات

تحتوي معظم الصور على ثلاث قنوات لونية:

  • 🔴 الأحمر (Red)
  • 🟢 الأخضر (Green)
  • 🔵 الأزرق (Blue)

تصنع معًا الألوان التي تراها (RGB).

يمكن لـ PNG أن تحتوي على قناة إضافية

على عكس JPG، يمكن لملف PNG تخزين قناة رابعة اسمها Alpha (RGBA):

  • R = الأحمر
  • G = الأخضر
  • B = الأزرق
  • A = ألفا (الشفافية)

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

  • ⚪ 255 ← مرئي بالكامل
  • ⚫ 0 ← شفاف تمامًا
  • 🔘 بين 0 و255 ← شبه شفاف

فكّر في ألفا كقناع غير مرئي يخبر أداة العرض أي البكسلات تظهر وأيها تختفي.

هل أحتاج إلى Opacity Map منفصلة؟

يعتمد الأمر.

✅ الحالة 1 — ملف PNG للون الأساسي يحتوي على ألفا

ملف مثل leaf_baseColor.png يحتوي مسبقًا على RGB وألفا. في هذه الحالة لا تحتاج عادةً إلى Opacity Map منفصلة. في Three.js فعّل الشفافية فقط:

const material = new THREE.MeshStandardMaterial({
  map: texture,
  transparent: true,
});

سيستخدم Three.js تلقائيًا قناة ألفا المخزنة داخل ملف PNG.

✅ الحالة 2 — اللون الأساسي بصيغة JPG

ملف مثل wood_baseColor.jpg لا يمكنه تخزين الشفافية، لذا تحتاج إلى Opacity Map منفصلة مثل wood_opacity.png. في Three.js أسندها إلى alphaMap:

const material = new THREE.MeshStandardMaterial({
  map: baseColor,
  alphaMap: opacityMap,
  transparent: true,
});

ماذا عن glTF؟

معلومة مثيرة: مواصفة glTF 2.0 لا تعرّف خامة Opacity منفصلة. تُخزَّن الشفافية في قناة ألفا لخامة Base Color. لذلك تستخدم معظم أصول glTF الحديثة خامة واحدة Base Color (RGBA) بدل Base Color + Opacity Map.

طريقة بسيطة للتذكر

فكّر في الخامة كورقة:

  • 🎨 تحدد RGB اللون الذي يُرسم.
  • 👻 تحدد ألفا أي أجزاء من الورقة موجودة فعلًا.

يجيب اللون عن «كيف يبدو هذا البكسل؟» وتجيب ألفا عن «هل يجب أن يوجد هذا البكسل أصلًا؟»

فهم هذه التفصيلة الصغيرة يجعل العمل مع خامات PBR وThree.js وBlender وglTF أسهل بكثير. أحيانًا تكون الشفافية التي تبحث عنها مخبأة مسبقًا داخل خامة Base Color.