2 heighmaps => 1 terrain
-
Hi.
Ich beschreibe euch mal kurz was ich vor habe:
Ich möchte in meine terrain engine 3D schnee einbauen, d.h. nicht nur weiße flecken in der textur sondern eine snow-heighmap über dem eigentlichen terrain.
Die 2 heighmaps zu addieren ist kein problem, aber wo es hackt ist das texturing..
Es soll 3-4 verschiedene texturen geben, abhängig von der schnee höhe, also von gar nicht da, über weiß/braun/transparent bis 'schön weiß'.
Mein erster ansatz war, die 2 heighmaps zu addieren, eine snow textur zu erzeugen und diese übers spatting einfach über die world textur zu zeichnen. Das scheint mir allersings ziehmlich aufwendig, da die physik engine die snow-heighmap am laufeden band verändert. Ich müsste also ziehmlich häufig in der snow textur rummalen.. und das ist es was mir nicht gefällt..
Meine nächste Idee war ein shader. Allerdings weis ich nicht so recht wie man das angehen könnte. Ich hab dort ja nur ne y koordinate, keine Ahnung wie viel davon schnee und wieviel welt ist, mal ganz abgesehen davon, dass die nur im vs und nicht im ps da sind (oder hab ich was übersehen?)
Jemand ne idee?
-
CMatt schrieb:
Meine nächste Idee war ein shader. Allerdings weis ich nicht so recht wie man das angehen könnte. Ich hab dort ja nur ne y koordinate, keine Ahnung wie viel davon schnee und wieviel welt ist, mal ganz abgesehen davon, dass die nur im vs und nicht im ps da sind (oder hab ich was übersehen?)

könntest du genauer sagen, was du mit der shader vor hast, und wo das problem liegt? normalerweise ist es kein problem über die y-coordinate ein terrain mit mehreren layern zu versehen... deswegen weiß ich nicht wo genau dein problem ist.
-
ich denk mal das problem ist, dass er im shader nur noch die addierte y Koordinate hat (also eigentliche höhe + schneehöhe) und damit nicht mehr die schneehöhe rausbekommt.
Also könnteste einfach die eigentliche höhe und/oder schneehöhe zusätzlich schicken, so dass du alle benötigten informationen hast. Das ausrechnen der entsprechenden blending-werte könnteste dann im vs machen und dann an ps schicken, der dann daraus die endgültige pixel farbe mixt..
-
Genau das ist eines der probleme, das zewite ist:
ich == shader noob
Ich hänge an folgenden problem:
Wie teile ich dem Pixel Shader mit wieviel vom y welt und wieviel schnee ist? Ich müsste das zusätzlich schicken, soweit klar. Aber wie mache ich das? Ich kann meinem Vertex doch schlecht 2 y werte geben :am_kopf_kraz:So wie ich life verstehe definiere ich eine PS_OUTPUT struct mit 4-5 float's die den blending faktor für die einzelen textures angeben und ner TEXCOORD.
Der ps macht dann ein tex2D und schraubt am alpha der einzelnen texturen, abhängig von blending faktor der vs kommt. Ok?
-
der ps muss doch garnicht wissen wieviel schnee da liegt, sondern der vs. Also definiereste dein Vertexformat eben entsprechend um...
Und die blendwerte könnteste einfach als COLOR0 werte oder so dem PS übergeben. Also haste dann im VS vielleicht sowas (HLSL):
struct VS_INPUT { vector position : POSITION; float snowHeight: PSIZE; //oder so >.< }; struct VS_OUTPUT { vector position : POSITION; vector textureBlends : COLOR0; float2 textureCoord : TEXCOORD0; }; VS_OUTPUT Main(VS_INPUT input) { //werte fülln ;) }und im PS dann z.b. sowas:
struct PS_INPUT { vector textureBlends : COLOR0; float2 textureCoord : TEXCOORD0; }; struct PS_OUTPUT { vector color: COLOR0; }; PS_OUTPUT Main(PS_INPUT input) { PS_OUTPUT output; vector textureColor[2]; vector textureColor[0]= tex2D(meineSnowTex1,input.textureCoord); vector textureColor[1] = tex2D(meineSnowTex2,input.textureCoord); //.. output.color = textureColor[0] * input.textureBlends.x + textureColor[1] * input.textureBlends.y; //... return output; }
-
am einfachsten dürfte das mit einer volumetexture gehen (z.b. 512*512*2)
mach eine ebene der volume mit deiner boden, die andere mit schnee, dann nutzt du x und z als uv der textur und y (richtig hinskaliert) als w. die graphikkarte sampled für dich dann schon von alleine.
das dürfte das fixeste und einfachste sein.
-
Im NVIDIA SDK gibt es ein Bespiel Snow-Accumulation. Ist vielleicht ganz interessant.
-
Thx, werde mal das mit der volumetexture versuchen.
btw. kennt einer von auch ne seite wo die gebräuchlisten GPUs mit featurs aufgelistet sind? Im beispiel von life verwenden die 2 tex2D nächmlich die selbe TEXCOORD, was erst am ps_2_0 erlaubt ist.. (min. karte für meinen Terrain Scene Manager soll ne FX 5200 sein, die kann zwar 2.0 aber wäre interssant zu sehen ab wann das bei nvidia/ati dabei ist)
Im NVIDIA SDK gibt es ein Bespiel Snow-Accumulation. Ist vielleicht ganz interessant.
Ja, hab ich schon gefunden, aber nachdem das teil auf meinem test-pc mit sage und schreibe 4fps lief hab ich mir source gar nicht erst angesehen..
(ich will nicht grad ne 7900GTX als min. karte vorraussetzten damit es halbwegs ruckelfrei läuft
)
-
hm.. wusste ich garnicht, da ich bei meinem splatting eh unterschiedliche textureCoords benutze, weil die texturen unterschiedlich groß sind..
Aber rapsos volumetexture hört sich aufjedenfall ganz interessant an. Werd ich mir vielleicht auch mal bei gelegenheit angucken

-
Mach das, hat mich 10min gekostet funktioniert super
(ok 20 bis die morphing shader umgebaut waren und ich rausgefunden habe wie ich ne 3D textur in TextureUnitState packen kann - zählt aber zu 'an OGRE schrauben' nicht 'volume texture einbauen'
)
Es ging so einfach dass ich jetzt auch gleich noch die welt damit zu texturiere
Hatte vorher ja ne terrain texture in page größe, die beim startup, abhängig von der heighmap, generiert wurde. Jetzt hab ich ein dds file mit den 5 welt texturen und 3 snow texturen und je nachdem wie y-welt bzw. y-snow wähle ich den entsprechnden w wert. Spart ne schicht beim splatting und ne menge zeit beim starten
Das einzige was mir noch zu grübeln gibt
Mein dds bestes aus folgenden slices:- World level 1
- Snow level 1
- World level 2
- Snow level 1
..
n-3) World level 5
n-2) Snow level 1
n-1) Snow level 2
n) Snow level 3
Die erste snow level textur ist also nach jedem world level einmal da, da ich den übergang brauche. Hab aber igendwie das gefühl, dass das verschwendeter speicher ist, man es also vermeiden könnte... weis aber nicht wirlich wie

-
Ok, das mit der welt-textur klappt doch nicht so einfach... habe eben LOD wieder eingeschaltet und das sieht nicht wirklich vorteihalft aus, wenn sie die textur eines berges, der umgeben von flachland ist, vom saftig grün, über braun bis zum eigentlich grau je nach entfernung der cam verändert... muß wohl doch noch etwas mehr zeit rein stecken..

-
Könntest auch mal versuchen einfach deine höhenwerte in eine textur codieren und diese dann im ps zu setzen. Dann haste im Pixelshader die genauen y-Werte und nicht die LOD verfälschten und kannst entsprechend dein tex3D (gibts das? ;)) mit den richtigen y-Werten machen. Damit wär dann deine texturierung unabhängig vom LOD..
Dabei sollte das terrain aber natürlich nicht zu groß werden, da sonst die textur zu fett wird
btw. interpolierst du zwischen zwei vertices zur zeit einfach die farbe oder korrekterweise den y-Wert (oder wie meinste das mit von grün nach grau >.<)?
-
Könntest auch mal versuchen einfach deine höhenwerte in eine textur codieren und diese dann im ps zu setzen. Dann haste im Pixelshader die genauen y-Werte und nicht die LOD verfälschten und kannst entsprechend dein tex3D (gibts das? ) mit den richtigen y-Werten machen. Damit wär dann deine texturierung unabhängig vom LOD..
hmm.. klingt nach nem interessanten ansatzt, muß es mir mal etwas darüber nachdenken

btw. interpolierst du zwischen zwei vertices zur zeit einfach die farbe oder korrekterweise den y-Wert (oder wie meinste das mit von grün nach grau >.<)?
Ich interpoliere eigentlich gar nichts.
Komme von grau auf grün weil der index buffer immer mehr vertixes vom berg referenziert. Wenn die cam weit oben steht, sehe ich erst mal nur grün, da der index buffer auf vertixes in der ebene steht. Zoome ich näher ran ändert sich die textur jetzt plötzlich primtive-weise (was schrecklich aussieht), da jetzt immer mehr vertixes von berg im index buffer sind.
Mit ner größen textur über die ganze page sieht das sehr viel 'weicher' aus, da die textur ja feststeht und sie nur 'scaliert' wird, wenn der index buffer die primtive größe ändert.
-
wenn ich das richtig verstehe, siehste wenn die cam weit oben steht den berg garnicht und somit ist alles grün und wenn du nun näher rankommst erscheint der berg langsam und die textur wird entsprechend langsam grau. Sieht das aber nicht eh scheiße aus, wenn ein berg aus dem nichts erscheint? :>
-
Sieht das aber nicht eh scheiße aus, wenn ein berg aus dem nichts erscheint? :>
genau

Wenn ich eine textur über die ganze page lege passiert das nicht, denn das grau vom berg ist ja immer da (teil der textur) und wird einfach kleiner wenn der index buffer umliegende vertices in der ebene referenziert.
Mit der volume textur ist das nicht der fall. Wenn der index buffer umliegende vertices referenziert, also vertices deren w koordinate genau auf 'grün' leigt, ist das ganze primitve grün, vom berg nix zu sehen
-
CMatt schrieb:
Sieht das aber nicht eh scheiße aus, wenn ein berg aus dem nichts erscheint? :>
genau

Wenn ich eine textur über die ganze page lege passiert das nicht, denn das grau vom berg ist ja immer da (teil der textur) und wird einfach kleiner wenn der index buffer umliegende vertices in der ebene referenziert.
Mit der volume textur ist das nicht der fall. Wenn der index buffer umliegende vertices referenziert, also vertices deren w koordinate genau auf 'grün' leigt, ist das ganze primitve grün, vom berg nix zu sehen
das liegt daran, dass du w pro vertex machst, statt in einer texture

-
ich meine, dass es doch auch unabhängig von der textur schon ein wenig merkwürdig ist, wenn in dem flachland-mesh nun (langsam) ein berg erscheint und dementsprechend künstlich aussieht (außer man ist wirklich direkt über dem peek, dann würd das falsche mesh vielleicht nicht so sehr auffallen)..
-
so jetzt hab ihr geschaft... was soll ich machen??? w pro texel???
Wie bekomme ich das denn hin
Ich meine, meinem vertex kann ich sagen du hast jetzt nicht nur xy als tex-coord sondern xyz, aber wie sag ich ner textur und vor allem wo (ich will ja vermeiden in der textur rumzumalen
)ch meine, dass es doch auch unabhängig von der textur schon ein wenig merkwürdig ist, wenn in dem flachland-mesh nun (langsam) ein berg erscheint und dementsprechend künstlich aussieht (außer man ist wirklich direkt über dem peek, dann würd das falsche mesh vielleicht nicht so sehr auffallen)..
Bin offen für jede art von anderen ideen (LOD brauche ich jeden fall, weglasse ist keine option :p )

-
hmm.. je mehr ich daran rumspiele deszo mehr glaub ich das nicht index buffer sondern was anderes am dem effekt schuld ist.
Hab mal die app auf nen server geladen mit ner map wo man es gut sehen kann:
http://web32.net-server4.de/Release.rar
Drück die linke maus taste und zieht sie nach oben dann kommt ihr von ner höhere braunen ebene in eine tiefere grüne und seht immer wieder diese farb-änderungen an den stellen wo der LOD algo arbeitet.. alles sehr komisch.. jemand ne idee was sein könnte
-
also bei mir sieht das ganz merkwürdig aus und liegt garantiert nicht daran, dass irgendwelche vertices weggelassen werden vom LOD-Algorithmus (jedenfalls nicht direkt)..