Ноу Інти, лекція, текстурирование

мультитекстурирование

Бібліотека Direct3D дозволяє накладати на один полігон не одну, а відразу кілька текстур. Накладення на грань декількох текстур називається мультитекстурирования. На поточний момент підтримується до 8 накладень (рівнів) текстур на одну грань. Схему (принцип) мультитекстурирования можна описати таким чином. Перший текстурний рівень (з індексом 0) приймає на вхід два значення: колір текселя і дифузний колір вершини; виробляє з ними зазначені операції і передає результат на наступний (нижній) рівень. Отримане на попередньому рівні значення кольору використовується в якості одного з аргументу поточного рівня і т.д. Схематично дані кроки мультитекстурирования можна змалювати таку картину:

Ноу Інти, лекція, текстурирование

Як вже стало ясно, при мультитекстурирования справу мають вже з кількома текстурами. При мультитекстурирования можна для кожного текстурного рівня призначити одні і ті ж текстурні координати. У цьому випадку формат вершини і набір прапорів FVF залишаться незміненими. Існує можливість вказати, з якими текстурними координатами буде працювати той чи інший текстурний рівень. Для цього можна скористатися наступними програмними рядками:

Так, наприклад, щоб вказати, що другий рівень буде використовувати текстурні координати першого текстурного рівня, досить скористатися наступним викликом методу: SetTextureStageState (1, D3DTSS_TEXCOORDINDEX, 0). І потім потрібно завантажити (встановити) текстури до відповідних текстурні рівні.

Можна вказати для кожного текстурного рівня свої власні текстурні координати. У цьому випадку повинен коректно змінитися формат вершини при описі і набір FVF прапорів. Нижче наведено приклад опису вершини і FVF прапорів для мультитекстурирования з двома рівнями (текстурами) і текстурними координатами.

При такій каскадної схемою мультитекстурирования ми повинні для кожного текстурного рівня задати два колірних аргументу і операцію над ними за допомогою виклику методу SetTextureStageState інтерфейсу IDirect3DDevice9:

Крім вже відомих значень констант для колірних аргументів в даному виклику може бути використана константа D3DTA_CURRENT. яка говорить, що в якості значення буде братися колір з попереднього текстурного рівня.

Також ми можемо вказати необхідний тип фільтрації текстур для кожного окремо текстурного рівня, вказавши в якості першого аргументу його номер і викликавши метод SetSamplerState інтерфейсу IDirect3DDevice9.

Взагалі кажучи, можна використовувати навіть одну текстуру для реалізації механізму мультитекстурирования. Для цього необхідно в перший і в другий текстурний рівень завантажити одну і ту ж текстуру, але при цьому значення текстурних координат для них повинні відрізняться. Програмний код для цього випадку може виглядати наступним чином:

Нижче наведено приклад мультитекстурирования за допомогою однієї текстури і двох текстурних рівнів.

Схожі статті