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:
// Grenzhöhe
limheight := FSize.y/3;
c :=0;
if(Vertices[V1].y >= limheight)then
inc(c);
if(Vertices[V2].y >= limheight)then
inc(c);
if(Vertices[V3].y >= limheight)then
inc(c);
if c =3then
FTexture2.Bind;
if c =0then
FTexture1.Bind;
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:
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.
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".
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
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*
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
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.
Mitglieder in diesem Forum: 0 Mitglieder und 16 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.