Ігроробів прозорі об'єкти

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


BoxVertex * pVertices;
m_pBoxVB-> Lock (0, 0, (VOID **) pVertices, 0);

WORD t;
// Add alpha value to vertices
for (t = 0; t pVertices [t] .Diffuse = 0x77FF0000;

Альфа канал задається першою парою чисел. Для зручності можна використовувати макрос D3DCOLOR_ARGB (alpha, red, green, blue). Кожен параметр макросу може мати значення від 0 до 255.
Детально розглядати формат вершин я не буду, тому що це не відповідає темі статті, але повторюся, якщо є питання, то прошу в форум, обов'язково відповім.
Ось і все, тепер, встановивши потрібні стану конвеєра рендеринга ми можемо намалювати нашу коробку:


m_pd3dDevice-> SetVertexDeclaration (m_pBoxDeclaration);
m_pd3dDevice-> SetStreamSource (0, m_pBoxVB, 0, 28);
m_pd3dDevice-> SetIndices (m_pBoxIB);

m_pd3dDevice-> DrawIndexedPrimitive (D3DPT_TRIANGLELIST, 0,
0, m_dwNumVertices,
0, m_dwPrimitivesCount);

А ось і результат:

Ігроробів прозорі об'єкти

Альфа канал в матеріалі
Ми можемо визначити альфа канал і в матеріалі. Для цього створимо матеріал, який містить його:


D3DMATERIAL9 mtrl;
ZeroMemory ( mtrl, sizeof (mtrl));
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 0.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 0.7f; //<<-- степень прозрачности.

Для включення методу встановлюємо D3DRS_DIFFUSEMATERIALSOURCE в D3DMCS_MATERIAL:
m_pd3dDevice-> SetRenderState (D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
Ось власне і все. Незабутній встановити наш матеріал, малюємо коробку і дивимося, що вийшло.

Ігроробів прозорі об'єкти

Схожі статті