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

Aktuelle Zeit: Fr Jul 18, 2025 07:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Multitexturing Blending Terrain
BeitragVerfasst: Sa Okt 03, 2009 01:19 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi,
ich habe mir mal die entsprechenden Tutorials im Wiki angesehen und versucht die Brücke zwischen dem Multitexturing und dem Blending von zwei Texturen mit Hilfe einer Blendmap zu schlagen. Es geht schon immer irgendwie, aber noch nicht richtig.. ^^

ich habe:
1 Terrain
3 Texturen (Grass, Rock, Stencil)

Zuerst habe ich zum Testen mal den "oldstyle" weg genutzt, und mein Terrain 3 mal mit unterschiedlichen Blendmodi gezeichnet.
d.h:
Code:
  1.  
  2.         stencil.bind();
  3.         model.renderByDisplayList(gl);
  4.  
  5.         gl.glDisable(GL.GL_DEPTH_TEST);
  6.         gl.glEnable(GL.GL_BLEND);
  7.         gl.glBlendFunc(GL.GL_DST_COLOR,GL.GL_SRC_COLOR);
  8.         rock.bind();
  9.         model.renderByDisplayList(gl);
  10.  
  11.         gl.glBlendFunc(GL.GL_SRC_COLOR,GL.GL_ONE);
  12.         grass.bind();
  13.         model.renderByDisplayList(gl);


Dass das ganze vollkommen unperformant ist, weiss ich, aber es war ja auch vorerst nur ein Test für das Blending. Die Blendfunc parameter hab ich aus dem Tutorial übernommen. Ich hab immernoch so meine Probleme, mir vorzustellen, wann ich welchen Source und welche Destination Parameter brauch.
Hier offenbart sich aber auch schon der erste Fehler: Die Texturen werden zwar passend geblendet, allerdings bleibt die gesamte Landschaft danach etwas durchsichtig. Eigentlich sollte die Landschaft ja solide sein, nur die Basistextur (Stencil) sollte mit Stein und Gras überblendet sein.

Ich hab also erstmal weiter gemacht mit Multitexturing, in der Hoffnung dass sich dieser Fehler irgendwie gibt ^^

Code:
  1.  
  2.         gl.glActiveTexture(GL.GL_TEXTURE0);                      
  3.         gl.glEnable(GL.GL_TEXTURE_2D);                                    
  4.         gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
  5.         stencil.bind();
  6.  
  7.         // Zweite Textur-Unit konfigurieren
  8.         gl.glActiveTexture(GL.GL_TEXTURE1);                  
  9.         gl.glEnable(GL.GL_TEXTURE_2D);                                    
  10.         gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
  11.         gl.glEnable(GL.GL_BLEND);                                    
  12.         gl.glBlendFunc(GL.GL_DST_COLOR,GL.GL_SRC_COLOR);
  13.         rock.bind();
  14.        
  15.         gl.glActiveTexture(GL.GL_TEXTURE2);                    
  16.         gl.glEnable(GL.GL_TEXTURE_2D);                                  
  17.         gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
  18.         gl.glEnable(GL.GL_BLEND);                                    
  19.         gl.glBlendFunc(GL.GL_SRC_COLOR,GL.GL_ONE);
  20.         grass.bind();
  21.         model.renderByDisplayList(gl);
  22.        


Mein model nutzt dabei zum Zeichnen der Vertices:
Code:
  1.  
  2.                 gl.glMultiTexCoord2f(GL.GL_TEXTURE0,tmpVertex.u, tmpVertex.v);
  3.                 gl.glMultiTexCoord2f(GL.GL_TEXTURE1,tmpVertex.u, tmpVertex.v);
  4.                 gl.glMultiTexCoord2f(GL.GL_TEXTURE2,tmpVertex.u, tmpVertex.v);
  5.                 gl.glColor3fv(tmpVertex.color.toArray(),0);


Wenn ich diese Methode verwende, wird zwar auch irgendetwas zusammengemischt, aber es sieht noch falscher aus als vorher. Das ganze ist einerseits immernoch partiell durchsichtig und andererseits scheint es nun so, als würde nur an den Stellen, an denen der Stencil nicht schwarz ist, überhaupt etwas vom Terrain sichtbar sein. Dabei sollte ja an den weißen Stellen das Gebirge entstehen und an den Schwarzen stellen das Grass sein...

Das Gute daran, dass ich gleich beides versucht habe, ist, dass ich jetzt umsomehr fragen kann^^
Danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 10:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich kann dir nicht bei allem helfen, aber ich kann dir den Tipp geben, dass du nicht für jede Texturunit eine BlendFunc angeben kannst. Es gilt also die letzte, die du angegeben hast... Weiss aber nicht, inwiefern dir das weiterhilft. Aber für die BlendFuncs und deren Parameter kannst du mal hier schauen: glBlendFunc. Dort sind die Parameter der Funktion erklärt und auch einige sinnvolle Kombinationen aufgeführt.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Benutzt du wirklich eine "Stencil"-Textur? Also nur 0 oder 1 pro Texel? Ich habe mit Alpha-Werten bessere Erfahrungen, vom Prinzip ist es das gleiche:

Du hast eine Menge von Texturen T1, T2, ..., TN und jeweils eine zugehörige Menge an Alphawerten a1, a2, ..., aN. Dabei muss gelten das die Summe aller Alphawerte für einen Texel immer 1.0 ist. In deinem Fall hast du nur zwei Texturen, daher reicht ein Alphawert. Den anderen kannst du über (1.0 - a1) berechnen. Wie gesagt die Summe muss 1.0 sein, sonst kommt etwas falsches raus.

Nun multiplizierst du den Texel jeder Textur mit dem zugehörigen Alphawert an der entsprechenden Stelle und addierst alles auf:
Ergebnis := a1*T1 + a2*T2 + ... + aN*TN;

Normalerweise macht man so etwas im Shader, siehe shader_Terrain_GPU4. Die Alphawerte speichert man in den Farbkanälen einer Textur. Braucht man übrigens nicht unbedingt Shader 4.0 für....der dortige Fragmentshader sollte mit jedem ShaderModell gehen.

Zitat:
Hier offenbart sich aber auch schon der erste Fehler: Die Texturen werden zwar passend geblendet, allerdings bleibt die gesamte Landschaft danach etwas durchsichtig. Eigentlich sollte die Landschaft ja solide sein, nur die Basistextur (Stencil) sollte mit Stein und Gras überblendet sein.

Wenn du in mehreren Passes rendest musst du darauf achten, dass du beim ersten Pass kein Blending benutzt. Anderenfalls würde der Hintergrund transparent durchscheinen und das Ergebnis verfälschen. Die folgenden Passes werden dann transparent gerendert.

Edit: Du musst natürlich trotzdem mit dem Alphawert multiplizieren. Aber du kannst den Dest-Faktor auf GL_ZERO setzen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 10:59 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay der Begriff war wohl falsch
Das kam daher, dass ich mich an ein Blendertutorial gehalten hab, um mein Terrain schön zu bemalen, und diese Textur dort als Stencil bezeichnet wurde

Ich habe alle möglichen Graustufen in dieser textur

Also die Herangehensweise über den Alphakanal klingt logisch. Ich nehme meine Grastextur und ziehe sie über das Objekt mit ihren Alphawerten, und meine Steintextur und ziehe sie auch drüber mit ihren Alphawerten und die Alphawerte müssen in Summe 1 sein.

Shader kann ich nicht nutzen, mein Laptop unterstützt glaube nichtmal shader 1.0..

Nun stellen sihc mir ein paar Fragen dazu:
- Kann ich mit diesem Verfahren Multitexturing nutzen? Also kann ich beide texuren in einem Ruck auf das Objekt kleben, ohne mehrere Renderpasses zubrauchen?
- Ich sehe hier für solche Terraintexturvermischungen fast ausschliesslich Shadertutorial. Gibt es da überhaupt elegante Möglichkeiten sowas ohne Shader hinzubekommen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 11:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich sehe hier für solche Terraintexturvermischungen fast ausschliesslich Shadertutorial. Gibt es da überhaupt elegante Möglichkeiten sowas ohne Shader hinzubekommen?

Sollte eigentlich gehen, aber vermutlich nicht "elegant". Ich habe mich bisher aber nie mit Multitexturing befasst, bzw. immer nur in Kombination mit Shadern. Ich denke mal GL_ARB_texture_env_combine hilft dir weiter.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 12:36 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Mh diese Extensions ^^ Ich finde den Konstantendschungel immer nur eher verwirrend als hilfreich.. Naja vielleicht finde ich ja ein schönes Beispiel irgendwo, nichtmal das Anwendungsbeispiel bekomme ich so umgesetzt, wie es dort angegeben ist^^

Ansonsten muss ich die Sache wohl erstmal auf Eis legen und schauen, dass ich das ganze mal auf einem PC weiterentwickel, dem Shader zur Verfügung stehen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 13:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
habs nicht getestet, aber müsste eigentlich funktionieren:

Code:
  1. glActiveTexture(GL.GL_TEXTURE0);
  2. glEnable(GL.GL_TEXTURE_2D);
  3. stencil.bind();
  4. glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
  5.  
  6. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); // egal, deswegen das was am schnellsten geht
  7. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PRIMARY_COLOR_ARB);  
  8. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_ALPHA);
  9.  
  10. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); // Alphawert aus dem Alphawert der Alphatextur
  11. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE);
  12. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
  13.  
  14. glActiveTexture(GL.GL_TEXTURE1);
  15. glEnable(GL.GL_TEXTURE_2D);
  16. rock.bind();
  17. glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
  18. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE);  // Farben aus der "rock"-Textur
  19. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
  20. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
  21.  
  22. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); // Alphawert vom vorherigen Stage übernehmen
  23. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
  24. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
  25.  
  26. glActiveTexture(GL.GL_TEXTURE2);
  27. glEnable(GL.GL_TEXTURE_2D);
  28. grass.bind();
  29. glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
  30.  
  31. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB); // nun wird interpoliert: Arg0 * (Arg2) + Arg1 * (1-Arg2)
  32. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
  33. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
  34. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
  35. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
  36. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PREVIOUS_ARB);
  37. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);
  38.  
  39. glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); // Alphawert am Ende auf 1 setzen
  40. glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_CONSTANT_ARB);
  41. glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
  42. tempColor[0] := 0; tempColor[1] := 0; tempColor[2] := 0; tempColor[3] := 1;
  43. glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, @tempColor);



Edit: Und ich hoffe da wird auch klar warum Shader viel schöner sind...da lässt sich das Problem nämlich plötzlich in einer Zeile lösen ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 13:40 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ohne jetzt diese ganze Parameterkaskade zu verstehen, hab ichs einfach mal reingesetzt. Es sieht genauso aus, als hätte ich nur die RockTexture drüber gezogen. Man sieht nichts grünliches durchschimmern oder so :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wahrscheinlich ist dein Alphawert immer 1.

Das Problem ist das man (scheinbar) mit env_combine den Alphawert nicht aus dem Farbwert übernehmen kann. Daher brauchst du eine echte Alpha-Textur! Also eine Textur die nur einen Alpha-Kanal hat, sonst nichts. Eine solche Textur muss entsprechend geladen werden, also internes Format GL_ALPHA8 oder etwas in der Art. (Die Bilddatei auf der Festplatte kann ruhig Graustufen haben...)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 14:30 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Mhh hab das mal umgestellt und lade die Textur(stencil) mit dem InternalFormat GL_ALPHA8 und dem Pixelformat GL_ALPHA
Allerdings kommt das gleiche Ergebnis bei raus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 03, 2009 14:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Verwende mal diese Textur:

Code:
  1. data[0] := 128;
  2. glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA8, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, @data);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.009s | 14 Queries | GZIP : On ]