Mav bei Renderworld // Seltsame Verformung - Eigenes Terrain

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Mav bei Renderworld // Seltsame Verformung - Eigenes Terrain

BeitragSa, Jan 10, 2009 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Terrain System
;Non-LOD Terrain
Function Load_Terrain(File$, Parent=0)
   If FileType(File$) = 1
      TerImg = LoadImage(File$)
      If TerImg <> 0
         W = ImageWidth(TerImg):H = ImageHeight(TerImg)
         Mesh = CreateMesh(Parent):Surf = CreateSurface(Mesh)
         SetBuffer ImageBuffer(TerImg):LockBuffer ImageBuffer(TerImg)
         For X = 0 To W:For Y = 0 To H
            RGB = ReadPixelFast(X  , Y  ):W1# = ((RGB And $FF0000) Shr 16) / 12.
            RGB = ReadPixelFast(X+1, Y  ):W2# = ((RGB And $FF0000) Shr 16) / 25.5
            RGB = ReadPixelFast(X  , Y+1):W3# = ((RGB And $FF0000) Shr 16) / 25.5
            RGB = ReadPixelFast(X+1, Y+1):W4# = ((RGB And $FF0000) Shr 16) / 25.5
            
            V1 = AddVertex(Surf, X  , W1, Y  , X  , Y  )
            V2 = AddVertex(Surf, X+1, W2, Y  , X+1, Y  )
            V3 = AddVertex(Surf, X  , W3, Y+1, X  , Y+1)
            ;V4 = AddVertex(Surf, X+1, W4, Y+1, X+1, Y+1)
            
            AddTriangle(Surf, V3, V2, V1)
            ;AddTriangle(Surf, V2, V3, V4)
            
         Next:Next
         SetBuffer BackBuffer():UnlockBuffer ImageBuffer(TerImg)
         
         UpdateNormals Mesh
         Return Mesh
      Else
         RuntimeError "File is not a valid Image"
      EndIf
   Else
      RuntimeError "File doesn't exist"
   EndIf
End Function

Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

;-------------------------------Boden Textur
Grass = CreateTexture(64,64,8)
SetBuffer TextureBuffer(Grass)
   ClsColor 80,130,90
   Cls
   RGB = (90 Shl 16) + (110 Shl 8) + 60
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (70 Shl 16) + (120 Shl 8) + 70
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (95 Shl 16) + (115 Shl 8) + 90
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
SetBuffer BackBuffer()

Cam = CreateCamera()
ter=Load_Terrain("Ter02.bmp")
EntityTexture ter, GRass

While Not KeyHit(1)
   YSpeed# = MouseYSpeed()
      YSpeed# = YSpeed# / 5
   XSpeed# = MouseXSpeed()
      XSpeed# = XSpeed# / 5
      
   RotateEntity Cam, EntityPitch#(Cam)+YSpeed#, EntityYaw#(Cam)-Xspeed#, 0
   If EntityPitch#(Cam) < -89.5 RotateEntity Cam, -89.5, EntityYaw(Cam),0
   If EntityPitch#(Cam) > 89.5 RotateEntity Cam, 89.5, EntityYaw(Cam),0
   
   If MouseDown(1) MoveEntity Cam, 0, 0, 1
   If MouseDown(2) MoveEntity Cam, 0, 0, -1
   
   If MouseX() < 10 Or MouseX() > 1014 Or MouseY() < 10 Or MouseY() > 758 MoveMouse 512,368
   
   RenderWorld
   Flip
Wend

End


Ich erhalte bei dem code ohne die beiden auskommentierten Zeilen keinen mav, mit hingegen schon.
Und ich erhalte unerwarte spitzen im Terrain.

das terrain bmp:

user posted image

die erwarteten spitzen treten widerrum nicht auf. ich weiß nicht mehr weiter:(
Warbseite

Noobody

BeitragSa, Jan 10, 2009 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir beim überfliegen ins Auge sticht: Du verwendest ReadPixelFast und liest trotzdem zwei Pixel weiter als erlaubt - die Koordinaten müssen nämlich im Bereich 0 bis Breite - 1 bzw. 0 bis Höhe - 1 sein.
Eigenartig, dass dort der Debugger keine Fehlermeldung ausgibt.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Xaymar

ehemals "Cgamer"

BeitragSa, Jan 10, 2009 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
auch mit W-1 und H-1 kommen die selben fehler(ein wenig stärker als vorher)
Warbseite

Holzchopf

Meisterpacker

BeitragSa, Jan 10, 2009 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Debugger gibt deshalb keine Fehlermeldung aus, weil er bei ReadPixelFast nicht einmischt - was der Grund ist, wieso der Befehl auch so schnell ist.

Und CGamer: Du sprengst mit deinem 128 x 128 Pixel grossen Bild ganz einfach die Grenzen der Graka. Bei 4 Vertices pro pixel gibt das nämlich 65536 Punkte, also genau die Grenze. Aber du gehst von 0 bis 128, also hast du eine 129x129 Einheiten grosse Surface, was einfach zu viel ist.
Und nur so btw: Du brauchst nicht zwingend pro Pixel 4 Vertices, da sich Triangles auch einen Vertex teilen können.


Probiers einfach mal mit nem kleineren Bild

Edit: Die "unerwarteten" Spitzen kommen aber nicht zufälligerweise daher, dass du die Höhe für Vertex 1 durch 12. dividierst und die restlichen durch 25.5?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Noobody

BeitragSa, Jan 10, 2009 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das muss W-2 und H-2 heissen, da du ja vorhin zwei Pixel zu weit ausgelesen hast Wink

@HC: Wenn der Debugger eingeschaltet ist, gibt er bei mir eine MAV aus, wenn ich zu weit lesen will.
Ist er aus, so erhalte ich einfach irgendeinen Wert, je nach dem, was dort gerade im RAM steht.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Holzchopf

Meisterpacker

BeitragSa, Jan 10, 2009 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, gut möglich. Ich erinnere mich einfach noch, dass bei mir bei WritePixelFast im einen Fall einfach die Meldung "BlitzCC hat Fehler verursacht und wird geschlossen" kam und im anderen Fall kam keine Meldung, aber je nachdem erschienen plötzlich Pixel irgendwo auf dem Bildschirm. An den Debugger könnte ich mich grad nicht erinnern und ich bin ehrlich gesagt zu faul, das hier zu testen =)
Vielleicht ist das ja auch Write-/ReadPixelFast abhängig und evtl gibts sogar unterschiede zwischen B2D und B3D
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xaymar

ehemals "Cgamer"

BeitragSo, Jan 11, 2009 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
also mit w-2 und h-2 funzt nur das mit der vertex verteilung will net
Warbseite

Holzchopf

Meisterpacker

BeitragSo, Jan 11, 2009 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Was meinst du mit Vertex-Verteilung?
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xaymar

ehemals "Cgamer"

BeitragMo, Jan 12, 2009 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Terrain System
;Non-LOD Terrain
Function Load_Terrain(File$, Parent=0)
   If FileType(File$) = 1
      TerImg = LoadImage(File$)
      If TerImg <> 0
         W = ImageWidth(TerImg):H = ImageHeight(TerImg)
         Mesh = CreateMesh(Parent):Surf = CreateSurface(Mesh)
         SetBuffer ImageBuffer(TerImg):LockBuffer ImageBuffer(TerImg)
         For X = 0 To W-2:For Y = 0 To H-2
            RGB = ReadPixelFast(X  , Y  ):W1# = ((RGB And $FF0000) Shr 16) / 127.5
            RGB = ReadPixelFast(X+1, Y  ):W2# = ((RGB And $FF0000) Shr 16) / 127.5
            RGB = ReadPixelFast(X  , Y+1):W3# = ((RGB And $FF0000) Shr 16) / 127.5
            RGB = ReadPixelFast(X+1, Y+1):W4# = ((RGB And $FF0000) Shr 16) / 127.5
            ;Das meine ich
            If LV = 0
               V1 = AddVertex(Surf, X  , W1, Y, X  , Y)
               V2 = AddVertex(Surf, X+1, W2, Y, X+1, Y)
               LV = 1
            Else
               V1 = V2
               V2 = V3
            EndIf
            V3 = AddVertex(Surf, X  , W3, Y+1, X  , Y+1)
            V4 = AddVertex(Surf, X+1, W4, Y+1, X+1, Y+1)
            ;---
            AddTriangle(Surf, V3, V2, V1)
            AddTriangle(Surf, V2, V3, V4)
            
         Next:LV=0:Next
         SetBuffer BackBuffer():UnlockBuffer ImageBuffer(TerImg)
         
         UpdateNormals Mesh
         Return Mesh
      Else
         RuntimeError "File is not a valid Image"
      EndIf
   Else
      RuntimeError "File doesn't exist"
   EndIf
End Function

Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

;-------------------------------Boden Textur
Grass = CreateTexture(64,64,8)
SetBuffer TextureBuffer(Grass)
   ClsColor 80,130,90
   Cls
   RGB = (90 Shl 16) + (110 Shl 8) + 60
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (70 Shl 16) + (120 Shl 8) + 70
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (95 Shl 16) + (115 Shl 8) + 90
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
SetBuffer BackBuffer()

Cam = CreateCamera()
ter=Load_Terrain("Ter02.bmp")
EntityTexture ter, GRass

While Not KeyHit(1)
   YSpeed# = MouseYSpeed()
      YSpeed# = YSpeed# / 5
   XSpeed# = MouseXSpeed()
      XSpeed# = XSpeed# / 5
      
   RotateEntity Cam, EntityPitch#(Cam)+YSpeed#, EntityYaw#(Cam)-Xspeed#, 0
   If EntityPitch#(Cam) < -89.5 RotateEntity Cam, -89.5, EntityYaw(Cam),0
   If EntityPitch#(Cam) > 89.5 RotateEntity Cam, 89.5, EntityYaw(Cam),0
   
   If MouseDown(1) MoveEntity Cam, 0, 0, 1
   If MouseDown(2) MoveEntity Cam, 0, 0, -1
   
   If MouseX() < 10 Or MouseX() > 1014 Or MouseY() < 10 Or MouseY() > 758 MoveMouse 512,368
   
   RenderWorld
   Flip
Wend

End
Warbseite

Holzchopf

Meisterpacker

BeitragMo, Jan 12, 2009 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;Terrain System
;Non-LOD Terrain
Function Load_Terrain(File$, Parent=0)
   If FileType(File$) = 1
      TerImg = LoadImage(File$)
      If TerImg <> 0
         W = ImageWidth(TerImg):H = ImageHeight(TerImg)
       ; Versuchs mal so:
       Vertices = CreateBank( (W+1) *(H+1) *4 )
         Mesh = CreateMesh(Parent):Surf = CreateSurface(Mesh)
         SetBuffer ImageBuffer(TerImg):LockBuffer ImageBuffer(TerImg)
         For X = 0 To W-1:For Y = 0 To H-1
            RGB = ReadPixelFast(X  , Y  ):W1# = ((RGB And $FF0000) Shr 16) / 12.5
            V1 = AddVertex(Surf, X, W1, Y, X, Y)
            ; Alle Vertices in einer Bank speichern, brauchst ja jeden nur einmal
         PokeInt Vertices, (Y *W +X) *4, V1
         Next:Next
         For X = 0 To W-2:For Y = 0 To H-2
            ; ... Und kannst so ganz einfach auf jeden zugreifen
            V1 = PeekInt(Vertices, ((Y   ) *W +X   ) *4 )
            V2 = PeekInt(Vertices, ((Y   ) *W +X +1) *4 )
            V3 = PeekInt(Vertices, ((Y +1) *W +X   ) *4 )
            V4 = PeekInt(Vertices, ((Y +1) *W +X +1) *4 )
            AddTriangle(Surf, V1, V4, V2)
            AddTriangle(Surf, V1, V3, V4)
         Next:Next
         SetBuffer BackBuffer():UnlockBuffer ImageBuffer(TerImg)
         
         UpdateNormals Mesh
         Return Mesh
      Else
         RuntimeError "File is not a valid Image"
      EndIf
   Else
      RuntimeError "File doesn't exist"
   EndIf
End Function

Graphics3D 1024, 768, 32, 2
SetBuffer BackBuffer()

;-------------------------------Boden Textur
Grass = CreateTexture(64,64,8)
SetBuffer TextureBuffer(Grass)
   ClsColor 80,130,90
   Cls
   RGB = (90 Shl 16) + (110 Shl 8) + 60
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (70 Shl 16) + (120 Shl 8) + 70
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
   RGB = (95 Shl 16) + (115 Shl 8) + 90
   For A = 0 To 64
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
      WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB:WritePixel A,Rand(64),RGB
   Next
   
SetBuffer BackBuffer()

Cam = CreateCamera()
ter=Load_Terrain("d:\temp\Ter02.bmp")
EntityTexture ter, GRass
light = CreateLight()
AlignToVector light,1,-1,1,0

While Not KeyHit(1)
   YSpeed# = MouseYSpeed()
      YSpeed# = YSpeed# / 5
   XSpeed# = MouseXSpeed()
      XSpeed# = XSpeed# / 5
     
   RotateEntity Cam, EntityPitch#(Cam)+YSpeed#, EntityYaw#(Cam)-Xspeed#, 0
   If EntityPitch#(Cam) < -89.5 RotateEntity Cam, -89.5, EntityYaw(Cam),0
   If EntityPitch#(Cam) > 89.5 RotateEntity Cam, 89.5, EntityYaw(Cam),0
   
   If MouseDown(1) MoveEntity Cam, 0, 0, 1
   If MouseDown(2) MoveEntity Cam, 0, 0, -1
   
   If MouseX() < 10 Or MouseX() > 1014 Or MouseY() < 10 Or MouseY() > 758 MoveMouse 512,368
   
   RenderWorld
   Flip
Wend

End


Na supa, weil HTML nicht fürs Tabulatorzeichen konzipiert wurde, ist jetzt die ganze Formatierung am Arsch.
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Xaymar

ehemals "Cgamer"

BeitragDo, Jan 22, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
so, die antwort erschien bei mir erst heute...(ist zum glück ja nicht weit her und ich arbeite immer noch am terrain sys)

thx nu funzt
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group