PureBoard
https://www.purebasic.fr/german/

[OpenGL] HeightMap rendern Artefakte ?!
https://www.purebasic.fr/german/viewtopic.php?f=4&t=30792
Seite 1 von 2

Autor:  Mijikai [ 30.04.2018 14:53 ]
Betreff des Beitrags:  [OpenGL] HeightMap rendern Artefakte ?!

Ich versuche gerade mit OpenGL HeighMaps anzuzeigen.
Leider gibt es beim rotieren Artefakte !? :?

Irgendwas ist noch falsch! :coderselixir:

Je nach Blickrichtung sieht es anders aus (einmal wird Alpha einfach ignoriert !?):

Bild

Hier mein Code zum Testen:

Code:
;PB v.5.62 x64

UsePNGImageDecoder()

Procedure.i HeightMap(*Buffer)
  Structure COLOR_STRUCT
    StructureUnion
      Value.l
      RGBA.a[4]
    EndStructureUnion
  EndStructure
  Protected Image.i
  Protected Width.i
  Protected Height.i
  Protected XX.i
  Protected YY.i
  Protected X.f
  Protected Y.f
  Protected Value1.a
  Protected Value2.a
  Protected Color.COLOR_STRUCT
  Image = CatchImage(#PB_Any,*Buffer)
  If IsImage(Image)
    If StartDrawing(ImageOutput(Image))
      Width = ImageWidth(Image)
      Height = ImageHeight(Image)
      glEnable_(#GL_DEPTH_TEST)
      For XX = 1 To Width - 1
        glBegin_(#GL_TRIANGLE_STRIP)
        For YY = 1 To Height - 1
          X = XX - Width / 2
          Y = YY - Height / 2
          Color\Value = Point(XX - 1,YY - 1)
          Value1 = (Color\RGBA[0] + Color\RGBA[1] + Color\RGBA[2]) / 3
          glColor4ub_(Value1,Value1,Value1,155)
          glVertex3f_(X - 1,Y - 1,Value1-100)
          Color\Value = Point(XX,YY)
          Value2 = (Color\RGBA[0] + Color\RGBA[1] + Color\RGBA[2]) / 3
          glColor4ub_(Value2,Value2,Value2,155)
          glVertex3f_(X,Y,Value2-100)
        Next
        glEnd_()
      Next
      glDisable_(#GL_DEPTH_TEST)
      StopDrawing()
    EndIf
    FreeImage(Image)
  EndIf
EndProcedure

Procedure.i Test()
  Protected Texture1.i
  Protected Texture2.i
  Protected OpenGL.i
  Protected Tick.f
  If OpenWindow(0,0,0,400,400,"TestWindow",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If OpenGLGadget(1,0,0,400,400,#PB_OpenGL_NoDepthBuffer)
      glShadeModel_(#GL_SMOOTH)
      glEnable_(#GL_BLEND)
      glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA)
      glMatrixMode_(#GL_PROJECTION)
      glLoadIdentity_()
      glOrtho_(0,400,400,0,-1000,1000)
      glMatrixMode_(#GL_MODELVIEW)
      glLoadIdentity_()
      glClearColor_(0.8,0.1,0.1,1)         
      Repeat
        If Tick > 358
          Tick = 0
        Else
          Tick + 1
        EndIf
        glClear_(#GL_COLOR_BUFFER_BIT|#GL_DEPTH_BUFFER_BIT)
        glLoadIdentity_()
        glTranslatef_(200,190,0)
        glScalef_(0.8,0.8,0.8)
        glRotatef_(45,1,0,0)
        glRotatef_(Tick,0,0,1)
        HeightMap(?HeightMap)
        SetGadgetAttribute(1,#PB_OpenGL_FlipBuffers,#True)
      Until WindowEvent() = #PB_Event_CloseWindow
    EndIf
  EndIf
EndProcedure

Test()

DataSection
  HeightMap:
  ;{ Size: 1538 Bytes
  !dw 05089h, 0474Eh, 00A0Dh, 00A1Ah, 00000h, 00D00h, 04849h, 05244h, 00000h, 0AC01h, 00000h, 01A01h, 00208h, 00000h, 0C200h, 0F439h, 00093h, 00000h, 07009h, 05948h, 00073h, 00E00h, 000C4h, 00E00h, 001C4h, 02B95h, 01B0Eh, 00000h, 0B405h, 04449h, 05441h, 0DA78h, 0DDEDh, 075C1h, 040A2h, 08000h, 064E1h, 0169Fh, 021E3h, 06034h
  !dw 0D407h, 01F61h, 07D89h, 08758h, 0D81Dh, 03980h, 08C58h, 03D97h, 0BDE4h, 09F3Ch, 01C46h, 00660h, 09986h, 0BBEFh, 01BADh, 07104h, 077F9h, 09046h, 0BDBCh, 00001h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 0EA64h, 0D87Dh, 0DB62h, 0B6EDh, 05DF8h, 03A73h, 0069Dh, 05B2Fh
  !dw 0FEC3h, 03281h, 0E70Eh, 0F67Fh, 0500Eh, 01133h, 04404h, 04010h, 00104h, 0B42Ah, 0F28Ah, 0632Ch, 021CEh, 0C914h, 0810Eh, 08579h, 09C9Fh, 01234h, 04C04h, 00187h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h
  !dw 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 0ACBAh, 0BA16h, 09FDDh, 09F9Fh, 0BF95h
  !dw 0FB73h, 0DEFDh, 05F3Fh, 037A8h, 02F82h, 07D7Dh, 0BD7Dh, 0047Ch, 074C0h, 01018h, 00041h, 00411h, 04110h, 01100h, 0A804h, 04546h, 08767h, 0B30Bh, 0EDDBh, 03D12h, 0E1F3h, 09870h, 0A5F7h, 0CF9Dh, 04767h, 000E6h, 0D34Dh, 009D8h, 08246h, 02200h, 02008h, 00082h, 00822h, 0C2F0h, 02ECAh, 0A858h, 0E5CBh, 0EB12h, 036A9h, 08D9Bh
  !dw 089FDh, 02091h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 012C0h, 0B3B8h, 01434h, 0C662h, 0555Fh, 0E8BAh, 0F6DFh, 02469h, 09808h, 0030Eh, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h
  !dw 08020h, 00208h, 0C694h, 0E6D7h, 0CEA8h, 0BD7Ah, 06ACEh, 0AE7Bh, 0ABD7h, 0C537h, 01048h, 00440h, 04401h, 04010h, 00104h, 0E226h, 008C4h, 09BB5h, 0BCFEh, 06E44h, 06667h, 07044h, 0F691h, 0FDFBh, 083E3h, 0DDBBh, 0F6EEh, 0978Fh, 0C5CBh, 00C1Bh, 00E98h, 09803h, 0430Eh, 01F54h, 01F1Fh, 08F77h, 07F7Ch, 0DB7Fh, 0222Dh, 03508h
  !dw 0EFE6h, 071EEh, 03435h, 0861Dh, 0F362h, 0ACF7h, 02180h, 04495h, 0A104h, 001C0h, 00EA0h, 0208Ah, 0A028h, 08A0Eh, 02820h, 00EA0h, 0208Ah, 00880h, 08802h, 05420h, 0173Fh, 02336h, 04116h, 01100h, 01004h, 00041h, 08411h, 01A45h, 01DF9h, 05F38h, 013A1h, 08041h, 095ACh, 0037Ch, 0CD85h, 0E366h, 0060Dh, 08DEAh, 0C420h, 0119Ah
  !dw 0BB0Fh, 065D2h, 0B9E2h, 0D370h, 0DE34h, 0D32Ch, 04861h, 0C1D5h, 00BCCh, 00888h, 04642h, 0541Dh, 01140h, 07A84h, 0A83Bh, 0CB80h, 0D452h, 08267h, 0C387h, 03BC1h, 034CAh, 0741Dh, 07D7Bh, 00411h, 0C435h, 01874h, 00440h, 04401h, 04010h, 00104h, 01044h, 00440h, 04401h, 04010h, 00104h, 0E672h, 06962h, 0B76Ah, 0AF5Eh, 004EDh
  !dw 04123h, 01100h, 01004h, 00041h, 00411h, 085A8h, 02313h, 0E754h, 0BD7Ah, 009DAh, 00918h, 08802h, 02020h, 07682h, 02001h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h
  !dw 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 08300h, 0ECADh, 07202h, 034D3h, 09D8Dh, 09180h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h
  !dw 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 02088h, 00880h, 08802h, 08020h, 00208h, 00822h, 0AB50h, 07EE9h, 070EFh, 0B6DBh, 07F1Dh, 03C7Bh, 05F1Eh, 0D82Eh, 033F1h, 03F21h, 0783Ch, 05E03h, 0FB2Eh, 049ECh, 0ACC6h, 07BB1h, 0C21Bh, 0FD97h, 01B73h, 05CFEh, 0D87Ch, 01E7Eh, 08AF3h
  !dw 0AEA0h, 08608h, 0541Ch, 01E33h, 0D345h, 0406Fh, 035AFh, 05606h, 07038h, 0B691h, 0076Dh, 0D2BFh, 0A7EEh, 04295h, 0874Ch, 08E13h, 08B16h, 080DCh, 06B44h, 0F14Ch, 06DB4h, 086DBh, 0ED3Ch, 06FECh, 0E422h, 0123Eh, 03BECh, 09D51h, 00378h, 047BAh, 0C349h, 03986h, 0D663h, 0F778h, 03F3Ch, 0760Bh, 0D22Fh, 0713Dh, 0B28Eh, 067B7h
  !dw 0137Fh, 0A8A1h, 0E091h, 011EDh, 0CB35h, 034B1h, 00CFDh, 078EEh, 08E3Ch, 05CFCh, 0F06Fh, 0EAEBh, 0EAB5h, 0B0C0h, 07E0Eh, 0105Ah, 0D9C1h, 09432h, 006DBh, 03CE4h, 00F73h, 0273Fh, 08523h, 02088h, 002A9h, 013F4h, 07997h, 02313h, 08870h, 04620h, 0208Bh, 07A82h, 06311h, 0BD75h, 0CBAEh, 073FBh, 0F638h, 09B6Ch, 07EE3h, 03AC6h
  !dw 03B78h, 01161h, 0BAF2h, 0304Eh, 0B587h, 038A7h, 03BD4h, 05D5Eh, 045E0h, 063DAh, 0CAB6h, 07BE5h, 07B90h, 05304h, 02837h, 09256h, 02E46h, 0A53Bh, 08BDFh, 0A469h, 0B210h, 0608Bh, 01DB6h, 06599h, 021EDh, 00917h, 0FE3Eh, 0C840h, 08305h, 08F3Fh, 0A63Fh, 00750h, 0C721h, 070E9h, 083D9h, 0EE94h, 0EAEFh, 00B3Eh, 0C453h, 09AABh
  !dw 0AEEFh, 036CDh, 08424h, 022BCh, 0F138h, 03901h, 0BCE6h, 0C441h, 0BD4Dh, 0B19Dh, 0FC8Eh, 06F32h, 058E0h, 0C9D2h, 0C862h, 08222h, 07DB9h, 0F676h, 0875Bh, 0A7E9h, 08F8Ah, 0DC9Fh, 0FDF5h, 06100h, 0EC96h, 04942h, 0225Ch, 02493h, 0D937h, 0C96Eh, 0B3F8h, 020CCh, 00582h, 0FA5Ah, 02898h, 09E69h, 0180Ch, 01D31h, 0E8CEh, 08F50h
  !dw 0EB72h, 065D3h, 02D45h, 097ABh, 0126Ch, 0918Dh, 0CCE0h, 0B4C3h, 07797h, 05CF4h, 0A4D6h, 0E5EFh, 086BAh, 0EEDDh, 07025h, 0452Fh, 00B7Fh, 082DEh, 039EFh, 02208h, 03918h, 0E31Ch, 0BC0Fh, 007E9h, 07138h, 0112Fh, 0BC7Fh, 0F01Eh, 09F71h, 0FD24h, 0427Fh, 030FEh, 04E1Dh, 0183Bh, 0BC7Ch, 02DD2h, 0CE5Dh, 0263Ah, 0C37Dh, 0DD56h
  !dw 0A96Bh, 05F5Eh, 0EB95h, 0BF3Eh, 0B11Ch, 0BD4Ah, 002DEh, 01230h, 03B4Ch, 04E29h, 0C054h, 03E59h, 08AEDh, 0D2BEh, 06B90h, 06306h, 01FDDh, 09F3Bh, 008DDh, 08F85h, 06F04h, 0AE8Fh, 07E62h, 059CFh, 06DF4h, 01DFEh, 0A6C0h, 051DBh, 017DDh, 0CB5Dh, 04B1Fh, 03EF4h, 0B16Ch, 076EDh, 0FB7Bh, 0D3C7h, 064E9h, 00257h, 008F9h, 0946Fh
  !dw 004EBh, 0AA81h, 02089h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 00822h, 08220h, 02200h, 02008h, 00082h, 08865h, 02B73h, 0BBADh, 0361Bh, 01800h, 00209h, 02088h, 00880h, 08802h, 00020h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 00000h, 02300h, 007FDh, 0D693h
  !dw 06CD1h, 0D481h, 05AEDh, 00000h, 00000h, 04549h, 0444Eh, 042AEh, 08260h
  ;}
EndDataSection


Später wenn es ohne Artefakte funktioniert muss ich das ganze noch in eine Liste bringen um
es schneller/ besser zu rendern.

Autor:  ccode_new [ 30.04.2018 17:28 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

Hallo Mijikai,

du hast keinen Tiefenpuffer!

Try this:

OpenGLGadget(1,0,0,400,400,#PB_OpenGL_24BitDepthBuffer)

..and all is well

Autor:  Mijikai [ 30.04.2018 18:26 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

ccode_new hat geschrieben:
Hallo Mijikai,

du hast keinen Tiefenpuffer!

Try this:

OpenGLGadget(1,0,0,400,400,#PB_OpenGL_24BitDepthBuffer)

..and all is well


Das ändert leider nichts.
(Momentan vermute ich das die Triangles der HeighMap falsch erstellt werden.)

Autor:  ccode_new [ 30.04.2018 19:14 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

Ja, nach 180 Grad kippt das Ganze.

Mit POINTS sieht es aber ganz nett aus. Da fehlen dann nur die Verbindungen ;)

Autor:  Jan125 [ 30.04.2018 20:36 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

OpenGL ist in dem Sinne dumm, dass man die einzelnen Primitives manuell sortieren muss.
Da du hier das Bild xyStart->xyEnde abarbeitest findet keine Sortierung statt, ergo wird das Ganze falsch dargestellt. :/

Autor:  Mijikai [ 30.04.2018 21:13 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

Jan125 hat geschrieben:
OpenGL ist in dem Sinne dumm, dass man die einzelnen Primitives manuell sortieren muss.
Da du hier das Bild xyStart->xyEnde abarbeitest findet keine Sortierung statt, ergo wird das Ganze falsch dargestellt. :/


OpenGL ist nicht dumm... es wird sortiert -> #GL_DEPTH_TEST!

Der Fehler liegt woanders :(

Evtl. werden die Triangles falsch aufgebaut oder es ist ein Blending-Problem...

(leider hab ich bis jetzt nur c++ Tutorials zu diesem Thema gefunden welche mir
nicht wirklich helfen da ich den Code nicht verstehe/konvertieren kann).

Autor:  Jan125 [ 30.04.2018 22:05 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

GL_DEPTH_TEST sortiert nicht, es gibt lediglich an, dass der Tiefenbuffer mit der gewünschten Funktion auf zukünftige Renderbefehle angewendet wird. Basiert wohl auf einem simplen 2D-Array.

Sobald ein Polygon gerendert wird fallen alle dahinter liegenden Polygone an der Stelle aus, sofern sie nach diesem Polygon gerendert werden.

Autor:  ccode_new [ 30.04.2018 23:25 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

So ähnlich soll es ja grundsätzlich funktionieren:

heightmap

Von Blend-Funktionen keine Spur. Aber Beleuchtung!!!

Zitat:
//Init
glEnable(GL_DEPTH_TEST)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_NORMALIZE)
glShadeModel(GL_SMOOTH)

//Draw
GLfloat ambientColor[] = {0.4f, 0.4f, 0.4f, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);
GLfloat lightColor0[] = {0.6f, 0.6f, 0.6f, 1.0f};
GLfloat lightPos0[] = {-0.5f, 0.8f, 0.1f, 0.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);

Autor:  Mijikai [ 01.05.2018 17:34 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

Jan125 hat geschrieben:
GL_DEPTH_TEST sortiert nicht, es gibt lediglich an, dass der Tiefenbuffer mit der gewünschten Funktion auf zukünftige Renderbefehle angewendet wird. Basiert wohl auf einem simplen 2D-Array.

Sobald ein Polygon gerendert wird fallen alle dahinter liegenden Polygone an der Stelle aus, sofern sie nach diesem Polygon gerendert werden.


Da hab ich wohl was falsch verstanden :oops:
Ich hab mal manuelles Z-Sorting mit OpenGL Sprites (Textures) getestet - es funktioniert!
Werde wohl eine Sprite-Engine schreiben :D

Sprites in OpenGL (Sorted Layers/Rotation/Blending...):
Bild

Jetzt aber zurück zur HeighMap:
Nun gilt es herausfinden wie ich diese an eine Liste binde um schnelleres
rendern zu ermöglichen.
Auch das Sortieren der Vertices hab ich noch nicht wirklich kapiert. :coderselixir:

Autor:  ccode_new [ 01.05.2018 18:04 ]
Betreff des Beitrags:  Re: [OpenGL] HeightMap rendern Artefakte ?!

Toll!

Ich übe mich auch weiter in OpenGL ein.

Ich finde auch das DGL-Wiki ganz nett. (Ist zwar für Pascal/Delphi , aber OpenGL ist ja einheitlich.)

OpenGL-Tutorials, etc.

Auch diese Smartphone-App ist ganz toll:

Reference Manual

Die OpenGL-Möglichkeiten: Licht, Blendung, Verschieben/Manipulieren von Matrixen, OpenGL-Culling(Also alles hat 2 Seiten), Texturemapping, erweiterten GL-Befehlen( glu (also Disc, Sphere, ...) , glut (Tastatur, Maus, etc)) , und vielem mehr ...
..finde ich schon toll.

Ich werde mich da auf jedem Fall weiter mit beschäftigen.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/