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

Aktuelle Zeit: So Jul 20, 2025 00:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Heightmap Höhentextur
BeitragVerfasst: Do Okt 25, 2007 22:53 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Hallo,
Ich versuche momentan meine Heightmap abhängig von der Höhe der Dreiecke zu texturieren.
Ich habe mir eine Möglichkeit überlegt, die Grenzschicht zwischen erster und zweiter Textur zu finden und in dieser Blending einzusetzen, um für saubere ÜBergänge zu sorgen.
Die Grenzschicht wird gefunden, allerdings scheint das mit dem Blending nicht ganz zu klappen.

Zunächst einmal schaue ich, wie viele Vertices sich über der Grenze befinden:
Code:
  1.  
  2.     // Grenzhöhe
  3.     limheight := FSize.y / 3;
  4.     c := 0;
  5.     if (Vertices[V1].y >= limheight) then
  6.       inc(c);
  7.     if (Vertices[V2].y >= limheight) then
  8.       inc(c);
  9.     if (Vertices[V3].y >= limheight) then
  10.       inc(c);
  11.     if c = 3 then
  12.       FTexture2.Bind;
  13.     if c = 0 then
  14.       FTexture1.Bind;
  15.  

Wenn alle drüber oder drunter sind, handelt es sich nicht um eine Grenzschicht und ich kann mir das blenden sparen.
der code danach frag ab ob eine grenzschicht vorhanden ist und zeichnet dieses dreieck zwei mal. je nachdem ob das vertex über oder unter der grenze ist, wird es entsprechend mit glColor4f vorbehandelt.
Der Code sieht in seiner Gesamtheit so aus:
Code:
  1.  
  2.     // Grenzschicht  
  3.     if (c > 0) and (c < 3) then
  4.     begin
  5.       // Textur 1
  6.       FTexture1.Bind;
  7.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  8.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  9.       glBegin(GL_TRIANGLES);
  10.         if (Vertices[V1].y < limheight) then glColor4f(1, 1, 1, 1) else glColor4f(1, 1, 1, 0);
  11.         glTexCoord2f(Vertices[V1].x / FSize.x * 5, Vertices[V1].z / FSize.z * 5); glVertex3f(Vertices[V1].x, Vertices[V1].y, Vertices[V1].z);
  12.         if (Vertices[V2].y < limheight) then glColor4f(1, 1, 1, 1) else glColor4f(1, 1, 1, 0);
  13.         glTexCoord2f(Vertices[V2].x / FSize.x * 5, Vertices[V2].z / FSize.z * 5); glVertex3f(Vertices[V2].x, Vertices[V2].y, Vertices[V2].z);
  14.         if (Vertices[V3].y < limheight) then glColor4f(1, 1, 1, 1) else glColor4f(1, 1, 1, 0);
  15.         glTexCoord2f(Vertices[V3].x / FSize.x * 5, Vertices[V3].z / FSize.z * 5); glVertex3f(Vertices[V3].x, Vertices[V3].y, Vertices[V3].z);
  16.       glEnd;
  17.       // BLEND
  18.       glEnable(GL_BLEND);
  19.       glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA);
  20.       // Textur 2
  21.       FTexture2.Bind;
  22.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  23.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  24.       glBegin(GL_TRIANGLES);
  25.         if (Vertices[V1].y < limheight) then glColor4f(1, 1, 1, 0) else glColor4f(1, 1, 1, 1);
  26.         glTexCoord2f(Vertices[V1].x / FSize.x * 5, Vertices[V1].z / FSize.z * 5); glVertex3f(Vertices[V1].x, Vertices[V1].y, Vertices[V1].z);
  27.         if (Vertices[V2].y < limheight) then glColor4f(1, 1, 1, 0) else glColor4f(1, 1, 1, 1);
  28.         glTexCoord2f(Vertices[V2].x / FSize.x * 5, Vertices[V2].z / FSize.z * 5); glVertex3f(Vertices[V2].x, Vertices[V2].y, Vertices[V2].z);
  29.         if (Vertices[V3].y < limheight) then glColor4f(1, 1, 1, 0) else glColor4f(1, 1, 1, 1);
  30.         glTexCoord2f(Vertices[V3].x / FSize.x * 5, Vertices[V3].z / FSize.z * 5); glVertex3f(Vertices[V3].x, Vertices[V3].y, Vertices[V3].z);
  31.       glEnd;
  32.       glDisable(GL_BLEND);
  33.     end else
  34.     begin
  35.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  36.       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  37.  
  38.       glBegin(GL_TRIANGLES);
  39.         glTexCoord2f(Vertices[V1].x / FSize.x * 5, Vertices[V1].z / FSize.z * 5); glVertex3f(Vertices[V1].x, Vertices[V1].y, Vertices[V1].z);
  40.         glTexCoord2f(Vertices[V2].x / FSize.x * 5, Vertices[V2].z / FSize.z * 5); glVertex3f(Vertices[V2].x, Vertices[V2].y, Vertices[V2].z);
  41.         glTexCoord2f(Vertices[V3].x / FSize.x * 5, Vertices[V3].z / FSize.z * 5); glVertex3f(Vertices[V3].x, Vertices[V3].y, Vertices[V3].z);
  42.       glEnd;
  43.     end;
  44.  

Das Problem ist nun, dass ich mit oder ohne GL_BLEND das gleiche ergebnis habe, nämlich keine weichen übergäng, woran kann das liegen ?

Vielen Dank schonmal,

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 08:53 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Wenn ich nur den zu blendenden Part zeichnen lasse, wird dieser auch korrekt angezeigt. Allerdings nicht, wenn ich vorher das original Dreieck zeichne. Mein Grundgedanke scheint also richtig zu sein, nur irgendwie klappt das mit dem blending nicht.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 09:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Eines Vorweg. Wenn du DST_ALPHA benutzt dann musst du sicher stellen, dass dein Kontext/Framebuffer auch Immer einen Alphakanal hat. Das ist bei ATI so sobald man 32 Bit Farbtiefe angibt bei NVidia muss man immer expliziet angeben, dass man Alpha haben will. Bei 16 Bit ist das ganze schon schwieriger. Allerdings würde ich es immer grundsätzlich vorziehen auf diesen Alphakanal zu verzichten.

Aber deine Blendfunc müsste wohl auch eher GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA sein. Bzw solltest du das erste Dreieck immer vollständig sichtbar zeichnen und nur das zweite blenden. Denn wenn du einen Verlauf von 0 zu 1 hast und einen von 1 zu 0 dann treffen sich in der Mitte zwei Flächen mit dem Alpha 0.5. Aber zwei halb sichtbare Flächen ergeben NICHT 1 sondern 0.75. Somit hättest du sogar Löcher wenn es denn funktionieren würde.

Du solltest aber auch sicher stellen, dass die zweite Fläche immer gezeichnet wird. Also sollte dein Tiefentest auf GL_LEQUAL stehen. Denn bei LESS würde die zweite Fläche einfach stumpf übersprungen werden.


Evtl solltest du dir aber auch mal überlegen ob diese Technik so wie sie ist wirklich praktikabel ist. Denn sollte deine Heightmap irgendwann mal etwas größer werden, dann wird der Code definitiv nicht mehr sonderlich schnell sein, da du auch wärend dem Zeichnen häufig Texturen und States wechselst. Es wäre schon fast schon billiger, wenn du die Heightmap 2 Mal zeichnest. Also einmal normal und dann die geblendeten Spitze noch mal drüberweg.

Vielleicht ist aber auch schon MultiTexturing die Antwort auf deine Frage. Ich weiß nicht in wie fern sich da direkt ein BlendModus einstellen lässt oder ob das nur moduliert wird. Denn wenn blenden so ohne weiteres Möglich wäre würdest du beide Texturen gleichzeit auf die Flächen bringen und nur via Alphakanal der einen Textur bestimmen wie sichtbar sie wäre. Und 2 Texturen gleichzeitig ist seit 10 Jahren standard bei den Karten. Denn es wäre in jedem Falle besser wenn du es der Grafikkarte überlässt wann sie welche Fläche zu zeichnen hat als wie wenn du das machen musst. Mit Shadern könntest du aber in jedem Falle dort die Textur so auswählen wie du es haben wolltest.

Alternativ dazu hatte Sascha Willems vor ein paar Jahren auch einen Terrain Texture Generator geschrieben. Das wäre zwar nicht so flexibel aber in jedem Falle noch einfacher.

PS: Das setzen der Texturparamater braucht du im übrigen nur ein mal nach der Erstellung tun. Die bleiben bis in alle Ewigkeit an der Textur "kleben".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 09:50 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Danke, wenn ich DepthFunc umstelle und deine Blendingfunktion nutze klappt das wunderbar (den ursprünglichen Code fürs Blending hatte ich aus dem Blending Tutorial an der Stelle "Der Überläufer".

@PS: was meinst du damit genau ?

Ich erstelle die Textur nun doch mit TerrTexGen, das Ergebnis sieht einfach besser aus :P

Danke für die Umfassende Antwort ;)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 10:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Danke, wenn ich DepthFunc umstelle und deine Blendingfunktion nutze klappt das wunderbar (den ursprünglichen Code fürs Blending hatte ich aus dem Blending Tutorial an der Stelle "Der Überläufer".

Nichts desto trotz würde ich dir Empfehlen, dass du trotzdem mal schaust ob es nicht noch anders geht. Denn das ist schon ziemlich häftig für die Karte.

[edit]Wobei mir gerade auffällt, dass ich oben gelogen habe. Die erste Fläche hat zwar einen Alpha aber der wird nicht zum Blenden benutzt sondern nur weiter gereicht. Weswegen die Rechnung trotzdem hinhauen sollte. Aber ich denke dann, dass du keinen DST_ALPHA hattest.[/edit]

Zitat:
@PS: was meinst du damit genau ?

Na ja. Du sagst glGenTexture/glBindTexture und stellst dann den WrapModus ein. Und der bleibt so lange aktiv bis die Textur gelöscht wird oder er geändert wird. Also musst du den nur ein Mal, nach dem Laden, setzen und dann nie wieder. Das ist im übrigen genau das gleiche wie mit der Farbe. Die bleibt auch so lange aktiv bis sie geändert wird. Nur dass der Wrapmodus eben an der Textur hängt. Und da auch Direkt an der TexturID und nicht am Target. Statemaschine halt-

Zitat:
Danke für die Umfassende Antwort ;)

Ich versuche mich meisten kurz zu fassen und keine nützlichen Informationen unter den Tisch fallen zu lassen. Wie man sieht funktioniert es ja auch immer. *hust*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 26, 2007 14:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Seth hat geschrieben:
Ich erstelle die Textur nun doch mit TerrTexGen, das Ergebnis sieht einfach besser aus.

Auf diese Schlussfolgerung bin ich auch gekommen, als ich das ganze vor ca. 2 Jahren mit Blending lösen wollte...
Man kann einem nur davon abraten es so zu probieren. Klar funktioniert es, aber das Ergebnis ist nicht der Mühe wert.
Ein Argument dafür ist aber, dass man etwas dabei lernt :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 11:11 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Braucht eine Riesentextur nicht zu viel VRAM?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 13:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Das wäre ja bloß eine 512er oder 1024er mit entsprechender Detail-Map.
Sieht dann auch gut aus!

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 28, 2007 13:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn man die Textur in einem entsprechend komprimiertem Format ablegt kann man ruhig auch größere Texturen nutzen, auch 4k^4k. Bei einer Terraintextur braucht man ja z.B. keinen Alphakanal, und da kann man dann DXT1 mit einem Ration von 8:1 verwenden, so verbraucht man mit einer solchen Textur also weniger Speicher als mit einer unkomprimierten 1k^1k Textur und hat dank DXT auch noch fertige Mipmaps, das lädt schneller und man hat mehr Einfluss auf die Qualität der Mipmaps.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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 | 16 Queries | GZIP : On ]