| Autor |
Beitrag |
Passi077
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Mi 06.07.05 14:32
Hi,
wenn ich nun doch OpenGL nutze, dann will ich auch die mir dadurch neu zur Verfügenden Funktionen nutzen  .
Ich will also ein 2D Objekt durchscheinend Darstellen. Meinen Recherchen nach geht das über die Textur.. leider blicke ich aber nicht richtig durch.
Mein Code dafür sieht folgendermaßen aus (davor halt Texturbinden etc.):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(0,0,0, width, height, 0.5);
procedure DrawQuad(pX, pY, pZ: Single; pWidth, pHeight: integer; alpha: real); begin glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ); glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);
glColor4f(255,255,255,alpha); glEnd; end; |
Leider funktioniert das nicht. Und zwar egal in welcher Reihenfolge ich meine Objekte zeichne (sind bisher nur 2..)..
bei Alpha=1 funzt es, aber drunter wird das Objekt gar nicht mehr angezeigt  ...
Was mache ich falsch?
Edit: Ich merke gradm das Ganze ist noch stranger.. wenn ich Objekt1 Alpha=1 und Objekt2 Alpha = 0.5 setze, dann wird seltsamerweise Objekt 1 gar nicht gezeichnet und Objekt2 mit voller Deckkraft...
Danke + Grüße
Passi
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 06.07.05 18:02
Hi,
also der einzige fehler den ich im moment sehe ist das du das glColor erst nach dem zeichnen des quads aufrufst.. mach das mal davor..
evtl lag es schon daran
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure DrawQuad(pX, pY, pZ: Single; pWidth, pHeight: integer; alpha: real); begin glColor4f(255,255,255,alpha); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ); glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ); glEnd; end; |
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Passi077 
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Mi 06.07.05 19:27
Hmm damit wäre jedenfalls schon mal das Problem gelöst, dass das falsche Objekt komplett unsichtbar wird ^^...
jetzt wird ab Alpha = 0.8 das Objekt komplett unsichtbar. Bei 0.9 isses dann 100%ig sichtbar...
|
|
Aya
      
Beiträge: 1964
Erhaltene Danke: 15
MacOSX 10.6.7
Xcode / C++
|
Verfasst: Mi 06.07.05 19:35
Ahhh... ich hab grad ewig gesucht wo der fehler ist.. aber der ist wirklich sehr einfach zu übersehen...
glColor4f erwartet vier float werte im bereich von 0..1
Die 255 die du da benutzt würde ein 255-fach überstrahltes weiß ergeben, was sich dementsprechend ein wenig falsch auswirkt
Hast jetzt zwei möglichkeiten..
Delphi-Quelltext 1: 2: 3:
| glColor4ub(255, 255, 255, alpha); glColor4f(1, 1, 1, alpha); |
Au'revoir,
Aya~
_________________ Aya
I aim for my endless dreams and I know they will come true!
|
|
Passi077 
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Mi 06.07.05 21:05
Hi,
ne, funzt leider auch dann nicht  ..
Aber kann es sein, dass sich der Alpha Wert nur auf ne bestimmte Farbe bezieht? Ich habe nämlich bemerkt, dass der kleine weiße Rand den ich noch hab von meinen Antialiased Bildern, bei Alpha=0.9 irgendwie schwächer wird..
Vllt. ist es von Bedeutung, dass ich auch ne transparente Farbe definiert habe?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| glLoadIdentity; glBindTexture(GL_TEXTURE_2D, obj); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.9); glTranslatef(x, y, 0); glRotatef(angle, 0,0,1); glScalef(1,1,1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(0,0,0, width, height, alpha); |
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 07.07.05 08:12
| Zitat: | | Aber kann es sein, dass sich der Alpha Wert nur auf ne bestimmte Farbe bezieht? Ich habe nämlich bemerkt, dass der kleine weiße Rand den ich noch hab von meinen Antialiased Bildern, bei Alpha=0.9 irgendwie schwächer wird.. |
Ich habe keine Ahnung was damit meinst aber der Alphakanal ist ein Zusätzlicher Kanal der besonders behandelt wird. Er hat aber keinen direkten Einfluss auf die anderen 3 Kanäle. Außer du sagt OpenGL wie er ihn zu behandeln hat.
Aber zu deinem Problem. Du benutzt an der Stelle die Blend und die Alphafunc. Wenn du ein Objekt mittels Alphakanal (in der Textur) durchsichtig machen möchtest würde das so gehen, da dann wahrscheinlich unterschiedliche Alphawerte im Kanal liegen würden. Da du das aber mit der Farbe machst besitzt deine Fläche nun mal einen einheitlichen Alphawert. Und wenn dann der Alphatest versagt, dann ist deine komplette Fläche auf einmal weg. Lange rede kurzer Sinn. Deaktiviere bei solchen Operationen deinen alphatest und dann sollte es so sein wie du es haben willst.
Delphi-Quelltext 1: 2:
| glDisable(GL_ALPHA_TEST); DrawQuad(0,0,0, width, height, alpha); |
PS: Das glScalef(1,1,1); kannst du dir sparen. Das ist ein Aufruf der rein gar nichts bewirkt.
PPS: Ich benutze immer ganz gerne folgende Alphafunc.
Delphi-Quelltext 1:
| glAlphaFunc(GL_GREATER, 0.1); |
Damit fällt eine Fläche erst dann durch den Alphatest wenn sie mittels Blending sowieso kaum noch sichtbar wäre. So könnte man dann auch Halbtransparenz und Alphatest miteinander kombinieren. Aber das ist wie üblich reine Geschmackssache.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Passi077 
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Do 07.07.05 12:13
Aaahso, wegen dem Alphatest wird das dann kommplet unsichtbar  heimtükisch  .
Ok, es funzt es so weit, dass ich meine Texturen tatsächlich in ihrer Deckkraft verringern kann.. allerdings scheint trotzdem nichts durch. D.h. mein Objekt ist zwar dunkler, also in der Deckkraft verringert, aber alle Objekte die ich hinter diesem Objekt zeichne sind trotzdem noch nicht sichtbar..

|
|
Phobeus
      
Beiträge: 1280
Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
|
Verfasst: Do 07.07.05 13:20
Man sollten den Tiefenbuffer beim blenden deaktivieren. Da das Blending allerings in einem Buffer statt findet, gibt es keinen 3D-Raum. Du mußt die Objekte also entsprechend der Reihenfolge rendern. Zunächst die hinteren, dann die vorderen. im 2D-Raum ist dies natürlich besonders einfach, da Du ja eine Achse weggelassen hast und diese die Tiefe angibt. So ist z.B. die Z-Achse dann quasi dein Buffer in welcher Reihenfolge ein Objekt auf dem Bildschirm gezeichnet werden muss. Zumindest denke ich, dass dies der Fehler ist, da durch deine Beschreibung nicht ersichtlich wird, was das Problem ist. Dreht man z.B. eine Kugel um eine transparente Kugel, so wird das Problem komplexer. Zunächst bewegt sie sich VOR der anderen und beginnt dann hinter Ihr zu tauchen. An dieser Stelle muss sie dann wieder nach hinten gesetzt werden.
_________________ "Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
|
|
Passi077 
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Do 07.07.05 14:10
Ah am Tiefenpuffer lags! Jetzt isses schon mal schön transparent, genau so wie ich es haben will (die Transparenz).
Aaaaber blöderweise wirkt sich das jetzt auf alle meine Texturen aus
Ich hab keine Ahnung was ich falsch mach
Hier mal mein kompletter Code zum Zeichnen eines Objektes:
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: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| procedure Draw(x,y,angle: real; obj: cardinal; alpha: real); var width, height: integer; begin
glLoadIdentity; glBindTexture(GL_TEXTURE_2D, obj); glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, @width); glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @height);
x := x + (width/2); y := y + (height/2); y := y + 2*((form1.ClientHeight div 2) - y);
glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1); glTranslatef(x, y, 0); glRotatef(angle, 0,0,1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(0,0,0, width, height, alpha); end;
procedure DrawQuad(pX, pY, pZ: Single; pWidth, pHeight: integer; alpha: real); begin glColor4f(1,1,1,alpha); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ); glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ); glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ); glEnd; end;
procedure render; begin
draw(mapx,mapy,0,maptex, 1); draw(ufox, ufoy,ufoa,shiptex, 0.5);
end; |
Damit ist aber auch die Maptex durchsichtig!
Ich hoffe ihr könnt mir helfen und bedanke mich mal wieder bei euch, eure Hilfe ist echt spitze
Moderiert von raziel: Code- durch Delphi-Tags ersetzt.
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 07.07.05 14:36
OpenGL ist eine Statemaschine. Du stellst das Licht an und es bleibt so lange an bist du es wieder aus machst. Genai so verhält sich das mit dem Blending, dem Alphatest, dem Tiefentest und so weiter.
Wenn du also Blending nicht mehr haben möchtest weil alles Transparente gezeichnet wurde so musst es wieder deaktivieren. glDisable(GL_BLEND);
Bei 2D eher unwichtig. Aber wenn du den Tiefentest wieder haben möchtest su musst du diesen mit glEnable(GL_DEPTH_TEST); wieder aktivieren.
PS: Es lag nicht am Tiefenbuffer sondern an der Zeichenreihenfolge. Durch das Deaktivieren des Tiefentests wird alles übereinanderander gezeichnet. Daraus resultierend hat dann auch das Blending hingehauen. Nur um mal kleinlich zu sein.  In 3D hilf das deaktivieren des Tiefenbuffers zwar auch aber nur in wenigen seltenen Ausnahmefällen. Nicht, dass ein falscher Eindruck entsteht.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Passi077 
      
Beiträge: 125
Win XP
D7 Pers
|
Verfasst: Do 07.07.05 17:20
Hi,
mhh ok. Mit de- und wieder aktivieren des Tiefentests funktioniert es jetzt wirklich fast perfekt.
Das einzige Problem das ich jetzt noch habe ist, dass wenn ich etwas Transparent darstelle, die Zeichenreihenfolge anders sein muss als wenn ich es nicht transparent darstelle. Ist das normal?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Fr 08.07.05 07:24
Ja ist es. Ich weiß nicht wie das in Direct3D ist aber ich denke mal es wird nicht anders sein. Der grund warum das so ist der, dass die Objekte so gezeichnet werden wie wie sie aufgerufen werden. Das bedeutet eines nach dem Anderen. Mittels Tiefenbuffer kann man es ermöglichen, dass Objekte die vermeindlich tiefer sind andere nicht überlagern. Sozusagen wird damit ein wenig getrickst. Und bei Transparenten ist nun so, dass diese sofort transparent gezeichnet werden. Wenn du dann Objekte hast die Tiefer sind, dann überlagern die die Transparenten (kein Tiefentest) oder die Stellen des anderen Objektes werden ausgelassen. Und da man durch die Fläche durchschauen kann sieht man, dass bei dem anderen etwas fehlt. Anderenfalls würde man das ja nicht sehen. ich hoffe mal, dass hat dir die Technik jetzt ein bisschen näher gebracht. Wenn man es verstanden hat ist alles auf einmal ganz logisch. 
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Mr_Sven
      
Beiträge: 38
D7 Prof., C# (VS 2008)
|
Verfasst: Mi 30.11.05 16:51
Hi Leute,
ich glaube ich bin langsam Betriebsblind.
Hab mich jetzt in die OpenGL Programmierung gestürzt und jetzt kriege ich ein Quadrat mit Textur net Durchsichtig.
also:
fArrow ist ein TglBitmap2D mit einem schwarzen Bild und einem grünen Pfeil drauf gefüllt.
Wenn ich die Folgende Funktion anwende, wird nur der grüne Pfeil Transparent, das schwarze Drumherum nicht.
Ich will aber das Schwarze weg haben.
Die Matrix mit dem Quadrat generiere ich als letzte Matrix.
Kann mir jemand helfen?
Gruß Sven
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:
| glPushMatrix; glRotatef(180,1,0,0); glTranslatef(0.4, 0.5, -1.5);
glEnable(GL_TEXTURE_2D);
glColor4f(1,1,1,1);
glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); glBlendFunc(GL_DST_COLOR,GL_ZERO); glBindTexture(GL_TEXTURE_2D, fArrow.TextureID);
glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex3f(0, 0.4, 0); glTexCoord2f(1,1); glVertex3f( 0.4, 0.4, 0); glTexCoord2f(1,0); glVertex3f( 0.4, 0, 0); glTexCoord2f(0,0); glVertex3f(0, 0, 0); glEnd; glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glPopMatrix; |
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mi 30.11.05 19:11
Als Erstes. fArrow bietet dir eine Funktion namens Bind an.
Und wenn du etwas blenden möchtest, dann solltest du auf jeden Fall einen Alphakanal in der Textur haben. Über Farben blenden bringt nicht wirklich etwas und wenn würden die Farben komisch angepasst werden. Je nachdem was du vor hast könntest du auch mit dem Alphatest arbeiten und Mittels AddAlphaFromColorKey einen Alphakanal erstellen der die Farbe Schwarz ausblenden würde. Allerdings geht das nur sofern der nicht weich sein soll. Sonst musst du blenden und dann würde ich in jedem Fall einen Alphakanal in die Textur mit einbauen.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Mr_Sven
      
Beiträge: 38
D7 Prof., C# (VS 2008)
|
Verfasst: Do 01.12.05 18:22
So, ich denke ich habs halbwegs gerafft, aber jetzt ist entweder das ganze bild weg, oder garnicht.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_LESS, 0.9);
fArrow.Bind; fArrow.AddAlphaFromColorKey(0,0,0);
glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex3f(0, 0.4, 0); glTexCoord2f(1,1); glVertex3f( 0.4, 0.4, 0); glTexCoord2f(1,0); glVertex3f( 0.4, 0, 0); glTexCoord2f(0,0); glVertex3f(0, 0, 0); glEnd;
glDisable(GL_ALPHA_TEST); |
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Do 01.12.05 19:45
Das liegt auch daran, dass deine Textur immer noch keinen Alphakanal hat.
AddAlphaFromColorKey berechnet aus deinem Bild einen Alphakanal der mit ins Bild eingebunden wird. Bei GenTexture wird das generierte Bild an OpenGL Übertragen. Und zwar nur dort. Du musst also entsprechen AddAlphaFromColorKey vor dem Aufruft von GenTexture aufrufen. Dann klappts auch.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
|