Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: OpenGL-blendausongelma

Touho [28.06.2007 20:46:41]

#

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?

Metabolix [28.06.2007 22:10:02]

#

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)?

Touho [28.06.2007 23:05:34]

#

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;
}

Metabolix [28.06.2007 23:22:57]

#

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ä...

Touho [29.06.2007 02:57:11]

#

Toimii, kiitoksia.

Pöytälamppu [29.06.2007 09:40:00]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta