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?
Koita laitaa glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
Pöytälamppu kirjoitti:
Koita laitaa glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
Kokeiltu on eikä toimi.
Varmaan muistit laittaa myös blendauksen päälle: glEnable(GL_BLEND);
Ja lataathan varmasti kuvan alphakanavansa kanssa?
Piirräthän objektit varmasti järjestyksessä takimmaisesta etummaiseen? Jos kaikki objektit ovat samalla tasolla (2D-peli), niin eihän syvyystestaus ole päällä?
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.
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.
//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/
Ihan oikealta tuo näyttäisi. Laitaisitko vielä koodin, joka luo tuon autotekstuurin.
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); }
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
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...
Aihe on jo aika vanha, joten et voi enää vastata siihen.