Multitexturing & Transparenz
-
Hallo zusammen,
ich fange gerade an einen Kartenedito für ein HEX-Feld basierendes Spiel in C/C++ mit OpenGL zu proggen. Jetzt will ich mich mit der Optik der Landschaft beschäftigen... Die Basistextur die auf alle Hexe geklebt ist funktioniert für sich und auch die Detailtexturen (ohne Transparenz) der einzelnen Hexe. Das googeln nach mutitexturing hat auch einige Ergebnisse geliefert aber bis jetzt bin ich mit dem ganzen noch nicht soo glücklick geworden.
Texturen lade ich aus *.jpg oder *.bmp (bei gewünschter Transparenz wird der Textur ein Alphakanal hinzugefügt abhängig von einem Colorkey)
Bisher habe ich verschiedene Ansätse verfolgt
Ausgangspunkt:
glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,m_TerrainTex.Handle); glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,m_DetailTex[0].Handle); [render snip] glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3]); glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3]); glVertex3fv(P1); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3+1]); glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3+1]); glVertex3fv(P2); glMultiTexCoord2fvARB(GL_TEXTURE0_ARB, m_TerrainTexCords[i*3+2]); glMultiTexCoord2fvARB(GL_TEXTURE1_ARB, m_DetailTexCords[i*3+2]); glVertex3fv(P3); [/render snip]
wie das dann auschaut kann sich sicher jeder vorstellen...
In der Detailtextur ist ein Alpakanal enthalten (Textur gebaut mit GL_RGBA) wie ich gelesen hab ist ein nicht existenter Alphakanal als 1.0f als Alhawert interpretiert (Basistextur)
das einfachste was ich gefunden hab war...
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND);
das hat bei mir leider garnichts bewirkt was mach ich falsch oder muss das so sein
Ist das nur für multipass tauglich?
dann bin ich auf was gestoßen was ich dann gar nicht mehr begreifen konnte das hat dann aber einen teil des gewünschten Effektes erzielt ...
alles was Alphakanal 0.0f hat ist transparent geworden aber alle anderen Fraben werden immer noch zu einer Mischfarbe kombiniert
// Init texture unit 1 glActiveTexture( GL_TEXTURE1 ); // Set up texture function for RGB and alpha channel glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV ); glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD ); glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_EXT, GL_REPLACE ); // Interpolate the RGB components of the first and second texture // using the alpha primary color glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, GL_PREVIOUS_EXT ); glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, GL_SRC_COLOR ); glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, GL_ZERO ); glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, GL_ONE_MINUS_SRC_COLOR ); glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, GL_PREVIOUS_EXT ); glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA ); glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE3_RGB_NV, GL_TEXTURE ); glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND3_RGB_NV, GL_SRC_COLOR ); // Replace the alpha component glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, GL_PREVIOUS_EXT ); glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, GL_SRC_ALPHA );
muss das so kompiziert sein oder geht es auch einfacher?
Danke im Vorraus
Ich hoffe hier sieht noch wer durch aber ich musste mir das jetzt von der Seele schreiben