Polygonien piirtäminen 3D-tilassa

Vanhalla tavalla piirtämisen ongelma on, että kuva tai polygoni on aina xy-pinnan päällä, eli kaikilla kulmilla on sama syvyys. Oikeassa 3D:ssä halutaan, että verteksit voivat olla eri syvyyksillä. Tästä lähtien puhumme z-koordinaatista syvyyden sijaan. Koordinaatit määritetään siis (x,y,z)-sarjoina. Tätä varten edistyneemmistä piirtofunktioista on olemassa erikoisversiot:

d3d_primitive_begin(kind) Aloittaa määritetyn tyyppisen 3D-primitiivin: pr_pointlist, pr_linelist, pr_linestrip,pr_trianglelist,pr_trianglestrip tai pr_trianglefan.
d3d_vertex(x,y,z) Lisää primitiiviin verteksin (x,y,z) käyttäen aiemmin määritettyä väri- ja läpinäkyvyysarvoa.
d3d_vertex_color(x,y,z,col,alpha) Lisää primitiiviin verteksin (x,y,z) käyttäen sen omaa väri- ja läpinäkyvyysarvoa. Tällä tavoin voit luoda primitiivejä, joiden värit ja läpinäkyvyysarvo vaihtuvat sulavasti.
d3d_primitive_end() Päättää primitiivin kuvailun. Itse asiassa tämä funktio myös piirtää sen.

Esimerkiksi tetraedrin (kolmisivuinen pyramidi) piirtämiseksi z=0 -pinnalle sen huipun ollessa korkeudella z = 200 voit käyttää seuraavaa koodia:

{
  d3d_primitive_begin(pr_trianglelist);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,200,0);
    d3d_vertex(200,200,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(200,200,0);
    d3d_vertex(100,100,0);    
    d3d_vertex(150,150,200);
    d3d_vertex(100,100,0);
    d3d_vertex(100,200,0);    
    d3d_vertex(200,200,0);
  d3d_primitive_end();
}

Jos käyttäisit tätä, näkisit luultavasti vain kolmion ruudulla, koska tetraedrin huippu on sen takana kuvakulmasta katsottuna. Lisäksi koska se käyttää vain yhtä väriä, sen sivuja on vaikea erottaa toisistaan. Myöhemmin käydään läpi useita tapoja kuvakulman muuttamiseen. Värien määrittäminen voidaan tehdä, kuten ennenkin, lisäämällä draw_set_color(col) -funktion kutsut verteksien väliin.

Voit käyttää 3D-tilassa myös polygoneja, joilla on tekstuuri. Tämä toimii täsmälleen samalla tavalla kuin aiemmin esitellyt edistyneemmät piirtofunktiot. On kuitenkin huomattava yksi asia. Tekstuurissa sijainti (0,0) on ylävasen kulma. Usein kuitenkin projektioita käytettäessä (kuten myöhemmin mainitaan) alavasen kulma on (0,0). Tässä tapauksessa sinun tulee ehkä kääntää kuva ylösalaisin.

d3d_primitive_begin_texture(kind,texid) Aloittaa määritetyn tyyppisen primitiivin määritetyllä tekstuurilla.
d3d_vertex_texture(x,y,z,xtex,ytex) Lisää primitiiviin verteksin (x,y,z) liittäen siihen tekstuurin sijainnin (xtex,ytex), sekoittaen siihen aiemmin määritetyn väri- ja läpinäkyvyysarvon.
d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) Lisää primitiiviin verteksin (x,y,z) liittäen siihen tekstuurin sijainnin (xtex,ytex) ja sekoittaen siihen sen oman väri- ja läpinäkyvyysarvon.
d3d_primitive_end() Päättää primitiivin kuvailun. Itse asiassa tämä funktio myäs piirtää sen.

Voit siis esimerkiksi käyttää seuraavaa koodia piirtääksesi taustan, joka katoaa etäisyyteen:

{
  var ttt;
  ttt = background_get_texture(back);
  d3d_primitive_begin_texture(pr_trianglefan,ttt);
    d3d_vertex_texture(0,480,0,0,0);
    d3d_vertex_texture(640,480,0,1,0);    
    d3d_vertex_texture(640,480,1000,1,1);
    d3d_vertex_texture(0,480,1000,0,1);
  d3d_primitive_end();
}

Kolmiolla on etu- ja takapinta. Etupinnaksi määritellään pinta, jolla verteksit on määritelty vastapäiväisessä järjestyksessä. Tavallisesti molemmat pinnat piirretään. Jos kuitenkin määrität suljetun kappaleen, tämä on resurssien tuhlaamista, sillä kolmion takapintaa ei voi koskaan nähdä. Tässä tapauksessa voit kytkeä päälle takapintojen karsimisen (backface culling). Tämä säästää noin puolet piirtämiseen kuluvasta ajasta, mutta tällöin sinun tulee suunnitella polygonisi huolella. Tähän tarkoitukseen on olemassa seuraava funktio:

d3d_set_culling(cull) Määrittää, kytketäänkö takapintojen karsiminen päälle (tosi) vai pois päältä (epätosi).