Triangles bei Meshterrain reduzieren

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Nibor

Betreff: Triangles bei Meshterrain reduzieren

BeitragFr, Mai 23, 2008 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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/

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group