Jump to content
Unity Insider Forum

Mesh verfärbt sich braun


Helishcoffe

Recommended Posts

Hey Leude, ich bins nochmal :D

Ich habe gestern angefangen, einen Terraingenerator zu schreiben.

Dabei wird der Terrain in 20x20 Chunks unterteilt mit jeweils 20 Kacheln. Im Prinzip ist ein Chunk nur ein Mesh der zur Laufzeit generiert wird mit einem Material. Die Chunks liegen dann genau aneinander an und ergeben somit den Terrain.

Doch irgendwie bekomme ich dann in meinem fertigen Terrain diese seltsamen braunen Stellen, welche je nach Kamerawinkel und entfernung ein unterschiedliches ausmaß haben (Auch mit der Editor-Kamera):

s1.thumb.PNG.6df6fde711ca2dbeb0fedc5b3ea2ebee.PNG

Weiter herausgezoomt:

s2.thumb.PNG.60fc3128ebbfefc08080c1b500293ec7.PNG

hereingezoomt:

s3.thumb.PNG.3943a97947244828cadd472bbea4d37d.PNG

Wenn man jedoch von oben genau drauf guckt, so sieht man keine braunen stellen mehr (unäbhängig von der Entfernung der Kamera zum Terrain):

s4.thumb.PNG.9e988d258b6aa48f0718899a18bd433a.PNG

 

Wie man sieht nehmen diese braunen Flecken sehr unterschiedliche Größen an je nach Winkel und Entfernung.

Hat jemand vielleicht solche Erfahrungen schon gemacht und kann mir da vielleicht weiterhelfen? 

So sieht übrigends ein Chunkmesh aus, falls das wichtig ist:

s5.thumb.PNG.4aff985e62fbeaf6f7f6edd08dfda4e0.PNG

Die Triangles der einzlenen Kacheln sind nicht miteinander verbunden und haben jeweils eigene vertices. 

Das ist aber wichtig weil ich sonst nicht richtig UV mappen kann und die Normals falsch berechnet werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dies könnte ein Problem mit den Normalenvektoren sein. Wenn du mit der Kamera in unterschiedlichen Winkeln auf den Chunk schaust, dann kommen diese zum Tragen. Ich würde mir mal alle Normalen deines berechneten Meshs in Unity anzeigen lassen und so nach dem Fehler suchen. Die Normale (je Vertice) sollte dabei immer in die Richtung zeigen, die vom Betrachter gesehen werden soll. 
Ich vermute auch, es wäre besser wenn du die Faces doch verbindest, weil später dadurch wieder "Probleme" mit den Normalenvektoren entstehen könnten. Dies merkt man aber erst, wenn die Fläche dann nicht mehr eben ist, sonder sich wölbt. Hier sollten dann an den Übergängen die Normalenvertices eigentlich "gemittelt" werden zwischen den Übergängen der Kanten. Was passiert wenn diese nicht gemittelt werden kann ich nicht genau erklären (bin kein Grafiker), aber ich vermute es könnten unschöne Artefakte an den Kanten der Faces entstehen. Es könnten auch Artefakte entstehen, weil die Mini-Meshes zu dicht aneinanderliegen, hier wäre es auch besser den Mesh zu verbinden:

getrennter Mesh und Normalen:
|_|_|_
       |_
       |_
verbundener Mesh und Normalen:
|_|_/
      |_
      |_

PS: 
Auch mal die Textur und den Shader (hier mal einen einfachen "Vertex Lit" einstellen) überprüfen, ob hier ggf. Mipmaps eingestellt sind (d.h. das er entfernungabhängig an der Textur "dreht")

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb Zer0Cool:

Dies könnte ein Problem mit den Normalenvektoren sein. Wenn du mit der Kamera in unterschiedlichen Winkeln auf den Chunk schaust, dann kommen diese zum Tragen. Ich würde mir mal alle Normalen deines berechneten Meshs in Unity anzeigen lassen und so nach dem Fehler suchen. Die Normale (je Vertice) sollte dabei immer in die Richtung zeigen, die vom Betrachter gesehen werden soll. 

 

Habe gerade mal die normals mittels DrawRay zeichnen lassen und diese zeigen alle nach oben, was ja auch eigentlich richtig ist, da das Terrain ja platt ist.

 

vor 23 Minuten schrieb Zer0Cool:

Ich vermute auch, es wäre besser wenn du die Faces doch verbindest, weil später dadurch wieder "Probleme" mit den Normalenvektoren entstehen könnten. Dies merkt man aber erst, wenn die Fläche dann nicht mehr eben ist, sonder sich wölbt. Hier sollten dann an den Übergängen die Normalenvertices eigentlich "gemittelt" werden zwischen den Übergängen der Kanten. Was passiert wenn diese nicht gemittelt werden kann ich nicht genau erklären (bin kein Grafiker), aber ich vermute es könnten unschöne Artefakte an den Kanten der Faces entstehen.

 

Ja die Probleme mit den Faces traten aber erst dann auf, als ich sie verbunden habe. Wenn ich die Faces nicht verbinde, so werden auch Kanten und Wölbungen im Terrain richtig berechnet:

s6.thumb.PNG.ca920300b6e75a99a2ff9e6dbf8333f0.PNG

Allerdings sieht man auch hier wieder bei den Flächen die weiter hinten nach oben zeigen die braunen Schichten wieder.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 47 Minuten schrieb Zer0Cool:

PS: 
Auch mal die Textur und den Shader (hier mal einen einfachen "Vertex Lit" einstellen) überprüfen, ob hier ggf. Mipmaps eingestellt sind (d.h. das er entfernungabhängig an der Textur "dreht")

Weder das ein und ausstellen der Mipmaps oder ein Vertex Lit Shader hat etwas verändert :(

 

Wenn ich jedoch die Triangles miteinander verbinde habe ich echt probleme mit meinen UVmaps

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was passiert dann, wenn du die Teilmeshes einfach verbindest (Mesh.CombineMeshes) oder macht das Unity nicht sowieso schon in deiner Szene (nach meinen Erfahrungen verbindet Unity einfach ungefragt Meshes mit dem gleichen Material, kann man aber ausstellen):
https://docs.unity3d.com/Manual/class-PlayerSettingsStandalone.html
siehe Static und Dynamic Batching.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Sooo... ich habe mich jetzt nochmal dran gesetzt und scheinbar hat es gar nichts mit meinem Mesh selbst zutun. Ich benutze nämlich einen Texturatlas, den ich zur Laufzeit aus mehreren 32x32 Pixel großen einzelnen Texturen generiere. 

Die brauenen stellen scheinen daher zu kommen, dass neben der benutzten Grass Textur eine Steintextur und eine Eisenerz Textur benachtbart ist. Wenn ich nun beide Texturen entferne, sodass mein Texturatlas nur noch aus meiner Grass-Textur besteht, so sind die braunen Stellen komplett weg und alles sieht so aus wie es aussehen soll. 

Doch wie kann ich es einrichten, dass diese braunen Stellen auch mit den anderen Texturen im Texturatlas nicht zu sehen sind? FilterMode ist auf Point gestellt, sodass die Kanten der einzelnen Texturen auch exakt übereinstimmen. Habe auch schon bisschen mit ansioLevel rumgespielt aber keine Veränderung.

 

Jemand Ideen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich stelle mal eine Vermutung an. Deine Textur wird repeated. Wenn du im Textureimporter mal auf Camp stellst, dann solltest du es merken. Über das Repeat könnte es sein, daß andere Texturanteile des Atlases mit in die UVs des Meshs gemapped werden. Ich habe aktuell nämlich auch Probleme mit einem Texturatlas und dem Tiling des Materials, beides zusammen funktioniert leider nicht.

Bei der Lösung bin ich mir nicht sicher. Das Unityterrain arbeitet an dieser Stelle mit Tiling und einer einzelnen Textur pro Bodentextur. Unity baut dann aus den Einzeltexturen eine Schablonentextur (die anzeigt, wo welche Textur anzuzeigen ist und wie das Mischungsverhätnis zwischen den Texturen ist) und der Terrainrenderer erzeugt dann aus dieser Schablonentextur und den Einzeltextturen den Mesh des Terrains.

Da ich vermute, das du weiterhin über das Tiling der Terraintextur gehen möchtest, würde ich entweder die Terraintextur isolieren oder einen Shader schreiben, der aus deinem Texturatlas die Teiltextur abgreift und auf die UVs des Meshs legt. 

Vielleicht liege ich aber auch total falsch und es liegt am MipMapping oder sonstiges.
Stell vielleicht auch mal "Anisotropic filtering" aus, das wird aktiv, wenn die Kamera einen spitzen Winkel zur Oberfläche einnimmt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Scheint das gleiche Problem zu sein wie mit den Detail- und Grastexturen bei einem Terrain. Unity bündelt ja intern alle Gras- und Detailtexturen in einem Texturatlas und wenn die einzelnen Grastexturen kein "Color Bleeding" verwenden, dann kommt es zu seltsamen Artefakten bei den Terraindetails.
Du hast hier bei deinem Texturatlas und Mipmapping wohl das gleiche Problem. Durch die "scharfe" Abgrenzung zwischen den Einzeltexturen erzeugt der Mipmap-Algorithmus Texturen wo die Pixel ineinander übergreifen.
Um wieder mit Mipmaps arbeiten zu können. müsstest du weiche Farbverläufe zwischen deinen Teiltexturen im Atlas erzeugen.
http://answers.unity3d.com/questions/441984/what-is-mip-maps-pictures.html

Eventuell reicht es auch aus, wenn du deine Teiltextur UVs etwas enger setzt, so das sie nicht direkt aneinandergrenzen.
12_grass_uv.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 33 Minuten schrieb Zer0Cool:

Scheint das gleiche Problem zu sein wie mit den Detail- und Grastexturen bei einem Terrain. Unity bündelt ja intern alle Gras- und Detailtexturen in einem Texturatlas und wenn die einzelnen Grastexturen kein "Color Bleeding" verwenden, dann kommt es zu seltsamen Artefakten bei den Terraindetails.
Du hast hier bei deinem Texturatlas und Mipmapping wohl das gleiche Problem. Durch die "scharfe" Abgrenzung zwischen den Einzeltexturen erzeugt der Mipmap-Algorithmus Texturen wo die Pixel ineinander übergreifen.
Um wieder mit Mipmaps arbeiten zu können. müsstest du weiche Farbverläufe zwischen deinen Teiltexturen im Atlas erzeugen.
http://answers.unity3d.com/questions/441984/what-is-mip-maps-pictures.html

Eventuell reicht es auch aus, wenn du deine Teiltextur UVs etwas enger setzt, so das sie nicht direkt aneinandergrenzen.
12_grass_uv.jpg

Ja genau das wird das Problem gewesen sein. Da ich aber nur 32x32 große Texturen verwende und alle sowiso eher in Pixeloptik gehalten wird, wollte ich sowiso keine Midmaps verwenden :D 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...