Entwickler-Ecke

Multimedia / Grafik - Transparenz in OpenGL


schneegurke - Do 24.07.03 01:21
Titel: Transparenz in OpenGL
Ich hab gerade versucht ein isometrisches Feld mit OpenGL zu zeichnen. Vom Prinzip her wird auch alles korrekt angezeigt, nur bekomm ich die einzelnen Tiles nicht transparent. Jedes Tile ist vom Typ BMP und hat als Transparenzfarbe clFuchsia sprich in OpenGL (1, 0, 1). Hab mit Google etc. auch schon gesucht und weiss auch, dass man wohl glBlendFunc benutzen soll nur hab ich von den Parametern keine Ahnung, da gibts ja irgendwie jede Menge.

Hoffe ihr könnt mir da helfen. Den Code hab ich sicherheitshalber mal angehängt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
gx := GLX(dx);
gy := GLY(dy);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Tex);
glBegin(GL_QUADS);
glTexCoord2f(00);
glVertex2f(gx, gy - GLHeight(TileHeight));
glTexCoord2f(01);
glVertex2f(gx, gy);
glTexCoord2f(11);
glVertex2f(gx + GLWidth(TileWidth), gy);
glTexCoord2f(10);
glVertex2f(gx + GLWidth(TileWidth), gy - GLHeight(TileHeight));
glEnd;


Damit jeder weiss, was genau ich mit Transparenz meine, hier das Bild:
user defined image

Die Rosa-Farbe soll sozusagen nur nicht mitgezeichnet werden.


Aya - Do 24.07.03 01:51

Hi,

dafür mußt du AlphaMasking benutzen, denn mit normalem Blending wird das wohl nix.. ;)

Lad dir mal diese Datei runter:
http://www.koshigaya.de/DelphiGL/kglTextures.zip

Jetzt bindeste die Textures.pas in dein Projekt ein und lädst dein BMP:


Delphi-Quelltext
1:
2:
3:
4:
5:
var
  Tex: TTextur;

procedure InitOpenGL;
  Tex:=TTextur.Create('c:\...\bla.bmp');


Als nächstes sagst du welche Farbe transparent sein soll:

Delphi-Quelltext
1:
Tex.SetAlphaColor(R,G,B,0);                    


Das war's schon mit der Vorbereitung :)

Wenn du jetzt dein Polygon mit der Textur zeichnen willst machst du's so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  glEnable(GL_BLEND);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER,0.1);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

  Tex.Bind;
  //Hier dein Quad Zeichnen.

  glDisable(GL_ALPHA_TEST);
  glDisable(GL_BLEND);


Au'revoir,
Aya~


Logiqu - Do 24.07.03 09:11

hi!

ich habe die variante mit

Delphi-Quelltext
1:
Tex.SetAlphaColor(R,G,B,0);                    

noch nicht ausprobieren können, aber grafisch sehr schöne variante geht doch über die blendfunc von opengl. allerdungs benötigst du auch 2 maps, eine graustufen-map, in der alles, was angezeigt werden soll, schwarz ist. diese graustufen-map hat auch den vorteil, dass man gutaussehende halbtransparenz hinbekommt (wenn diese bereiche dann grau sind).

die zweite map ist die farb-map. hier malst du zum beispiel dein karo rein. jedoch musst du darauf achten, dass du auf schwarzen hintergrund zeichnest (anstatt clFuchsia).

hier ein beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture[2]);  // Mask-Map
glEnable(GL_BLEND);
glBlendFunc(GL_DST_COLOR,GL_ZERO);
glDisable(GL_LIGHTING);
glColor(1,1.0,1.0);  // Hiermit lässt sich die Stärke der Transparenz ergeln
glBegin(GL_QUADS);  // Polygon-Maske zeichnen
glTexCoord2f(01);
glVertex(0,0.7,-1);
glTexCoord2f(00);
glVertex(0,1,-1);
glTexCoord2f(10);
glVertex(1,1,-1);
glTexCoord2f(11);
glVertex(1,0.7,-1);
glEnd;

glBindTexture(GL_TEXTURE_2D, Texture[0]);  // Farb-Map
glBlendFunc(GL_ONE,GL_ONE);
glBegin(GL_QUADS);  // Polygon nochmal zeichnen
glTexCoord2f(01);
glVertex(0,0.7,-1);
glTexCoord2f(00);
glVertex(0,1,-1);
glTexCoord2f(10);
glVertex(1,1,-1);
glTexCoord2f(11);
glVertex(1,0.7,-1);
glEnd;

ich hoffe, es hilft dir ein bisschen weiter...

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


schneegurke - Do 24.07.03 12:57

Besten Dank! Ich werd beide Varianten ausprobieren. Hat mir sehr geholfen!