Touto časťou si predstavíme ďalšiu vymoženosť DirectX8. Multitexturing predstavuje silný nástroj pre rýchlu a efektívnu prácu s viacerými textúrami. Je to proces, pri ktorom sa na jeden objekt môže namapavať až 8 textúr. To predurčuje multitexturing hlavne na vytváranie špeciálnych efektov: texture light mapping, tiene, voda a mnoho ďalších.

Sú však prípady, kedy sa bez multitexturingu nezaobídete. Napríklad ak by ste chceli vytvoriť malý osvetlený kruh pomocou D3D svetla uprostred veľkého trojuholníka. Nasmerujete spotlight na jeho stred. Po spustení programu však zistíte, že trojuholník nie je osvetlený. Prečo? Problém je v engine D3D. Ten počíta svetlo pre vertexy a nie pre pixle. A kedže spotlight neosvetľuje ani jeden vertex trojuholníka, tak zostane bez svetla. Jedinou záchanou je multitexturing. Pôvodná textúra trojuholníka sa zmieša s textúrou svetla (light mapou) a máte po starostiach.

Predstavíme si dve metódy multitexturingu. Jednoduchšiu - MultiPass a efektívnejšiu - SinglePass. Ešte je tu tretí spôsob - PixelShader, ktorý je hardwarovo podporovaný až v DX8.1 a stále prechádza zmenou. V súčasnej dobe touto technológiou disponuje iba hŕstka nových grafických kariet. Pokiaľ sa nestane bežným zaužívaným štadardom, nebudeme sa mu zatiaľ venovať. Na záver tejto kapitoly si ukážeme prácu s utilitou DX Texture Tool pri vytváraní priehľadných textúr s 8 bitovým alpha kanálom.

MultiPass texturing

Najjednoduhším spôsobom ako zlúčiť dve alebo viacero textúr je použiť MultiPass texturing. Ako napovedá aj názov, touto metódou budú textúry renderované postupne. Najprv je vyrenderovaná prvá textúra a na ňu sú postupne pridávané ďalšie. Z toho plynie jedna veľká nevýhoda: objekt musí byť renderovaný viac krát. Vždy s inou textúrou. To môže predstavovať v prípade objektu s 1000 vertexami veľký problém. Pre zmiešanie dvoch textúr musíte renderovať 2x, tedy zobraziť 2000 vertexov.
Základom multiPass texturingu je Alphablending - proces, ktorým sú miešané dva povrchy (alebo aj dve farby, ak sa na vec pozeráme z elementárneho pohľadu :-) na základe ich alpha kanálu (kanálu priesvitnosti). Ak sú tymito povrchmi textúry, hovoríme o multitexturingu. Čo sa v tom čase deje v backbuffery? Pri renderovaní je logicky zobrazená najprv prvá textúra, ktorá sa tým stáva cieľovou textúrov pre ďalšiu. Na jej povrch sa nanáša druhá zdrojová textúra. Ich zmiešaním vznikne jedna textúra, ktorá je potom cieľom pre ďalšiu zdrojovú - tretiu. A takto to pokrajučuje, podľa toho koľko textúr chcete použiť.

Akým spôsobom budú textúry miešané určuje niekoľko faktorov, ktoré možete nastaviť pre zdrojovú textúru a cieľovú textúru. Výsledná farba pixelu sa potom vypočíta podľa vzťahu:

VyslednaFarba = TexelFarba * SourceBlendFactor + PixelFarba * DestBlendFactor

TexelFarba - farba textelu zdrojovej textúry.

PixelFarba - farba už vyrenderovanej cieľovej textúry.

SourceBlendFactor,DestBlendFactor - faktory. Ich popis najdete v tabuľke.

D3DBLEND_ZERO Blend factor je ARGB (0, 0, 0, 0) - textura má maximálnu transparentnosť
D3DBLEND_ONE Blend factor je (1, 1, 1, 1) - minimálna transparentnosť
D3DBLEND_SRCCOLOR Použije farbu zdrojovej textúry
D3DBLEND_INVSRCCOLOR Použije obrátené hodnoty (1-A,1-R,1-G,-1B) zdrojovej textúry
D3DBLEND_SRCALPHA Použije alpha komponent na všetky kanály (A,A,A,A)
D3DBLEND_INVSRCALPHA Invertuje alpha kanál (1-A,1-A,1-A,1-A)
D3DBLEND_DESTALPHA Použije alpha komponent cieľovej textúry na všetky kanály
D3DBLEND_INVDESTALPHA Ako DESTALPHA, ale s obráteným alpha kanálom (1-A)
D3DBLEND_DESTCOLOR Použije farbu cieľovej textúry
D3DBLEND_INVDESTCOLOR Ako DESTCOLOR, ale s obrátenými hodnotami
D3DBLEND_SRCALPHASAT Blend factor je (F, F, F, 1), kde F = Min(srcA, 1 - destA)
D3DBLEND_BOTHSRCALPHA Zatiaľ nie je podporovaný v DX8
D3DBLEND_BOTHINVSRCALPHA Nastaví INVSRCALPHA pred zdroj a SRCALPHA pre cieľ. Ak nastavíte tento argument pre zdroj, potom je argument cieľa ignorovaný a naopak.

Najlepší spôsob, ako pochopiť princíp kombinovania textúr, je skúšať každý jeden faktor. Tak napr. D3DBLEND_ONE pre zdroj aj cieľ zmieša textúry v pomere 1:1 - každá s polovičnou transparentnosťou. Samozrejme, výsledný efekt sa dá určiť aj z hore uvedeného vzorca. Povedzme, že zmiešame červenú (255,0,0) a modrú (0,0,255) v pomere 1:1. Výsledná farba bude tedy obsahovať 50% z každej pôvodej. Výpočty sú nasledovné:

VyslednaFarba.r = 256 * 0.5 + 0 * 0.5 = 128

VyslednaFarba.g = 0 * 0.5 + 0 * 0.5 = 0

VyslednaFarba.b = 0 * 0.5 + 256 * 0.5 = 128

Výsledná farba je RBG(128,0,128). Z výtvarnej výchovy si ešte pamätám, že z modrej a červenej vznikne fialová :)

Aby D3D vedel kedy má začať alebo ukončiť miešanie musíme zapnúť resp. vypnúť alphablending. Pozrite sa na zdrojový kód:

'1 textura
D3DDevice.SetTexture 0, Textura1
D3DDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 2
'2 textura
D3DDevice.SetTexture 0, Textura2
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR 'SourceBlendFactor
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_DESTALPHA 'DestBlendFactor
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1 'zapneme alphablending
D3DDevice.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 2
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 0

Všimnite si, že objekt musel byť 2x vyrenderovaný, čo nie je moc dobré pre FPS. Pri renderovaní prvej textúry ešte nebol alphablending povolený. Ak by som tak urobil, textúra sa zmieša s hocičím “pod” ňou. V našom prípade s čiernym pozadím.

Pre úplné ozrejmenie alphabledingu sa vrátme k časti Textúrovanie štvorca. Tam ste sa mali možnosť po prvýkrát zoznámiť s multitexturingom. Mnohí určite nevedeli načo sú tam tie 3 riadky kódu, ale vedeli ste, že bez nich nebude textúra kurzoru transparentná. Poďme si celý proces podrobne rozobrať. Tým, ktorí vedia pracovať s API funkciou BitBlt nebudú nasledujúce riadky neznáme. SourceBlendFactor je nastavený na D3DBLEND_SRCALPHA a DestBlendFactor na D3DBLEND_INVSRCALPHA. Zdrojom je tedy textúra kurzoru a cieľom všekto, čo je pod ňou (pod obrázkom kurzora v Z-ovom smere) podľa toho, kam ste pohli myšou.

Textúra obsahuje aj jednobitový alpha kanál. Tzn, že iba jeden bit bol určený pre transparentnosť. A vieme, že bit môže nadobúdať 2 stavy: jednotku a nulu. Bielou farbou u alpha kanálu sú označené všetky “jednotky”. Na týchto miestach je alpha hodnota = 100 % - solídna farba. Naopak, čiernu farbu majú všetky pixle s alpha = 0% - transparentná farba. Nastavením D3DBLEND_SRCALPHA pre zdroj sa z textúry kurzoru budú miešať textely na základe ich alpha hodnoty. Čím väčšia alpha hodnota, tým väčšie percento sa zachová z pôvodného textelu. Preto tie, ktoré majú nulovú alpha hodnotu budú ignorované. Z obrázka je jasné, že sú to všetky bledozelené. Ešte nám ostáva vyriešiť otázku cieľa. Kurzor už máme, teraz treba zabezpečiť, aby bola jeho transparentná časť vyplnená pozadím - tedy cieľom. Nastáva opačný prípad: všetko pod kurzorom musí mať alpha hodnotu rovnú nule, aby sa obrázok kurzoru už s ničím iným nemiešal a okolie kurzoru (jeho transparentná časť) musí mať alpha = 1, aby sa zachovali všetky pixle z cieľa. Preto pre cieľ nastavíme faktor D3DBLEND_INVSRCALPHA. Invertovaný alpha kanál zo zdroja bude použitý pre cieľ.

SinglePass texturing

SinglePass texturing je lepší a rýchlejší spôsob, ako zmiešať textúry ako MultiPass texturing, pretože objekt je vyrenderovaný iba raz. Má to ale jeden háčik: musí byť podporovaný hardvérom. V tom by som už v dnešnej dobe nevidel veľký problém, pretože multitexturing, ako sa zvykne niekedy chybne označovať SinglePass texturing, je dosť stará a rozvinutá technológia. Pamätám sa, že ešte aj starý 3DMark99, ktorý bol určený pre graf. karty prvej generácie, testoval SinglePass texturing v teste na FillRate. Prvá karta s multitexturingom bola TNT. V čom je však rozdiel medzi kartami, je rýchlosť SinglePass texturingu a počet textúr, ktoré je schopné zmiešať v jednom priechode (Single pass). Aby ste zistili ako je na tom vaša karta, použijeme DX8 capabilities:

Dim D3DCaps As D3DCAPS8, MaxStages As Byte, TextInSinglePass As Byte
D3DDevice.GetDeviceCaps D3DCaps
MaxStages = D3DCaps.MaxTextureBlendStages
TextInSinglePass = D3DCaps.MaxSimultaneousTextures
Debug.Print "Maximálny počet texture Stages: " & MaxStages
Debug.Print "Maximálny počet texture v jednom priechode: " & TextInSinglePass

V projekte, ktorý si máte možnosť stiahnuť sa používajú dve alebo až tri textúry naraz. V prípade mojej TNT2 možem použiť maximálne iba 2 textúry (TextInSinglePass = 2). Tým, ktorí sú na tom ešte horšie a chcú si projekt pozrieť, odporúčam prepnúť na softvérovú emuláciu nastavením D3DDEVTYPE_REF pri vytváraní D3D device.

Zmenou prebehne aj deklarácia vertexu a konštanta FVF:

Private Type MojVertex
X As Single
Y As Single
Z As Single
tu1 As Single
tv1 As Single
tu2 As Single
tv2 As Single
tu3 As Single
tv3 As Single
End Type
Const const_FVF = (D3DFVF_XYZ Or D3DFVF_TEX3)

Podľa toho, koľko textúr plánujete použiť, pribúdajú ďalšie mapovacie súradnice tu a tv. Pri FVF je to konštanta D3DFVF_TEX3, kde číslo 3 na konci označuje počet textúr. Pre osem by to bolo D3DFVF_TEX8. Potom nesmiete zabudnúť doplniť ďalšie tu a tv hodnoty pre vertex. Tu vás musím upozorniť, aby ste sa nebáli použiť aj viac deklarácií vertexu a FVF konštánt. Je jasné, že hore uvedený vertex je prispôsobený na multitexturing. Ale obyčajne býva v scéne málo objektov s viacerými textúrami. Je lepšie potom nadeklarovať ďalší “obyčajný” vertex a D3DFVF_TEX1 pre jednotextúrové objekty.

Pri SinglePass texturingu sú textúry najprv hardvérovo zmiešané a až potom namapované na objekt. Odpadá tak nutnosť renderovať objekt viackrát. Pre každú textúru existuje jeden slot, ktorý sa nazýva texture stage. Určite vám nie je tento pojem neznámy. Napr. keď aplikujete textúru príkazom D3DDevice.SetTexture 0, Menotextury viete, že prvý parameter je Texture Stage v rozsahu 0 až 7.

Pre každú obsadenú texture stage sa nastavia dva argumenty (Arg1 a Arg2) a hlavná operácie pre miešanie (OP). Argumenty udávajú v akej forme sa textúra dostane do zmiešavacieho procesu.

Tu je zásadný rozdiel medzi oboma metódami. Pri SinglePass textúrovaní sa s RGB kanálom pracuje oddelene od alpha kanálu! V prípade, že použijete textúry s alpha kanálom, je nutné nadefinovať oba argumenty a zmiešavaciu operáciu aj pre alpha kanál. Na dosiahnutie niektorých efektov sa používa ešte tretí argument ARG0. Všetky spomínané vlastnosti texture stage nastavíme funkciou SetTextureStageState:

'STAGE 0
D3DDevice.SetTexture 0, Textura1
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG12, D3DTA_DIFFUSE)
'STAGE 1
D3DDevice.SetTexture 1, Textura2
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT)
'alpha kanal
Call D3DDevice.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_MODULATE2X)
Call D3DDevice.SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT)

Pozrite si zoznam možných hodnôt pre Arg1 a Arg2:

D3DTA_TEXTURE Defaultný argument pre ARG1. Je použitá nezmenená textúra. Ak nie je textúra zadaná, je namiesto nej použitá biela farba - RGB(255,255,255)
D3DTA_DIFFUSE textúra ovplyvnená difúznou farbou vertexu alebo svetla. Ak je vertex bez difúznej farby, je nastavená na &HFFFFFFFF (biela).
D3DTA_SPECULAR ako D3DTA_DIFFUSE, ale so specular farbou
D3DTA_CURRENT Defaultný argument pre ARG2. Faktorom je výsledok z predchádzajúcej operácie. Pre stage0 je zhodný s D3DTA_DIFFUSE

Zoznam najčastešie používaných zmiešavacích operácií:

D3DTOP_DISABLE Zakáže aktuálnu stage a všetky po nej. Ak bola 3 stage zakázaná, tak stage 4,5,6,7,8 budú ignorované
D3DTOP_SELECTARG1 výsledkom je ARG1 v nezmenenej forme. ARG2 nie je akceptovaný
D3DTOP_SELECTARG2 výsledkom je ARG2 v nezmenenej forme. ARG1 nie je akceptovaný
D3DTOP_MODULATE vynásobí ARG1 a ARG2 hodnoty
D3DTOP_MODULATE2X vynásobí ARG1 a ARG2 hodnoty a potom posunie bity o jedno miesto doľava. Výsledkom je svetlejšia textúra
D3DTOP_MODULATE4X vynásobí ARG1 a ARG2 hodnoty a potom posunie bity o dve miesta doľava. Výsledkom je ešte svetlejšia textúra
D3DTOP_ADD sčíta ARG1 a ARG2
D3DTOP_SUBTRACT odčíta ARG2 od ARG1
D3DTOP_MULTIPLYADD a vynásobí ARG1 a ARG2 a pričíta k ARG0 (ARG0 + ARG1 * ARG2)

Hneď ako skončíte prácu s multitextúrovaním zakážte nepoužívané texture stage. Je to podobný prípad ako s vypínaním AlphaBlendingu. Odporúčam skúšať, skúšať a skúšať. Možno spočiatku vyzerá SinglePass textúrovanie trochu zložitejšie, ale po chvíli určite pochopíte jeho podstatu.

Light Mapping

Ak sa ocitnete v situácii aká bola popísaná na začiatku, určite sa vám budú nasledujúce poznatky hodiť. Pojem Light Mapping veľmi dobre vystihuje podstatu tohto procesu. Skutočne ide o mapovanie svetla na textúru, či už monochromatického, farebného alebo specular svetla. Zvyčajne sa renderuje prvá textúra obsahujúca informácie o svetle - lightmapa a po nej obyčajná textúra. Máte možnosť si vybrať aký typ multitexturingu si pri tom vyberiete. Uvediem už iba prípady pre Single Pass texturing.

Monochrome Light Mapping

Informácie o svetle sú uložené v alpha kanále light mapy. Čím je väčšia alpha hodnota textelu na lightmape, tým je svetlejší výsledný pixel. Ako dostať alpha kanál do textúry sa dozviete v ďalšej sekcii.

Call D3DDevice.SetTexture(0, LightMapa)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG1, _
D3DTA_TEXTURE Or D3DTA_ALPHAREPLICATE)

Color Light Mapping

RGB farba textelu je použitá ako farebné svetlo.

D3DDevice.SetTexture 0, LightMapa
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE)
D3DDevice.SetTexture 1, ObycajnaTextura
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT)

Specular Light Mapping

Na konci predchádzajúcej kapitoly som si nechal priestor pre Specular Light Mapping. Tu je sľubovaná ukážka kódu.

'základná (obyčajná) textúra
Call D3DDevice.SetTexture(0, ObycajnaTextura)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)
'specular light mapa
Call D3DDevice.SetTexture(1, SpecLightMapa)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT)
'RGB light mapa
Call D3DDevice.SetTexture(2, LightMapa)
Call D3DDevice.SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE)
Call D3DDevice.SetTextureStageState(2, D3DTSS_COLORARG2, D3DTA_CURRENT)

AlphaBlending a transparentnosť

Prišlo mi niekoľko emailov, v ktorý ste sa chceli vedieť ako sa dajú vytvoriť priehľadné objekty ako napr. okno alebo pohár. Tu je riešenie: Čo je to alpha blending, bolo už vysvetlené. Keď práve nechcete miešať dve textúry ostáva vám len skúsiť zmiesať textúru a všetko, čo je pod ňou. Aha, to je to, čo sme chceli. Textúra sa stala čiastočne transparentnou vďaka alpha blendingu. Dva povrchy (textúra a pozadie) sa zmiešali na základe ich alpha kanálu. Nech alpha hodnota pozadia je konštantne 1. Potom bude pomer miešania záviseť od alpha hodnoty textúry. Ako ale dostať alpha kanál do textúry? Buď to urobíme za behu programu a nastavíme alpha kanál externe alebo použijeme utilitu DX Texture Tool a vložíme ho priamo do textúry. Pozrime sa najprv aké sú možnosťi v prvom prípade.

S jedným z možných spôsobov pre externé použitie sme sa už stretli v časti Textúrovanie štvorca. Jedna farba, ktorú sme si zvolili bola transparentná. Nebudem sa opäť vracať k jednotkám a nulám. Ďalej tu máme možnosť využiť vertexy a materiál.

Vertex AlphaBlending

Ak nepoužívate D3D svetlo, máte možnosť osvetliť každý vertex manuálne. A to tak, že pridáte difúznu farbu k vertexu. Doteraz sme farbu vertexu zadávali vo formáte RGB. Pri AlphaBlendingu budete potrebovať rozšíriť tento formát o alpha kanál na ARGB. D3D potom dopočíta farebný prechod nielen pre RGB farbu ale aj alpha kanál a to pre každý manuálne osvetlený trojuholník.

'sestnastkova AARRGGBB hodnota
Kocka(0) = VytvorVertex(100, 100, 100, &H8000FFFE, 0, 0, 0,0)
'desiatkova ARGB hodnota
Kocka(0) = VytvorVertex(100, 100, 100, D3DColorARGB(128,0,256,255), 0, 0, 0,0)

Je len na vás, či uprednostníte desiatkový alebo šestnástvový zápis. Pri desiatkovom už nemôžete použiť VB funkciu RGB a žiadnu ARGB funkciu VB nemá. D3D ako vždy ponúka rešenie - D3DColorARGB. Potom upravíme prvú texture stage a máme transparentné vertexy.

Call D3DDevice.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE)
Call D3DDevice.SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT)

Material AlphaBlending

Čo v prípade, že nepoužívame farbu pre vertexy? Pre svetlo sa alpha kanál nedá nastaviť. Našťastie pre materiál áno.

'Nastavime material
Dim Mtrl As D3DMATERIAL8, Col As D3DCOLORVALUE
Col.a = 0.4: Col.r = 1: Col.g = 1: Col.b = 1
Mtrl.Ambient = Col
Mtrl.diffuse = Col
D3DDevice.SetMaterial Mtrl
D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
'Vsetky transparentne objekty renderujte tu
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 0

Dodržujte poradie renderovaných objektov! Najprv idú netransparentné objekty a až potom transparentné.

Interný alpha kanál

Existuje niekoľko typov grafických súborov, ktoré podporujú alpha kanál ako napr. GIF, PNG. Žiaľ ani jeden nie je podporovaný v DirectX8. Microsoft vytvoril nový formát DDS (DirectDrawSurface). Základ je podobný BMP súboru - pre každý jeden pixel je udaná RGB farba a navyše alpha hodnota. Samotný BMP formát je náročný na priestor na disku a takto sa nároky ešte zväčšujú. Preto sa DDS dajú skomprimovať. Je hneď niekoľko formátov kompresie od DXT1 s 1 bitom pre alpha kanál až po priestorovo najnáročnejší DXT5 s 8 bitmi. Kompresia je narozdiel od napr. JPG bezstratová, i keď nedosahuje ani zďaleka taký kompresný pomer.

DDS formát môžete vytvoriť v utilite DX Texture Tool, ktorú nájdete v DX8 SDK. Práca s ňou je veľmi jednoduchá. Otvoríte klasickú bitmapu (File/Open) pre RGB kanál. Potom otvoríte druhú monochromatickú alpha mapu (File/Open Onto Alpha Channel Of This Texture) pre alpha kanál. Môže to byť napr. bitmapa. Ak je farebná, tak bude automaticky zmenená na monochromatickú. Čím viac sa farba jej pixelu blíži k čiernej, tým viac bude pixel na výslednej textúre transparentný. Naopak biely pixel znamená solídnu farbu. Výsledok vidíte priamo v okne. Ak chcete vidieť iba alpha kanál zaškrtnite položku v menu (View/Alpha Channel Only). Nakoniec DDS súbor uložíte (File/Save), či už v nekomprimovanej forme alebo DXT formáte.

Načítanie DDS súboru do DirectX je rovnaké ako pre každú inú textúru (funkciou CreateTextureFromFile). Napokon upravíte prvú texture stage a zapnete AlphaBlending a máte per-pixel transparentné objekty. Ak si chcete pozrieť DDS súbor v akcii, stiahnite si zdrojový súbor. V adresáry transparent sa nachádza ukážka materiálovej transparentnosti. Otvorte projekt a pri loadovaní textúr nahradte pôvodnú textúru Box1.jpg súborom Box1.dds a máte kombinovanú material-DDS transparenosť.

Priložené súbory: