Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2008 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Problem beim "Blending" (in Wirklichkeit Multipass) ist nicht alles möglich. Denn du hast als Erstes ein Schwarz/Weiß Bild. Mit diesem Bild verrechnest du das Zweite und überschreibst das SW Bild. Um das Dritte Bild aber richtig darstellen zu können benötigst du wieder das SW Bild. Was aber nicht mehr existiert. Somit wird das SO nicht funktionieren. Das ist technisch nicht drin. Selbst wenn du das Bild als Textur kopierst und dann wieder in einzelnen Schritten darstellst wird das nicht gehen. Denn damit es gehen kann müsstest du dein bisheriges überschreiben. Aber dann ist das Ergebniss wieder falsch.

Das mit dem Kompfort kann ich vollkommen verstehen. Ich finde nichts schlimmer als zu umständliche Programme.

Wenn es nur im Editor ist, dann könntest du dir das Bild auch eben auf den Rechner ziehen und dort verändern. Aber ich denke mit dem env_combine sollte das auch gehen. Aber ich habe damit auch noch nicht so viel gemacht. Du kannst ja auch mal das posten was du schon hast. Also das was da zum Erzeugen der Textur gehört.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2008 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Moin,

das ist mein Code bis jetzt. Das Multitexturing habe ich noch nicht ausprobiert.

Hier wird erstmal die Brushtextur erstellt, die ist dann schwarz, und überall, wo man gemalt hat weiß, mit weichen Kanten.

Code:
  1.  
  2.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  3.  
  4.     glMatrixMode(GL_PROJECTION);
  5.     glLoadIdentity;
  6.     glViewport(0, 0, 512, 512);
  7.     glOrtho(0, 512, 0, 512, -32, 32);
  8.     glClear(GL_DEPTH_BUFFER_BIT);
  9.     glMatrixMode(GL_MODELVIEW);
  10.     glLoadIdentity;
  11.  
  12.     glEnable(GL_BLEND);
  13.     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  14.  
  15.     glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
  16.  
  17.     glColor3f(1, 1, 1);
  18.     TexMgr.BindTexture('Brush');
  19.     glTranslatef(x, y, 0);
  20.     glBegin(GL_QUADS);
  21.       glTexCoord2f(0, 0); glVertex2f(-64, -64);
  22.       glTexCoord2f(1, 0); glVertex2f( 64, -64);
  23.       glTexCoord2f(1, 1); glVertex2f( 64,  64);
  24.       glTexCoord2f(0, 1); glVertex2f(-64,  64);
  25.     glEnd();
  26.  
  27.  


Jetzt blende ich da drüber die Steintextur (tex ist die obige Textur vonGL_COLOR_ATTACHMENT0_EXT):

Code:
  1.  
  2.  
  3.     glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
  4.  
  5.     glClear(GL_DEPTH_BUFFER_BIT);
  6.  
  7.     glDisable(GL_BLEND);
  8.  
  9.     glTranslatef(-x, -y, 0);
  10.     glBindTexture(GL_TEXTURE_2D, tex);
  11.     glBegin(GL_QUADS);
  12.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  13.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  14.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  15.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  16.     glEnd();
  17.  
  18.     glEnable(GL_BLEND);
  19.     glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  20.  
  21.     glTranslatef(0, 0, 0.1);
  22.     TexMgr.BindTexture('stein');
  23.     glBegin(GL_QUADS);
  24.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  25.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  26.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  27.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  28.     glEnd();
  29.  
  30.  


Danach habe ich versucht da drunter das Gras zu bekommen (Tex2 ist GL_COLOR_ATTACHMENT1_EXT):

Code:
  1.  
  2.  
  3.     glDrawBuffer(GL_COLOR_ATTACHMENT2_EXT);
  4.  
  5.     glClear(GL_DEPTH_BUFFER_BIT);
  6.  
  7.     glDisable(GL_BLEND);
  8.  
  9.  
  10.     TexMgr.BindTexture('gras');
  11.  
  12.     glBegin(GL_QUADS);
  13.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  14.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  15.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  16.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  17.     glEnd();
  18.  
  19.  
  20.  
  21.     glEnable(GL_BLEND);
  22.     glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_DST_COLOR);
  23.     glTranslatef(0, 0, 0.1);
  24.  
  25.     glBindTexture(GL_TEXTURE_2D, tex2);
  26.     glBegin(GL_QUADS);
  27.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  28.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  29.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  30.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  31.     glEnd();
  32.  
  33.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  34.  
  35.  


Das hat aber nicht den gewünschten Effekt.

Ich habe noch eine Idee bekommen: Und zwar könnte man die Brushtextur (Tex) nicht aus dem VRAM laden, und die RGB Werte durch Alphawerte ersetzen und danach das ganze wieder uploaden? Wenn ich mich nicht vollkommen täusche sollte es doch so möglich sein den letzten Blendschritt mit dem Gras damit zu bewerkstelligen.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 14, 2008 19:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also mit FBOs kenne ich mich gar nicht aus. Aber ja du kannst die Daten ziehen und in eine andere Textur schreiben. Ziehen kannst du die Daten mit glGetTexImage2D und hochladen entweder mit glTexImage2D oder glTexSubImage2D. Wobei glTexSubImage2D besser ist, da nur die Daten kopiert werden. Sonst nix. Allerdings arbeiten grafikkarte Asynchron und das ziehen verändern und hochladen dürfte da ziemlich stark bremsen. Gehen tuts aber ich würde mit keinem Geschwindigkeitsrekord rechnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 06:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

ich hab es jetzt mit viel Trickserei (fast) hinbekommen:

Bild

Wie man sieht stimmt das mit den weichen Kanten noch nicht so. Ich mach das im Moment mit TglBitmap2D.AddAlphaFromColorKeyRange(255, 255, 255, 128);, aber anscheinend bezieht das nur die "vollen" Weißwerte mit ein. Gibts in deiner glBitmap eine Möglichkeit die weichen Kanten miteinzubeziehen?

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 10:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Was wäre das für eine Programmiererwelt, wenn es nur einen Weg geben würde. Ich habe aktuell gleich 3. ;)

Methode 1: Du könntst das Graustufen RGB Bild nach Luminance (1 Kanal Graustufen) konvertieren und der glBitmap dann sagen, dass es sich dabei um Alpha handelt. Diese Textur könntest du dann bei dem Gras als zweite Textur binden und normal blenden (SRC_ALPHA, ONE_MINUS_SRC_ALPHA) und dann sollte es richtig aussehen. Aber. Diese Konvertierung ist optisch richtig und größtmöglich flexibel gehalten. Mit anderen Worten richtig lahm.
Code:
  1. fTexture.ConvertTo(ifLuminance);
  2. fTexture.InternalFormat := ifAlpha;
  3. fTexture.GenTexture;


Methode 2: Du könntest die eingebaute Funktionsschnittstelle dazu bemühen. So würde das aussehen, wenn du Rot zu Alpha machen willst.
Code:
  1. // Funktion wird für jedes Pixel aufgerufen
  2. procedure RedToAlpha(var FuncRec: TglBitmapFunctionRec);
  3. begin
  4.   with FuncRec do begin
  5.     Dest.Alpha := Source.Red;
  6.   end;
  7. end;
  8.  
  9. // Aufruf der Funktion. Als quelle kann auch ein anderes glBitmap dienen
  10. // Und sie wird angewiesen eine rein Alphatextur zu erstellen
  11. fTexture.AddFunc(fTexture, RedToAlpha, True, ifAlpha);

Aber das Problem an der Methode. Auf meinem aktuellen System mag das zwar noch halbwegs schnell sein aber es wird für jedes Pixel ein mal diese Methode oben aufgerufen und die Daten des Pixels müssen vorher in die Struktur kopiert werden. Also ziemlich viel (für meinen Geschmack zu viel) für ein einfaches simples Byte.

Methode 3: Ich persönlich würde da trotz meiner Unit eher auf etwas anderes zurückgreifen. Und zwar mit "wenigem" spezialhändling kann man die zu erlegenden Dinge auf ein Minimum reduzieren.
Dazu benötigst du eine zweite Textur. Eine in die du die Daten kopierst und eine reine Alphatextur.
Code:
  1. // So muss die zweite Textur erstellt werden.
  2. fTexture2 := TglBitmap2D.Create(glBitmapPosition(512, 512), ifAlpha);
  3. fTexture2.FreeDataAfterGenTexture := False;
  4. fTexture2.GenTexture;


Code:
  1. // funktion zum kopieren der Daten
  2. procedure CopyRedToAlpha(pSource, pDest: pByte; Pixels: Integer);
  3. var
  4.   Idx: Integer;
  5. begin
  6.   // position innerhalb von BGR auf R setzen. Bei RGB nicht nötig
  7.   inc(pSource, 2);
  8.  
  9.   for Idx := 0 to Pixels - 1 do begin
  10.     pDest^ := pSource^;
  11.  
  12.     // spring zum nächsten QuellPixel. Bei RGBA oder BGRA muss hier 4 stehen
  13.     Inc(pSource, 3);
  14.     Inc(pDest);
  15.   end;
  16. end;
  17.  
  18.  
  19. // Kopiert den Roten Kanal in den Alphakanal der zweiten Textur
  20. CopyRedToAlpha(fTexture.Data, fTexture2.Data, fTexture.Width * fTexture.Height);
  21.  
  22. // Bindet die zweite Textur und lädt nur die Daten hoch.
  23. fTexture2.Bind(False);
  24. glTexSubImage2D(fTexture2.Target, 0, 0, 0, fTexture2.Width, fTexture2.Height, GL_ALPHA, GL_UNSIGNED_BYTE, fTexture2.Data);

Die letzte Methode ist natürlich aufgrund ihrer Spezialisierung mit Abstand am Schnellsten. Du musst evtl. in der Methode CopyRedToAlpha noch kleine Anpassungen vornehmen. Steht im Kommentar. Durch das Bind(False) wird nur die Textur gebunden aber nicht das Target aktiviert.

Du kannst die fTexture2 so binden wie alle anderen Texturen. Ich lade lediglich die Daten anders hoch und greife ein bisschen manuell ein.

PS: AddAlphaFromColorKey erzeugt immer einen digitalen Alphakanal. Also entweder hat er 1 oder 0. Dort gibt es keine "Grauzone".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 11:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

vielen Dank für deine Hilfe! Ich hab jetzt was ganz annehmbares hinbekommen:

Bild

Die Ränder sehen etwas verschwommen aus, aber das liegt glaube ich an den schlechten Texturen :D
Dank deiner dritten Methode läuft das jetzt alles in Echtzeit, ohne Ruckler. Vorher musste ich aber noch ein bisschen was ändern, zB. pDest^:= 255 - pSource^;

Jetzt muss ich das nurnoch sauber programmieren, war bis jetzt ja nur Testcode. Nochmals danke!

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 11:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ah. Okay. Alternativ zu "255 - byte" kannst du auch "not byte" machen. Dann ist dann nichts mehr zum Rechnen.

Das da aber Rot entsteht wundert mich etwas. Wie zeichnest du das denn?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 11:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

da entsteht Rot? Seh ich überhaupt nicht, bin Rot-Grün-Blind :D

Edit: Ah, das liegt an meiner glClearColor! Da scheint was nicht zu stimmen.

Code:
  1.  
  2.     AlphaTex.Bind();   //Alphatextur, so erstellt, wie du gesagt hast
  3.     glDrawBuffer(GL_COLOR_ATTACHMENT1_EXT);
  4.  
  5.     glClearColor(0, 0, 0, 0);
  6.     glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  7.     glClearColor(0, 0, 1, 1); //Auf Blau umgestellt, sieht am an der Abstufung!!!
  8.  
  9.     glDisable(GL_BLEND);
  10.    
  11.     //Alphatextur zeichnen
  12.     gltranslatef(-x, -y, 0);
  13.     glBegin(GL_QUADS);
  14.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  15.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  16.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  17.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  18.     glEnd();
  19.  
  20.     //Grastextur drüber
  21.     glEnable(GL_BLEND);
  22.     glBlendFunc(GL_DST_ALPHA, GL_ZERO);
  23.     glTranslatef(0, 0, 0.1);
  24.     TexMgr.BindTexture('gras');
  25.  
  26.     glBegin(GL_QUADS);
  27.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  28.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  29.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  30.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  31.     glEnd();
  32.  
  33.     //In der Textur ist jetzt das Gras, und dort, wo der Stein hinkommen soll transparent
  34.     //In eine andere Textur rendern
  35.     glDrawBuffer(GL_COLOR_ATTACHMENT2_EXT);
  36.  
  37.     //Steintextur ganz unten zeichnen
  38.  
  39.     glDisable(GL_BLEND);
  40.     glTranslatef(0, 0, 0.1);
  41.     texmgr.BindTexture('stein');
  42.  
  43.     glBegin(GL_QUADS);
  44.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  45.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  46.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  47.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  48.     glEnd();
  49.  
  50.     //Mit dem Blending die Grastextur mit Tansparenz an den Pinselstellen drüberzeichnen
  51.     glEnable(GL_BLEND);
  52.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  53.     glTranslatef(0, 0, 0.1);
  54.     glBindTexture(GL_TEXTURE_2D, tex2);
  55.     glBegin(GL_QUADS);
  56.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  57.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  58.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  59.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  60.     glEnd();
  61.  


Dabei kommt ein blauer Rand raus. Da ist also noch ein Fehler.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich muss gestehen, dass ich den Code nicht so ganz verstehe.

Aber meine Idee war folgende.
- AlphaTextur erstellen
- untere Textur normal mit 1 Quad zeichnen
- darüberliegende Textur und Alphatextur via Multitexturing mit einem zweiten Quad zeichnen und blenden

Wenn du eine RGB und eine Alphatextur via Multitexturing zeichnest verhält sich das ganze wie eine RGBA Textur. Und genau das brauchst du.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

ich habe den Fehler bei mir gefunden. Es muss statt glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); so heißen: glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Zum Code: Die Alphatextur wurde vor dem Codeabschnitt schon erstellt. Die binde ich und zeichne sie unten auf ein Quad, darauf die Grastextur. Dann hab ich eine Textur, auf der überall Gras ist, und dort wo die andere hin soll ist sie durchsichtig.

Dann zeichne ich in eine andere Textur ganz unten Stein, und darauf die Grastextur mit Transparenz an den gewünschten Stellen. Dadurch sieht man die Steintextur nurnoch an bestimmten Stellen durch:

Bild

Das Resultat sollte das Gleiche sein.

Zum Multitexturing:

Geht das auch ohne GL_ARB_texture_env_combine, also mit ganz normalem Multitexturing? Wenn ja, dann wäre das sicher eleganter.

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 15:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja du kannst Multitexturing auch ohne env_combine benutzen. env_combine bietet halt ein paar Möglichkeiten die verschiedenen Texturen miteinander zu kombinieren. Aber in deinem Falle geht es ja nur darum die RGB und die AlphaTexture ineinander zu mischen. Und das ist per default schon so. Also, dass die einzelnen Texturen moduliert werden. Oder kurz. Ja geht.

Diese Blendfunc halte ich für nicht ungefährlich. Denn DST_ALPHA greift auf den Alphakanal innerhalb des Framebuffers zu. Der muss aber nicht existieren.

Aber sonst. Schaut schon recht nett aus. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 16:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

ok, dann werde das mal so probieren, wird auch sicher schneller sein.

Hmm.. eigentlich habe ich gedacht, DST wäre das, was ich darauf zeichne, und nicht das, was schon da ist. Wäre ja auch logisch, da in meinem Fall die Alphawerte ja auch im oberen Quad sind :?

Edit: Ich hab leider noch nie Multitexturing benutzt... kannst du mir kurz sagen, wie ich das machen soll?

Ich hab das so verstanden:

1) Alphatextur erstellen
2) Grastextur ganz unten auf Quad zeichnen
3) Alphatextur mit Steintextur via Multitexturing mit Blending drüberzeichnen

Aber wie geht Punkt drei?

Soll ich erst die Alphatextur auf glActiveTexture(GL_TEXTURE0) binden, und die andere auf GL_TEXTURE1 oder andersrum? Und welches Blending brauche ich?

Außerdem ist es komischerweise so, dass wenn ich ein ganz normales Quad mit GL_TEXTURE1 und der Steintextur zeichne, das ganze einen dunklen Farbstich bekommt. (mit glMultiTexCoord2f())

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 18:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja für Multitexturing benötigst du glActivateTexture. Standard ist immer TM0 aktiv. Wenn du eine andere TMU aktivierst dann gehen gebundene Textur etc auf die andere. In welcher Reihenfolge du sie Bindest TMU0 = RGB und TMU1 = A oder andersrum spielt keine Rolle. Aber ich würds so machen. Aber bitte danach wieder deaktivieren. Bei allen TMUs sonst bleiben die Texturen aktiv.

Wichtig beim Quad. Du darfst dann nicht mehr glTexCoord benutzten sondern musst glMultiTexCoord benutzen. Also um dann koordinaten für die einzelnen TMUs setzen zu können. glTexCoord geht glaube ich immer auf TMU 0. In Code sieht das in etwas so aus.

Code:
  1. glActivateTexture(0)
  2. Tex.Bind
  3.  
  4. glActivateTexture(1)
  5. Tex.Bind
  6.  
  7. glBegin(quad)
  8.   glMultiTexCoord(TMU0, ...)
  9.   glMultiTexCoord(TMU1, ...)
  10.   glVertex
  11.  
  12.   ... // anderen vertices
  13. glEnd
  14.  
  15. glActivateTexture(1)
  16. UnBind
  17.  
  18. glActivateTexture(0)
  19. UnBind


Als Blending sollte das standardblending genügen. SRC_ALPHA, ONE_MINUS_SRC_ALPHA. Denn für das Blending ist es nichts anderes als eine RGBA Textur. Das Vereinen der einzelnen Texturen findet vorher statt.


Und DST und SRC beim Blenden. Du hast ein Quad (SRC) welches du irgendwohin zeichnen willst (DST). Das verwirrende dabei ist, dass die faktoren beliebig überkreuz benutzen kannst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 15, 2008 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Hallo,

das hab ich jetzt mal so gemacht, erhalte aber genau das gleiche Ergebnis, wie oben... die glClearColor() scheint durch, an den Stellen, die halbtransparent sind. Das Bedeutet, die Textur, die am Ende hier rauskommt, beinhaltet noch Transparenz.

Code:
  1.  
  2.     //Unten Gras zeichnen
  3.     glDisable(GL_BLEND);
  4.     Texmgr.BindTexture('gras');
  5.     glBegin(GL_QUADS);
  6.       glTexCoord2f(0, 0); glVertex2f(0,   0);
  7.       glTexCoord2f(1, 0); glVertex2f(512, 0);
  8.       glTexCoord2f(1, 1); glVertex2f(512, 512);
  9.       glTexCoord2f(0, 1); glVertex2f(0,   512);
  10.     glEnd();
  11.  
  12.     //Alphablending
  13.     glEnable(GL_BLEND);
  14.     glBlendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  15.     AlphaTex.Bind();
  16.  
  17.     glActiveTexture(GL_TEXTURE1);
  18.     TexMgr.BindTexture('stein');
  19.     glTranslatef(0, 0, 0.1);
  20.     glBegin(GL_QUADS);
  21.       glMultiTexCoord2f(GL_TEXTURE0, 0, 0);
  22.       glMultiTexCoord2f(GL_TEXTURE1, 0, 0);
  23.       glVertex2f(0,   0);
  24.       glMultiTexCoord2f(GL_TEXTURE0, 1, 0);
  25.       glMultiTexCoord2f(GL_TEXTURE1, 1, 0);
  26.       glVertex2f(512, 0);
  27.       glMultiTexCoord2f(GL_TEXTURE0, 1, 1);
  28.       glMultiTexCoord2f(GL_TEXTURE1, 1, 1);
  29.       glVertex2f(512, 512);
  30.       glMultiTexCoord2f(GL_TEXTURE0, 0, 1);
  31.       glMultiTexCoord2f(GL_TEXTURE1, 0, 1);
  32.       glVertex2f(0,   512);
  33.     glEnd();
  34.     glBindTexture(GL_TEXTURE_2D, 0);
  35.     glDisable(GL_TEXTURE_2D);
  36.     glActiveTexture(GL_TEXTURE0);
  37.     glEnable(GL_TEXTURE_2D);
  38.  


Komisch :?

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 16, 2008 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich habe das mal mit eigenen Texturen versucht und bei mir geht es. Könntest du mir evtl mal deine Texturen zur Verfügung stellen. Anhängen oder per mail. Evtl auch mit der Testexe, wenns möglch ist. Bitte auch die Alphatextur. An diese kommst du, wenn du beim Erstellen mal AlphaTex.SaveToFile('blah.tga', ftTGA) aufrufst. Nicht vergessen das Speichern dann wieder zu entfernen. Hatte ich auch schon mal und ich wunderte mich warum es dann so lahm war. ;)

Hast du evtl. vorher noch was gesetzt oder so. Wie schaut es denn aus, wenn du die zweite Textur deaktiviert und nur dir erste zeichnest?


PS: Wenn du die Tiefenfunc anders setzt (auf GL_LEQUAL) musst du das zweite Quad nicht verschieben. Das ist in der Regel besser. Wenn du nur Obendraufansicht hast aber nicht tragisch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]