Juu eli minulla olisi kysyttävää blendauksesta (mikä lie suomen kielinen sana tuolle?). Eli, minulla on tällainen funktio 3D pelissäni (karsittu versio):
int DrawBush(double x, double z) { glEnable(GL_BLEND); /* Sivusuuntainen juttu */ glBlendFunc(GL_DST_COLOR, GL_ZERO); glBindTexture(GL_TEXTURE_2D, texture[3]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3f(x + -1.0f, 0.0f, z + -5.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x + -1.0f, 1.0f, z + -5.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x + 1.0f, 1.0f, z + -5.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(x + 1.0f, 0.0f, z + -5.0f); glEnd(); glBlendFunc(GL_ONE, GL_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, texture[4]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3f(x + -1.0f, 0.0f, z + -5.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x + -1.0f, 1.0f, z + -5.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x + 1.0f, 1.0f, z + -5.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(x + 1.0f, 0.0f, z + -5.0f); glEnd(); /* Syvyyssuuntainen juttu */ glBlendFunc(GL_DST_COLOR,GL_ZERO); glBindTexture(GL_TEXTURE_2D, texture[3]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.0f, 0.0f, z + -4.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x + 0.0f, 1.0f, z + -4.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x + 0.0f, 1.0f, z + -6.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(x + 0.0f, 0.0f, z + -6.0f); glEnd(); glBlendFunc(GL_ONE, GL_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, texture[4]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.0f, 0.0f, z + -4.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(x + 0.0f, 1.0f, z + -4.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(x + 0.0f, 1.0f, z + -6.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(x + 0.0f, 0.0f, z + -6.0f); glEnd(); glDisable(GL_BLEND); }
Haluaisin tietää mikä on tämän glBlendFunc(GL_DST_COLOR, GL_ZERO):n vaikutus, käyttömahdollisuudet jne. Täällä kerrotaan englanniksi asiasta jotain mutta en oikein ota selvää tuosta tekstistä. Tuolla on myös taulukko (Table 7-1 : Source and Destination Blending Factors) jossa näkyy erilaisia arvoja joita tuolle funktiolle voi syöttää, haluaisin tietää mitkä ovat niiden vaikutukset, miten niitä käytetään jne.
Niin ja itse ongelmaan. Tuo edellä mainittu koodi piirtää hyvin yksinkertaistetun puskan, ongelma on se, että läpinäkyvät osat ovat läpinäkyviä vain jos sen takana olevat jutut on piirretty ensin, muuten tuon blendatun tekstuurin läpi ei näe. Tämä aiheuttaa joukun erinäisiä bugeja, joista olisi kiva päästä eroon.
ps. tämä tekstilaatikko saisi olla isompi jotta olisi helpompaa hahmotella pitempiä viestejä.
Tumpelo kirjoitti:
ps. tämä tekstilaatikko saisi olla isompi jotta olisi helpompaa hahmotella pitempiä viestejä.
Kukaanhan ei pakota kirjoittamaan niitä viestejä suoraan siihen laatikkoon, voi käyttää vaikka tekstieditoria apuna.
Itseltäni löytyy myös käyttäjän CSS-tiedostosta seuraavaa:
/* Enlarge the reply box at Ohjelmointiputka */ textarea[name='k_vastaus'] { height: 25em; width: 50em; }
Joten eipä auta kuin piirtää ne osat oikeassa järjestyksessä. Homman juju on siinä, että kun OpenGL saa kokonaisen polygonin, se piirtää sen ja merkitsee syvyysarvot puskuriin, oli läpinäkyvyys mikä hyvänsä. Muistissa ei pidetä mitään tietoa, miten mihinkin välivaiheeseen on päädytty eli missä kohti aiemmat polygonit ovat.
Käsittääkseni tuo ihmettelemäsi blendaustapa tarkoittaa tätä: Olkoon ruudulla oleva väri (R1, G1, B1), ja piirrettäköön tähän päälle pikseli värillä (R2, G2, B2). Lopputulos (R3, B3, G3) on (R1 * R2, G1 * G2, B1 * B2). Siis piirrettävä pikseli kerrotaan komponenteittain entisellä pikselillä (GL_DST_COLOR) ja entinen hävitetään kokonaan (GL_ZERO).
Asia selvä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.