Weicher Texturübergang
-
Hi
ich habe folgendes Problem, ich habe eine Landschaft, die ich texturieren möchte. Da die Landschaft relativ groß ist wollte ich viele kleine Texturen einsetzen und diese dann zusammenfügen.
Allerdings bekomme ich keinen sauberen Texturübergang hin.Soll heißen ich weiß nicht wie ich gesteuert die ein Textur
ausblende und die andere einblende.Hinzu kommt dass die Landschaft durch LOD dynamisch ist.
Ich benutze DX7.Grüße
Christian
-
da gibt es soooooooviele möglichkeiten...
z.B.
-durch pattern die nach außen hin transparent werden und sich gegenseitig überlappen.
-durch vorberechnen eine riesiegen textur die dann schon die groben sachen enthällt (die man grossskaliert auf das ganze terrain packt), für die details kann man dann eine sich wiederhollende detailmap machen
-durch eine blendmap die man benutzt um die einzelnen pattern so zu zeichnen dass von der blendmap die werte quasi als alpha für die pattern genommen werden
-durch das vorherige rendern der terraintextur in eine textur für den lokalen bereich und dann von soften-filtern die du auf die ränder anwendest
-oder du hast pattern die übergänge in sich haben und an der setlle an der sie sich berühren haben die dann die selbe texturkante wie z.B. bei den pattern in c&c 1-3
-...rapso->greets();
-
rapso schrieb:
"durch pattern die nach außen hin transparent werden und sich gegeseitig überlappen"
ehrlich gesagt ist das kein wirklicher lösungsansatz, sondern nur die erneute schilderung des problems. natürlich bekommt man weiche texturübergänge hin, indem man die eine textur ausblendet und die andere einblendet! die frage ist vielmehr wie geht das. ich würde das auch gerne wissen, also mit konkreten beispielen für directx7/8/9. kannst du da etwas quellcode posten? texturestagestates? FVF?
das problem liegt darin, das man in directx nicht für jeden vertex für jede einzelne texturstage einen alphawert (bzw farbwert) angeben kann. wenn das gehen würde, dann würde man einfach hingehen und in der stage0 links alpha 255 und rechts alpha 0 und in der stage1 links alpha 0 und rechts alpha 255 nehmen (nur als beispiel).
anders formuliert:
wie kann man für einen vertex jeder texturestage einen eigene alpha/farbwert angeben?
geht das nur über pixel-/vertexshader?
-
"ehrlich gesagt ist das kein wirklicher lösungsansatz, sondern nur die erneute schilderung des problems."
vielleicht nur weil du ihn nicht verstehst, ich erklär es gerne nochmal genauer, aber an sich ist es die antwort auf die frage und keine neuformulierungda es sich dabei um pattern handelt, also texturen, macht man die transparenz in die texturen und nicht in die vertexcolors.
dann schaut es vielleicht so aus für eine 64pixel 1D textur:
alphachannel:
pixel 0: 0
bis
pixel 10: 255
bis
pixel 53: 255
bis
pixel 63: 0wie du daraus (hoffentlich) erkennen kannst, geht der alphawert von 0 (voll transparent) bis 255 (vollkommen sichtbar) innerhalb der ersten 10 pixel hoch und andersrum innerhalb der letzten runter.
das ist dann der blendbereich. Beim zeichnen muss man nun im texturestagestate einstellen dass der alphawert mit den colors multipliziert wirt (das is doch zu einfach für ein beispeil?)
wenn man nun zwei pattern zeichnet, wählt man den blendmodus "additiv"pD3DD8->SetRenderState(D3DRS_ALPHABLENDENABLE, true); pD3DD8->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); pD3DD8->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
damit addiert man die mit alpha geblendeten pixelfarben auf den bildshirm wenn man zeichnet.
wenn die kanten überlappen (an den bereichen mit den 10 randpixeln) wird die eine textur immer transparenter und die neue wird immer sichtbarer, im schnitt bleibt die sichtbarkeit bei 100%. damit kann man dann auch zwei gleiche pattern zueinander blenden ohne dass jemand einen übergang sehen sollte!
noch mehr frägchen?
rapso->greets();
-
sniper_ak schrieb:
kannst du da etwas quellcode posten?
Denk doch mal etwas nach und versuch selbst eine Lösung zu finden, anstatt nur etwas zu kopieren. rapso hat doch schon viele Ideen genannt. Was wäre zum Beispiel wenn man 2 Vertizen erstellt und jedem einen andern Alpha gibt?
-
aha!
jetzt ist das ganze schon vielmehr ein lösungsansatz! um es nochmal zu sagen, dein erster ansatz was nur eine erneute schilderung des problems! denn fischi hat geschrieben:
"Soll heißen ich weiß nicht wie ich gesteuert die ein Textur
ausblende und die andere einblende."und gibst als lösungsansatz:
"durch pattern die nach außen hin transparent werden und sich gegenseitig überlappen"
ersetze pattern durch durch texturen:
"durch texturen die nach außen hin transparent werden und sich gegenseitig überlappen"
das hat doch nix mit einem lösungsansatz zu tun. das ist das selbe was fischi gesagt hat nur etwas anders formuliert. tut mir leid, aber ich wollte das nur nochmal klarstellen, denn im zweiten ansatz erkennt man gleich was gemeint ist und so kann man auch was damit anfangen. danke!
und TGGC. ich wollte nichts kopieren oder so. ausserdem funktioniert das meinstens eh nicht das man einfach was kopiert und es dann 100% klappt. mir ging es nur darum, das ich auch konkret sehe mit welchen mitteln das in directx realisiert wird, dann kann man sich mehr darunter vorstellen, als wenn man nur so theoretisch was erklärt.
-
mir ist da noch was eingefallen. da man mit dieser methode alphabelnding zum zeichnen der übergänge benutzt, muss man die 3d-scene von hinten nach vorne zeichnen, sonst funktioniert das alphablending ja nicht. gibts da auch eine möglichkeit das alles in nur einem rendervorgang ohne blending zu realisieren? in der art wie ich es schon einmal geschildert habe, indem man für jede stage einen eigenen farbwert angibt, mit dem man dann den alphawert für die stage setzt. das ist im prinzip das selbe wie du es machst mit der 1D-textur, nur das man dann kein alphablending mehr braucht. oder gibts es noch andere ansätze?
-
... ich weiß nicht ob das so genau richtig ist wie es formuliert habe, was ich meine ist, das man bei durchsichtigen fenstern doch auch die fenster als letztes zeichnen muss, damit das funktioniert. das ist doch hier auch der fall oder nicht?
sry
-
beim additiven blenden ist die reihenfolge egal.
und wenn ich schreibe, dass man überlappende nach außen hin transparent werdende texturen benutzen kann, ist das ein lösungsvorschlag und keine neuformulierung, denn er hatte nichts von überlappen oder nach außen hin transparentwerden geschrieben... und es gibt viele möglichkeiten texturen für terrain zu blenden, wie du vielleicht aus meinen anderen vorschlägen herausließt, die genauso nur umformulierungen sein müßten, wenn man deiner interpretationsweise folgt.. ist nicht alles nur atombau?
rapso->greets();
-
sniper_ak schrieb:
mir ist da noch was eingefallen. da man mit dieser methode alphabelnding zum zeichnen der übergänge benutzt, muss man die 3d-scene von hinten nach vorne zeichnen, sonst funktioniert das alphablending ja nicht. gibts da auch eine möglichkeit das alles in nur einem rendervorgang ohne blending zu realisieren? in der art wie ich es schon einmal geschildert habe, indem man für jede stage einen eigenen farbwert angibt, mit dem man dann den alphawert für die stage setzt. das ist im prinzip das selbe wie du es machst mit der 1D-textur, nur das man dann kein alphablending mehr braucht. oder gibts es noch andere ansätze?
-die 1d textur war nur ein beispiel, geht auch mit einer 2d textur die einen alphachan hat :), wieso denn auch nicht?
-das ganze wird in nur einem rendervorgang gemacht, jedes pattern wird exact nur einmal gerendert
-ohne blending->vorberechnen
-ob du deinen blendwert als alpha angibst oder als farbwert, das ist relativ egal beim blenden wie das hier gemacht wird, da die intensität auf jeden fall von sichtbar zu unsichtbar linear interpoliert wird, also jeder farbwert mit gleichem wert beim interpolator... da kann man gleich den alphawert als interpolator nutzen. und pro vertex geht es eher schlechter, da du dann pro pattern 8punkt bräuchtest und nicht 4, wie jetzt... sonst ändert sich nichts, da die textur meißt eh einen alphachannel hat.