17 марта 2010 в 16:38
Direct3D Урок 04: Прозрачность
Сегодня мы поговорим о том, как использовать эффекты прозрачности в ваших проектах. Данным методом пользуются во многих случаях. Когда вам нужно изобразить огонь, воду, дым, стекло, различные зеркала, обычные прозрачные объекты и т.д. Прозрачность достигается путем смешивания текущего пикселя, с пикселем уже находящимся в заднем буфере. Тип смешивания (blending) указывает так называемый Alpha канал. Его можно задавать несколькими способами:
1. В цвете вершин полигонов модели вместо D3DCOLOR_XRGB() можно указать D3DCOLOR_ARGB(a, r, g, b), где первый элемент указывает Alpha канал, 2 - красный компонент цвета, 3 - зеленый, 4 - синий.
2. Использовать текстуру формата, поддерживающим альфа компонент.
3. Указать Альфу в текущем материале.
В данной статье мы рассмотрим первые два метода.
В основе положим урок №3 из этого цикла и немного его модифицируем.
И так, начнем.
После основных Direct3D определений, обьявим несколько новых переменных, отвечающих за показ FPS в заголовке окна.
float FPS; // Время за которое отрисовался последний кадр float mlsec=0.0f; // Переменная для обновления FPS в окне char Capture[64]; // Название приложения char WindowText[64]; // Заголовок окна
Далее обьявим тип смешивания: 0 - смешивание не используем, 1 - Alpha берется из вершин, Alpha берется из текстуры.
int BlendingType=2; // Тип смешивания
Потом как обычно обьявляем вершинный буфер, а также две текстуры: одна обычная, другая - с Альфа каналом.
Следом идет структура вершин и их формат: LPDIRECT3DVERTEXBUFFER9 MyVertexBuffer; // Вертекс буфер для отрисовки кубика LPDIRECT3DTEXTURE9 MyTexture; // Обычная текстура LPDIRECT3DTEXTURE9 MyAlphaTexture; // Текстура с Альфа каналом struct MyVertex { float x,y,z; DWORD color; float tx,ty; }; DWORD MyVertex_FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
Переходим к функции инициализации AllInit и заменям там все строки типа D3DCOLOR_XRGB( 255, 0, 0) на D3DCOLOR_ARGB( alpha, 255, 0, 0). В конце данной функции добавляем загрузку двух наших текстур: Обычную (*.BMP) и с прозрачностью (*.DDS). Для создания текстур, я использовал специальную утилиту DxTex. Но вы можете пользоваться любым доступным редактором, поддерживающим Альфа канал (например, PhotoShop).
// Загружаем текстуру из файла D3DXCreateTextureFromFile(g_pd3dDevice, "Texture.bmp", &MyTexture); D3DXCreateTextureFromFile(g_pd3dDevice, "Texture.dds", &MyAlphaTexture);
Теперь в Render().
Чтобы использовать AlphaBlending нам нужно задать функции смешивания текущего пикселя с пикселем из буфера кадра:
// Функции смешивания g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); // Для источника. g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // Для цели.
Далее в соответствии с состоянием BlendingType выставляем нужные стейты и активируем текстуры.
if(BlendingType==1) // Не используем прозрачность { // Выключаем альфаблендинг g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false); } else if(BlendingType==2) // Прозрачность в текстуре { if( MyAlphaTexture != NULL ) g_pd3dDevice->SetTexture(0, MyAlphaTexture); // Ставим текстуру // Включаем альфаблендинг и выключаем запись в Z-буфер g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false); } else if(BlendingType==3) // Прозрачность в вершинах { if( MyTexture != NULL ) g_pd3dDevice->SetTexture(0, MyTexture); // Ставим текстуру // Включаем альфаблендинг и выключаем запись в Z-буфер g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, false); // Устанавливаем стейты для отображения текстуры ... g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); }
Отрисовка кубика и включение записи в Z-буфер.
// Производим отрисовку g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 12); g_pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);
Как обычно осталось только все использованые интерфейсы правильно освободить:
void AllShutdown() { Cleanup(); // ОСвобождаем память из-под текстур SAFE_RELEASE(MyTexture); SAFE_RELEASE(MyAlphaTexture); SAFE_RELEASE(MyVertexBuffer); SAFE_RELEASE(g_pd3dDevice); SAFE_RELEASE(g_pD3D); }
Все самое главное мы рассмотрели и опустили лишь мелкие детали.
11 января 2017 в 05:45
Heya im for the first time the following. I discovered this specific table as a consequence I to discover The item faithfully of use & the idea rallied round myself publicized lots. I am hoping to deliver a little back again furthermore foster further like so
11 января 2017 в 05:45
Heya im for the first time the following. I discovered this specific table as a consequence I to discover The item faithfully of use & the idea rallied round myself publicized lots. I am hoping to deliver a little back again furthermore foster further like so
3 февраля 2017 в 00:00
Very informative article post.Really looking forward to read more. Fantastic.
3 февраля 2017 в 00:10
Very informative article post.Really looking forward to read more. Fantastic.
авторизуйтесь
или войдите через