Kun piirrän puun, siihen tulee bugi. Kuva: http://zux.sjr.fi/touho/tree.jpg
Se taso, jonka piirrän viimeisenä, näkyy oikein, mutta ensiksi piirretty taso näyttää taustalla vain valkoista, eikä toista tasoa.
Käytössä on glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Miten saan puun näkymään oikein?
Varmaankin kannattaa ladata se jotenkin niin, että alpha-kanava tulee mukaan. Tuo nyt vaikuttaisi minusta siltä, ettei blendaus ole käytössä. Muistithan varmasti myös laittaa glEnable(GL_BLEND)
?
Alpha kanava kyllä toimii ja blendi on käytössä, koska toinen noista kahdesta tasosta näkyy hyvin ja sen alpha kanava huomioidaan.
void DrawTrees() { glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); int i; for(i=0;i<TREES;i++) { glPushMatrix(); glTranslatef(tree[i].x, tree[i].y, tree[i].z); glScalef(30.0f, 30.0f, 30.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 2.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, 2.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 2.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 2.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 0.0f, 0.0f); glEnd(); glPopMatrix(); } glDisable(GL_BLEND); return; }
Ah niin. Läpinäkyvästäkin piirtämisestä jää jälki syvyyspuskuriin. Purkkaratkaisuna voit piirtää nuo kahteen kertaan, ensimmäisellä kerralla glDepthMask(GL_FALSE) ennen piirtoa ja piirron päätteeksi glDepthMask(GL_TRUE), jolloin siis syvyyspuskuriin ei kirjoiteta mitään piirron aikana. Näin kummatkin osat piirtyvät kertaalleen. Mutkikkaammilla rakenteilla näin yksinkertainen temppu ei enää toimi.
Läpinäkyvien pikselien piirron estämiseen oli kyllä jokin ihan oikea funktiokin, mutta enpä nyt keksi nimeltä...
Toimii, kiitoksia.
Käytä alpha-testiä, jolloin täysin läpinäkyvät pikselit eivät piirry syvyyspuskuriin. Eli jonnekin alkuun:
glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_NOTEQUAL,0.0f);
Tässä ratkaisussa ongelmaksi muodostuu osittain läpinäkyvät osat (esim. tekstuurissa näkyvä-läpinäkyvä-raja.) Itse käyttäisin tässä tilanteessa omaa tapaani, mutta tämä ei kuitenkaan ratkaise ongelmaa osittain läpinäkyvien osien kanssa.
Tai voisit vain muuttaa quadien piirtojärjestystä, jos kamera ei pysty kääntymään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.