[OpenGL] HeightMap rendern Artefakte ?!

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Mijikai
Beiträge: 690
Registriert: 25.09.2016 01:42

[OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Mijikai »

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: Alles auswählen

;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.
ccode_new
Beiträge: 1072
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von ccode_new »

Hallo Mijikai,

du hast keinen Tiefenpuffer!

Try this:

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

..and all is well
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
Benutzeravatar
Mijikai
Beiträge: 690
Registriert: 25.09.2016 01:42

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Mijikai »

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.)
ccode_new
Beiträge: 1072
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von ccode_new »

Ja, nach 180 Grad kippt das Ganze.

Mit POINTS sieht es aber ganz nett aus. Da fehlen dann nur die Verbindungen ;)
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Jan125 »

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. :/
Wer braucht schon Unicode? PB5.24LTS
Benutzeravatar
Mijikai
Beiträge: 690
Registriert: 25.09.2016 01:42

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Mijikai »

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).
Jan125
Beiträge: 31
Registriert: 23.06.2013 06:26
Computerausstattung: Nicht lachen. Atom Z3775, 2GiB RAM, Win8.1.

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Jan125 »

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.
Wer braucht schon Unicode? PB5.24LTS
ccode_new
Beiträge: 1072
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von ccode_new »

So ähnlich soll es ja grundsätzlich funktionieren:

heightmap

Von Blend-Funktionen keine Spur. Aber Beleuchtung!!!
//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);
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
Benutzeravatar
Mijikai
Beiträge: 690
Registriert: 25.09.2016 01:42

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von Mijikai »

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:
ccode_new
Beiträge: 1072
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [OpenGL] HeightMap rendern Artefakte ?!

Beitrag von ccode_new »

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.
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.7 / Android 7.0 ;)

Manchmal muß das Rad neu erfunden werden.
Antworten