У цій статті я хотів би розглянути такий чудовий ефект як прозорість. Існує кілька способів додавання прозорості в Вашу сцену, розглянемо кілька з них. але трохи пізніше, спочатку я б хотів трохи відійти від теми і розповісти про те, як написаний приклад, щоб потім не було зайвих питань;)
Щоб не обтяжувати себе написанням каркаса додатки, я використовував D3DFramework, який поставляється разом з DX9SDK і з його допомогою можна легко створювати простенькі додатки (наприклад, наше). Я використовував DX9Appwizard для створення каркаса.
Далі, так як я страшно лінива людина, то коробку, яка малюється в прикладі, я не захотів малювати ручками і використовував функцію D3DXCreateBox (). Потім за допомогою методу CloneMesh () інтерфейсу ID3DXMesh я зробив нашої коробки потрібних формат вершин, до речі, формат вершин описував не з допомогою FVF, а за допомогою Vertex Declaration (якщо виникнуть питання з цього моменту, то прошу в форум, поговоримо :). Ще я намалював фон, щоб можна було чіткіше побачити роботу того чи іншого методу.
Начебто все розповів, тепер власне до справи !!
Альфа Блендінг використовується для того, щоб відображати зображення в яких є прозорі або напівпрозорі пікселі. На додаток до червоного, зеленого і синього кольорів складової, кожен піксель може мати "прозору" складову, яку в народі називають альфа канал (alpha channel). Альфа канал зазвичай має стільки ж біт, скільки і основне колірної канал. Наприклад, восьми бітний альфа канал може мати 256 рівнів прозорості, від 0 (піксель повністю прозорий) до 255 (піксель повністю не прозорий).
Для включення альфа блендінга, в Direct3D необхідно встановити параметр D3DRS_ALPHABLENDENABLE в TRUE:
У Direct3D колір може бути заданий як з використанням альфа каналу (RGBA), так і без нього (RGB). Прозорість може міститися в вершинах, в матеріалі, в текстурі. Також можна використовувати буфер кадру (Frame buffer), щоб робити деякі ефекти.
Розглянемо докладніше всі ці методи.
Назва методу говорить сама за себе. Альфа канал ми будемо зберігати в кожній вершині об'єкта. Для включення цього методу необхідно встановити параметр D3DRS_DIFFUSEMATERIALSOURCE в D3DMCS_COLOR1. Цим ми даємо зрозуміти, що хочемо використовувати колір з вершинних даних, а не з матеріалу.
Розглянемо, що ж означають ці параметри:
D3DRS_DIFFUSEMATERIALSOURCE - визначає джерело кольору для розрахунку освітлення. Може мати наступні значення:
D3DMCS_MATERIAL - використовує колір з поточного матеріалу
D3DMCS_COLOR1 - використовує diffuse color з вершини
D3DMCS_COLOR2 - використовує specular color з вершини
За замовчуванням варто D3DMCS_COLOR1.
Також нам треба дати зрозуміти Direct3D, що ми хочемо, щоб колір вершин брав участь в прорахунку освітлення. Робиться це в такий спосіб:
В принципі, це стан за замовчуванням стоїть в TRUE, але про всяк випадок поставити треба.
Тепер нам треба додати альфа канал в кожну вершину нашої коробки:
Альфа канал задається першою парою чисел. Для зручності можна використовувати макрос D3DCOLOR_ARGB (alpha, red, green, blue). Кожен параметр макросу може мати значення від 0 до 255.
Детально розглядати формат вершин я не буду, тому що це не відповідає темі статті, але повторюся, якщо є питання, то прошу в форум, обов'язково відповім.
Ось і все, тепер, встановивши потрібні стану конвеєра рендеринга ми можемо намалювати нашу коробку:
А ось і результат:
Ми можемо визначити альфа канал і в матеріалі. Для цього створимо матеріал, який містить його:
Для включення методу встановлюємо D3DRS_DIFFUSEMATERIALSOURCE в D3DMCS_MATERIAL:
Ось власне і все. Незабутній встановити наш матеріал, малюємо коробку і дивимося, що вийшло.