Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL läpinäkyvyysongelma

Sivun loppuun

Tumpelo [10.11.2006 15:07:03]

#

Tilanne on se, että minulla on kuva, jossa on alphakanava, ja läpinäkyvät kohdat pitäisi saada näkymään läpinäkyvänä. No, glAlphaTest funktiolla se toimi, mutta sitten käy niin, että jos piirrän ennen tätä läpinäkyvää kuvaa vaikka taustan, niin ne seuraavan kuvan läpinäkyvät kohdat näkyy mustina, ei taustakuvan väreillä. Sitten kokeilin glBlendFunc():ia, mutta sillä en saa oikein mitään järkevää aikaiseksi, olen kokeillut funktiolle kaikkia mahdollisia arvoyhdistelmiä mutta mikään ei tuota haluttua tulosta, ei edes sitä että läpinäkyvät kohdat näkyisivät mustina, vaan koko kuva aina haalistuu, vain haalistumisen tyyli vaihtelee funktion arvojen mukana. Olisiko mitään apua tarjota?

Pöytälamppu [10.11.2006 15:33:10]

#

Koita laitaa glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

Tumpelo [10.11.2006 15:42:04]

#

Pöytälamppu kirjoitti:

Koita laitaa glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

Kokeiltu on eikä toimi.

Metabolix [10.11.2006 16:50:07]

#

Varmaan muistit laittaa myös blendauksen päälle: glEnable(GL_BLEND);
Ja lataathan varmasti kuvan alphakanavansa kanssa?

Markus [10.11.2006 17:21:48]

#

Piirräthän objektit varmasti järjestyksessä takimmaisesta etummaiseen? Jos kaikki objektit ovat samalla tasolla (2D-peli), niin eihän syvyystestaus ole päällä?

Tumpelo [10.11.2006 17:29:31]

#

Markus kirjoitti:

Piirräthän objektit varmasti järjestyksessä takimmaisesta etummaiseen? Jos kaikki objektit ovat samalla tasolla (2D-peli), niin eihän syvyystestaus ole päällä?

Syvyystestaus ei ole päällä koska peli on 2D. Ja muistin enabloida blendauksen myöskin.

Markus [10.11.2006 17:40:01]

#

Onhan glAlphaFunc asetettu sopivaan arvoon?
Onhan GL_ALPHA_TEST laitettu päälle glEnable-funktiolla?

edit:
Minkä värisiä ne läpiväkyvät kohdat oikeasti ovat (kun läpinäkyvyyttä ei oteta huomioon). Mustia vai?

Jos asia ei vieläkään selviä, niin laitä näkyviin piirtokoodin kriittisimmät osat ja ota pari ongelmaa selventävää screenshottia.

Tumpelo [10.11.2006 18:18:14]

#

//Taustakuva
glBindTexture(GL_TEXTURE_2D, Race[2]);

glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 1.0f); glVertex3f( -1.0f, 0.0f, 0.0f);
	glTexCoord2f(0.0f, 0.0f); glVertex3f( -1.0f, 1.0f, 0.0f);
	glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
	glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.0f, 0.0f);
glEnd();

//Auto
glEnable(GL_ALPHA_TEST);

glAlphaFunc(GL_GREATER, 0.1);

glBindTexture(GL_TEXTURE_2D, CarTex[0]);

glBegin(GL_QUADS);
	glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.5f, Car.RideHeight / 3 + 0.0f, 0.0f);
	glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.5f, Car.RideHeight / 3 + 0.5f, 0.0f);
	glTexCoord2f(1.0f, 0.0f); glVertex3f( -0.5f, Car.RideHeight / 3 + 0.5f, 0.0f);
	glTexCoord2f(1.0f, 1.0f); glVertex3f( -0.5f, Car.RideHeight / 3 + 0.0f, 0.0f);
glEnd();

glDisable(GL_ALPHA_TEST);

Tulos: http://img259.imageshack.us/img259/5908/kuvakaappaushd6.jpg

Markus [10.11.2006 18:32:15]

#

Ihan oikealta tuo näyttäisi. Laitaisitko vielä koodin, joka luo tuon autotekstuurin.

Tumpelo [10.11.2006 18:34:19]

#

if ((TextureImage[0] = IMG_Load("Cars/Example/car.png")))
{
glGenTextures(1, &CarTex[0]);

glBindTexture(GL_TEXTURE_2D, CarTex[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->w, TextureImage[0]->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, TextureImage[0]->pixels);
}

Markus [10.11.2006 19:24:59]

#

glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->w, TextureImage[0]->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, TextureImage[0]->pixels);

Et luo tekstuuriisi alpha-kanavaa.
Vaihda "internalformat"-parametri arvosta 3 arvoon 4 (tai sen symboliseen vastineeseen: GL_RGBA).

edit.

Tai jos et halua formaatin määräytyvän automaattisesti komponenttien määrästä, voit myös antaa suoraan jonkin alpha-kanavallisen formaatin esim. GL_RGBA8

Tumpelo [10.11.2006 20:52:53]

#

Ah, kiitos, nyt toimii hienosti. Olisi tosiaan pitänyt huomata ettei pelkkä GL_RGBA riitä vaan pitää muuttaa tuo lukukin. No, tässä sitä kerätään kokemusta...


Sivun alkuun

Vastaus

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

Tietoa sivustosta