Triangles bei Meshterrain reduzieren
Übersicht

![]() |
NiborBetreff: Triangles bei Meshterrain reduzieren |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Ich habe eine Funktion geschrieben, die aus einer Heightmap ein Meshterrain lädt. Leider werden bei geraden Flächen unnötig viele Triangles gesetzt, ein paar große würden reichen, da man dort den unterschied sowieso nicht sieht. Das geht natürlich auf die FPS. Habt ihr eine Idee, wie ich die Funktion verbessern kann? Code: [AUSKLAPPEN] ;Lädt ein Meshterrain aus einer Heightmap function LoadMeshTerrain(height,parent=0) if parent=0 then terrain=createmesh() else terrain=createmesh(parent) endif surface=createsurface(terrain) scaleimage height,1,-1 local verte1[513] local verte2[513] local verte3[513] local verte4[513] local hoch# local size=imageheight(height) for B=0 to size-1 rgb#=readpixel(0,B,imagebuffer(height)) hoch#=(((rgb AND $FF0000)/$10000)+((rgb AND $FF00)/$100)+(rgb AND $FF))/255.0*2 if hoch#<0.13 then hoch=hoch-(0.13-hoch)^2.5*250 endif if hoch>1.85 then hoch=1.85+(hoch-1.85)^1.9 endif verte1[B]=addvertex(surface,0,hoch#,B) next for A=0 to size-2 for B=0 to size-1 if verte2[B]=0 then rgb#=readpixel(A+1,B,imagebuffer(height)) hoch#=(((rgb AND $FF0000)/$10000)+((rgb AND $FF00)/$100)+(rgb AND $FF))/255.0*2 if hoch#<0.13 then hoch=hoch-(0.13-hoch)^2.5*250 endif if hoch>1.85 then hoch=1.85+(hoch-1.85)^1.9 endif texhoch#=1.0-((hoch)/4.0) if texhoch>1.0 then texhoch=1.0 elseif texhoch<0.1 then texhoch=0.1 endif if readpixel(A+1,B,imagebuffer(height))=readpixel(A+1,B-1,imagebuffer(height)) then verte2[B]=addvertex(surface,A,hoch#,B+1) verte3[B]=verte2[B] else verte2[B]=addvertex(surface,A,hoch#,B) verte3[B]=0 endif vertextexcoords surface,verte2[B],B/128.0,texhoch,1,0 vertextexcoords surface,verte2[B],B/.512,A/.512,1,1 endif next ;Triangles setzen for B=0 to imageheight(height)-2 if vertexy(surface,verte1[B+1])>-1.51 or vertexy(surface,verte2[B])>-1.51 or vertexy(surface,verte2[B])>-1.51 then addtriangle(surface,verte1[B+1],verte2[B],verte1[B]) endif if vertexy(surface,verte1[B+1])>-1.51 or vertexy(surface,verte2[B+1])>-1.51 or vertexy(surface,verte2[B])>-1.51 then addtriangle(surface,verte1[B+1],verte2[B+1],verte2[B]) endif next ;Vertices nachrücken lassen for B=0 to size-1 verte1[B]=verte2[B] verte2[B]=verte3[B] verte3[B]=0 next ;Neue Surface, wenn alte voll ist if counttriangles(surface)>20000 then surface2=createsurface(terrain) for B=0 to size-1 verte2[B]=addvertex(surface2,vertexx(surface,verte1[B]),vertexy(surface,verte1[B]),vertexz(surface,verte1[B]),vertexu(surface,verte1[B]),vertexv(surface,verte1[B])) verte1[B]=verte2[B] next surface=surface2 endif next updatenormals terrain entityfx terrain,2 return terrain end function Der Parameter "height" ist übrigens ein geladenes Bild. |
||
http://www.blitzforum.de/showcase/203/ |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group