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:
stencil.bind();
model.renderByDisplayList(gl);
gl.glDisable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_DST_COLOR,GL.GL_SRC_COLOR);
rock.bind();
model.renderByDisplayList(gl);
gl.glBlendFunc(GL.GL_SRC_COLOR,GL.GL_ONE);
grass.bind();
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 ^^
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
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 network • my 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
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.
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?
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.
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
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
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...)
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
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.