Directoare 3D multitext

Bună ziua, dragi minori, 8-)

În lecția anterioară, am analizat cum să lucrăm cu texturile în Direct3D. Astăzi vom considera o astfel de oportunitate ca multitext. Ce este asta? Multitextarea este suprapunerea mai multor texturi pe poligon. Cel mai adesea această metodă este folosită pentru a simula iluminarea. Adică, gradul precalculate de iluminare a unuia sau o altă parte a modelului poligonal, apoi formata harta iradiantă (hartă lumina), care se aplică „peste“ textura de bază a obiectului, creând astfel efectul de iluminare neuniformă a suprafeței. Această tehnică este mult mai rapidă decât calculul iluminării în zbor, așa că a găsit o aplicare largă în jocuri. Există, de asemenea, numeroase aplicații pentru multitext, de exemplu, pentru a simula anumite efecte speciale. În această lecție vom analiza imitația iluminatului poligon. Acest exemplu se bazează pe lecția precedentă, deci pentru non-cititori, vă recomand să le citiți: Direct3D: Textură.







Să mergem!

Pentru început, am schimbat puțin formatul vertexelor noastre, adăugând un parametru care definește culoarea lor. În principiu, această acțiune nu este necesară, dar oferă un câmp larg pentru experimente și vă permite să obțineți efecte frumoase. Cu ajutorul acesteia putem schimba culoarea "lumina reflectoarelor" (lumina). Și culoarea finală este obținută prin interpolarea componentei de culoare a fiecărui vârf. Implicit (dacă nu este specificată nici o culoare), se folosește culoarea albă. Acum, formatul nostru de vertex arata astfel:

Pentru cea de-a doua textură puteți utiliza coordonatele textură, trebuie să adăugați câteva perechi de coordonate tu și tv la descrierea nodurilor și să schimbați, de asemenea, drapelul D3DFVF_TEX1 în D3DFVF_TEX2. Al doilea set de coordonate de textură poate fi folosit, de exemplu, pentru animarea mișcării unei surse de lumină. Pentru aceasta, primul set rămâne același, iar cel de-al doilea set se schimbă. Firește, puteți utiliza mai mult de 2 texturi. Direct3D permite utilizarea simultană a până la 8 texturi.

Apoi, trebuie să încărcați a doua textură. În detaliu, această acțiune a fost descrisă mai devreme, așa că nu ne vom concentra pe această atenție.

dacă (FAILED (D3DXCreateTextureFromFile (g_pd3dDevice, "Spotlight.bmp", g_pSpotLight)))
return false;

Pentru a implementa multi-textură, Direct3D folosește etapele de textură. Fiecare din cele opt texturi maxime poate fi plasată într-unul din aceste nivele. Aceasta se face folosind funcția SetTexture după cum urmează:







Aceasta este, în primul nivel, am stabilit textură originală, iar în al doilea, că vom suprapune în partea de sus. Primul parametru al acestei funcții specifică numărul de nivel la care trebuie plasată textura.

Apoi, trebuie să stabilim stări de textură. Cu ajutorul lor, puteți obține multe efecte diferite. Am folosit aproape setările implicite, dar puteți oricând să experimentați. Apoi, voi descrie câteva stări posibile.

În prima linie, setăm setul de coordonate de textură pe care dorim să le folosim pentru textura corespunzătoare (textura este determinată de numărul de nivel - primul parametru al funcției). În exemplul nostru, folosim un set de coordonate, deci setați D3DTSS_TEXCOORDINDEX la 0. În al doilea rând, setăm modul de filtrare a texturii. Am instalat filtrarea bilineară.

Același lucru se face și pentru cea de-a doua textură:

Luați în considerare stările rămase de textură:

D3DTSS_COLORARG1 (2) - această stare definește primul (al doilea) argument de culoare pentru nivelul texturii, poate lua următoarele valori:
- D3DTA_CURRENT - argument textură - starea cu care a fost afișat nivelul texturii anterioare. Dacă acesta este primul nivel de textură (0), atunci acest argument este echivalent cu D3DTA_DIFFUSE.
- D3DTA_DIFFUSE - argument de textură - o culoare obținută prin interpolarea culorii vârfurilor folosind umbrirea în Guro. Dacă nodurile nu conțin componenta de culoare, este selectată culoarea albă (0xffffff).
- D3DTA_TEXTURE - argument textură - culoarea texturii pentru un anumit nivel de textură.

D3DTSS_ALPHAARG1 (2) - determină primul (al doilea) argument alfa pentru nivelul texturii poate avea aceleași valori ca și D3DTSS_COLORARG1 (2). Valoarea implicită este D3DTA_TEXTURE. Dacă nu este setată o textură pentru acest nivel, se folosește D3DTA_DIFFUSE.

D3DTSS_COLOROP - "această stare stabilește cum vor fi amestecate culorile texturilor. Pot avea următoarele valori:
- D3DTOP_DISABLE - dezactivează ieșirea texturilor de la nivelul curent (etapa) și pentru toate nivelele mai ridicate. Pentru a dezactiva ieșirea texturii, setați această valoare la primul nivel de textură.
- D3DTOP_SELECTARG1 (2) - primul (al doilea) culoare sau alfa argument va fi folosit pentru ieșire.
- D3DTOP_MODULATE - înmulțește componentele de culori din ARG1 și ARG2
- D3DTOP_MODULATE2X (4X) - înmulțește componentele de culoare și schimbă rezultatul cu 1 (2) biți spre stânga, rezultând înmulțirea rezultatului cu 2 (4), adică imaginea devine mai luminată.
- D3DTOP_ADD - Adaugă componentele de culoare ARG1 și ARG2
- D3DTOP_SUBTRACT - culoarea rezultată se obține prin scăderea celui de-al doilea argument ARG2 de la primul argument ARG1.

În mod implicit, D3DTSS_COLOROP pentru primul nivel de textură are valoarea D3DTOP_MODULATE și pentru toate celelalte D3DTOP_DISABLE.

În plus față de cele listate, există mai multe alte state, puteți citi despre ele în secțiunea de ajutor SDK DirectX8 D3DTEXTURESTAGESTATETYPE

După toate aceste operațiuni, rămâne doar să ne atragem primitivul. Acest lucru se face într-un mod standard:

Dacă totul se face în mod corect, atunci ar trebui să obținem un poligon, presupus a fi iluminat de un proiector. Iată ce am primit:

Directoare 3D multitext







Articole similare

Trimiteți-le prietenilor: