Touto časťou by ste mali mať zvládnuté základné techniky 2D grafiky. S textúrami sa ešte stretnete pri Direct3D. Rozhodolsom sa, že si textúrovanie ukážeme už v tejto časti. O to ľahšie to pochopíte v neskorších častiach,kde to bude náročnejšie.

Čo je textúra ?

Textúra je 2D bitmapa. Direct3D ju nahrá do pamäti apotom namapuje(,,natiahne”) na objekt.

Veľkosť textúr musí byť V = 2^n pixlov. Napríklad: 16,32,64,128,256,512,1024… To znamená, že keď chcete použiť textúru s veľkosťou 600×600 musíte ju zmenšiť na 512×512(alebo ju nepoužijete celú). Zapamätajte si, že pri mapovaní sa nepoužívajú pixle, ale súradnice od 0 po 1. U textúry 256×256 súradnica 0 predstavuje pixel 0 a súradnica 1 pixel 255 (nie 256 - začíname od nuly!). Pozri obrázok.

Prevod medzi pixelmi a súradnicami je nasledovný :

Aktualna_suradnica = Aktualny_pixel / Velkost_Textury

Pr.: 0.5 = 128 / 256

Zvyknite si používať čo najmenšie textúry (najideálnejšie sú 256×256).V skutočnosti zaberajú textúry 4x viac miesta v pamäti ako je ich reálna veľkosť. I keď už v súčastnosti sú bežné karty s 32 MB pamäti, čo je dostatok aj pre obrovské textúry. No, nikdy neviete, na akej mašine váš program pobeží :) Pri nedostatku pamäte sa zníži výkon celého systému, alebo sa objekt vôbec neotextúruje.

Kolorizovanie textúr

V projekte sú vytvorené 2 štvorce (ak nerátam kurzor). Prvý je kolorizovaný a druhý nie. Pritom používajú rovnakú textúru. Je to spôsobené farbou vertexov, ktoré tvoria štvorec. Pri prvom sú vertexy rôznej farby a druhom sú všetky štyri bielej. Práve tu spočíva ten trik, ktorý možete vo svojích projektoch využiť.

Transparentnosť

Transparentná čast je priesvitná, tzn. že nie je renderovaná. Jej využitie je obrovské.

Príklad: Chceli by ste vytvoriť kruh. Bez transparentnosti by ste potrebovali aspoň 50 vertexov s použitím sínusu a kosínusu. Kdež to s transparentnosťou vám stačia 4 vertexy na vytvorenie štvorca s textúrou kruhu a transparentnou farbou okolo neho.

Dosť bolo teóre

Rozoberme si konkrétny príklad:

Hneď na začiatku by som chcel spomenúť zopár zmien v štruktúre príkladu:

+ Už nepoužívame oknový mód, ale fullscreen

+ Hlavný cyklus už nezabezpečuje timer, ale príkaz Do..Loop, ktorý je vykonávaný až do vtedy, kým užívateľ neklikne na formulár. Dôvody sú dúfam jasné - FPS nie je limitované timerom.

Private Type MojVERTEXX As Single
Y As Single
Z As Single
rhw As Single
color As Long
specular As Long
tu As Single 'x suradnica textury
tv As Single 'y surednica textury
End Type
Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
Dim D3DX As D3DX8  'pomocna kniznica. Obsahuje mnoho uzitocnych funkcii.
Dim Texture As Direct3DTexture8  'deklaracia textury
Dim TransTexture As Direct3DTexture8 'toto bude transparentna textura kurzoru

Deklarácia vertexu bola pozmenená, resp. pribudol specular (teraz nebude rozobraný) a tu a tv. Sú to súradnice textúry v rozsahu 0 až 1. Dôležité je si všimnúť konštantu FVF, ktorá teraz obsahuje D3DFVF_TEX1.Tu robia mnohí začiatočníci chybu. Chcú použiť textúru a zabudnú pridať túto konštantu. V Direct3D môžete použiť až 8 textúr na jeden objekt (multi-texturing). Nám zatiaľ stačí iba jedna. Preto čislo za D3DFVF_TEX je rovné 1.

Knižnica Dx8vb.Dll obsahuje pomocnú knižnicu D3DX8. S ňou sa teraz budeme stretávať pravidelne. Obsahuje množstvo užitočných funkcií, ktoré by sa cez Visual Basic dali len ťažko naprogramovať.

Taktiež textúra musí byť deklarovaná. Pozn.: Zvyknite si používať Object Browser vo VB.

Nasleduje nahratie textúry do pamäte:

D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, True
Set Texture = D3DX.CreateTextureFromFile(D3DDevice, App.Path & "\Textura.bmp")
Set TransTexture = D3DX.CreateTextureFromFileEx(D3DDevice, App.Path & "\transtextura.bmp",_
64, 64,D3DX_DEFAULT, 0, D3DFMT_A1R5G5B5, _
D3DPOOL_MANAGED, D3DX_FILTER_POINT, _
D3DX_FILTER_POINT, Transparentna_Farba, _
ByVal 0, ByVal 0)

Prvé 3 riadky kódu inicializujú AlphaBlending (Priesvitnosť). Je to potrebné, aby naša transparentná textúra bola v skutočnosti transparentná.

CreateTextureFromFile

Funkciou CreateTextureFromFile vytvoríme textúru zo súboru Textura.BMP. Všetky potrebné nastavenia si zistí D3D sám.

Device = D3DDevice - ktoré Direct3DDevice akceptuje textúru

Path - cesta k suboru

Transparentná textúra vyžaduje použitie CreateTextureFromFileEx. Je to nadstavba CreateTextureFromFile, ktorá umožňuje nastaviť mnohé parametre textúry (medzi nimi aj transparentnosť).

CreateTextureFromFileEx

Width = 64 - šírka textúry

Height = 64 - výška textúry

MipLevels = D3DX_DEFAULT - koľko Mip-Map levelov bude vygenerovaných. Defualt = 0.

Usage = 0 - využitie. Zatiaľ 0. Možete nastaviť vašu textúru ako cieľ renderovania. Dobré pre niektoré špeciálne efekty.

Format = D3DFMT_A1R5G5B5 - Formát povrchu textúry - 16 bitový s 1bitovým alpha kanálom. To znamená, že priehľadná farba môže byť iba jedna.

Pool = D3DPOOL_MANAGED - systém uloženia a spravovania v pamäti. Už sme sa s tým stretli pri vytváraní vertexbufferu. Tento typ použije pamäť, ktorá je hardvérom bežne dostupná.

Filter = D3DX_FILTER_POINT - filter pixelov. Filtrovanie textúr má vplyv na kvalitu textúr. Platí, že čím kvalitnejší filter použijeme,
tým viac výkonu sa spotrebuje. Najkavalitnejšie, ale najpomalšie filtrovanie je D3DX_FILTER_TRIANGLE, kedy každý pixel je zhodný s pixlom v bitmape.

Mipfilter = D3DX_FILTER_POINT - to isté, ale pre Mip-Mapping

ColorKey = Transparentna_farba - ktorá farba bude transparentná.V našom prípade zelená.

SrcInfo = Byval 0 - Umožnuje zistiť informácie o zdrojovej bitmape - nepoužité

Renderovanie

D3DDevice.SetTexture 0, Texture 'Ktoru texturu pouzijeme
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Pole_Vertexov1(0),
Len(Pole_Vertexov1(0))
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Pole_Vertexov2(0),
Len(Pole_Vertexov2(0))       D3DDevice.SetTexture 0, TransTexture
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Pole_Vertexov3(0),
Len(Pole_Vertexov3(0))

Pri renderovaní musíme dať D3D vedieť, ktorú textúru chceme použiť a on si ju už v pamäti sám nájde.

SetTexture

Stage = 0 - pozri dodatok

Texture = Texture - naša textúra

V príklade som nevytváral Vertex Buffer. Všetky vertexy sa nachádzajú v systémovej pamäti. Pokiaľ chceme renderovať priamo odtiaľ musíme použiť DrawPrimitiveUP. Koncovka UP znamená User Memory Pointer.

PrimitiveType - spôsob spájania vertexov

PrimitiveCount = 2 - počet objektov, ktoré budú vykreslené.

VertexStreamZeroStride - prvý index poľa vertexov určené na renderovanie.

VertexStreamZeroStride - veľkosť poľa

Dodatok

Texture stage

V D3D exitstuje 8 texture stage, indexovaných od 0 po 7 (pokiaľ to hardvér podporuje, tak aj viac). Sú to “skupiny” textúr s odlišnými vlastnosťami. Pre každú skupinu môžete nastaviť odlišný spôsob renderovania. Často krát sa využíva pri miešaní viacerých textúr do jednej.

Priložené súbory: