Français
Source/ Codesnippets

OpenGL glDrawArrays: très viele Objekte vite zeichnen

 

Sven
Bader
qui Methode ist pas aktuell, venez pour mais avec dem zugänglichen Befehlssatz aus. Heutzutage verwendet on VBOs (vertex buffer objects). L'idée ist qui gleiche mais dans mon Beispiel avec glDrawArrays wird anstatt den Video-RAM qui herkömmliche Arbeitsspeicher verwendet. toutefois ist es um un vielfaches plus rapide comme z.B. une oGL("DrawList", N) avec tausenden oGL("Sphere", ...) y.

je speichere Vertex-données (Punkte) de Kugeln dans une Bereich, quel ensuite dans einem Arbeitsgang jeden Frame dargestellt wird. sans Texturkoordinaten ou bien sans Normalen ca va encore plus rapide. chez einer schnellen Grafikkarte scheint ici cela einzige Nadelöhr qui RAM trop son.

attention: qui lettre initiale Erstellung dauert möglicherweise très long, après laisser sich mais plusieurs mille Kugeln avec hoher Framerate représenter.





dessus im Code peut testweise Normalen et Textur ausgeschaltet volonté:
usetex& = 1
usenormal& = 1

ici qui verwendete Textur (à cela XProfan Icon angelehnt):



ici cela ganze Listing. si on qui Funktion pour qui Kugel et qui Contribution-Abfrage ausklammert, ist qui Code très überschaubar.
 $H windows.ph
 $H opengl.ph
Déclarer tex&[5]
Déclarer xrot!, yrot!, zrot!, xpos!, ypos!, zpos!,xsrot!,ysrot!,zsrot!,xspos!,yspos!,zspos!
Déclarer smooth%,mb&,mousestartx%,mousestarty%,mousex%,mousey%
Déclarer ende%,hPic&
Déclarer sphere&,frame&,time&,fps&, usetex&,usenormal&
usetex& = 1
usenormal& = 1
declare vertex#,normal#,texture#,count&
Faible vertex#         ,200000000
Faible normal#         ,200000000
Faible texture#         ,(200000000/3*2)

proc Sphere

    parameters px!,py!,pz!,fRadius!, iStacks%,iSlices%
    declare t1a!, t1b!, n1a!, n1b!, n1c!, v1a!, v1b!, v1c!, t2a!, t2b!, n2a!, n2b!, n2c!, v2a!, v2b!, v2c!
    declare PI!,PIx2!,drho!,dtheta!,ds!,dt!,t!,s!,x!,y!,z!
    declare rho!,srho!,crho!,srhodrho!,crhodrho!
    declare theta!,stheta!,ctheta!,i%,j%,k%
    PI! =  Pi()
    PIx2! = Pi() * 2.0
    drho! = PI! / iStacks%
    dtheta! = PIx2! / iSlices%
    ds! = 1.0 / iSlices%
    dt! = 1.0 / iStacks%
    t! = 1.0
    s! = 0.0
    k% = 0

    whileloop 0, (iStacks%-1)

        i% = &loop
        rho! = i% * drho!
        srho! =  sin(rho!)
        crho! = cos(rho!)
        srhodrho! = sin(rho! + drho!)
        crhodrho! = cos(rho! + drho!)
        s! = 0.0

        whileloop  0, iSlices%

            inc k%
            j% = &loop
            theta! = si(j% = iSlices%, 0.0, j% * dtheta!)
            stheta! = -sin(theta!)
            ctheta! = cos(theta!)
            x! = stheta! * srho!
            y! = ctheta! * srho!
            z! = crho!

            si   (j% > 1)

                Float vertex#,(count&*24)  = v1a!,v1b!,v1c!
                cas usetex& : Float texture#,(count&*16) = t1a!,t1b!
                cas usenormal& : Float normal#,(count&*24)  = n1a!,n1b!,n1c!
                inc count&
                Float vertex#,(count&*24)  = v2a!,v2b!,v2c!
                cas usetex& : Float texture#,(count&*16) = t2a!,t2b!
                cas usenormal& : Float normal#,(count&*24)  = n2a!,n2b!,n2c!
                inc count&

            endif

            v1a! = (x! * fRadius!)+px!
            v1b! = (y! * fRadius!)+py!
            v1c! = (z! * fRadius!)+pz!
            t1a! = s!
            t1b! = t!
            n1a! = x!
            n1b! = y!
            n1c! = z!
            Float vertex#,(count&*24)  = (x! * fRadius!)+px!,(y! * fRadius!)+py!, (z! * fRadius!)+pz!
            cas usetex& : Float texture#,(count&*16) = s!,t!
            cas usenormal& : Float normal#,(count&*24)  = x!,y!,z!
            inc count&
            x! = stheta! * srhodrho!
            y! = ctheta! * srhodrho!
            z! = crhodrho!

            si   (j% > 0)

                Float vertex#,(count&*24)  = v1a!,v1b!,v1c!
                cas usetex& : Float texture#,(count&*16) = t1a!,t1b!
                cas usenormal& : Float normal#,(count&*24)  = n1a!,n1b!,n1c!
                inc count&
                Float vertex#,(count&*24)  = v2a!,v2b!,v2c!
                cas usetex& : Float texture#,(count&*16) = t2a!,t2b!
                cas usenormal& : Float normal#,(count&*24)  = n2a!,n2b!,n2c!
                inc count&

            endif

            t2a! = s!
            t2b! = (t! - dt!)
            n2a! = x!
            n2b! = y!
            n2c! = z!
            v2a! = (x! * fRadius!)+px!
            v2b! = (y! * fRadius!)+py!
            v2c! = (z! * fRadius!)+pz!
            cas usetex& : Float texture#,(count&*16 ) = t2a!,t2b!
            s! = s! + ds!
            cas usenormal& :  Float normal#,(count&*24)  = n2a!,n2b!,n2c!
            Float vertex#,(count&*24)  = v2a!,v2b!,v2c!
            inc count&

        endwhile

        t! = t! - dt!

    endwhile

endproc

Proc MouseKeyboard

    mousex% = %MouseX
    mousey% = %MouseY

    si mb& = 0

        cas isKey(~VK_LBUTTON) : mb& = 1
        cas isKey(~VK_RBUTTON) : mb& = 2

    endif

    si (not(isKey(~VK_RBUTTON)) & not(isKey(~VK_LBUTTON)))

        'Startposition pour rotieren et Zoomwen wieder nullen
        mb& = 0
        mousestartx% = %mousex
        mousestarty% = %mousey
        xsrot! = xrot!
        ysrot! = yrot!
        zspos! =  zpos!

    endif

    'Tastaturrotation
    cas isKey(~VK_LEFT)  : yrot! = yrot! - 1.0
    cas isKey(~VK_RIGHT) : yrot! = yrot! + 1.0
    cas isKey(~VK_UP)    : xrot! = xrot! + 1.0
    cas isKey(~VK_DOWN)  : xrot! = xrot! - 1.0
    'Mausrotation

    si (mb& = 1)

        yrot! = ysrot! - (mousestartx% - %mousex) * 0.4
        xrot! = xsrot! - (mousestarty% - %mousey) * 0.4

    endif

    'Mauszoom

    si (mb& = 2) & (abs(mousestarty% - %mousey) > 10)

        zpos! = zspos! + (mousestarty% - %mousey) * 0.03
        'si par-dessus hinaus bewegt wurde, soll es beim Richtungswechsel quand même direct arriéré aller
        'Unschöner Hack, le calcul wäre qui feinere Weg ...

        tandis que (zpos! > -2.0)

            dec mousestarty%
            zpos! = zspos! + (mousestarty% - %mousey) * 0.03

        endwhile

        tandis que (zpos! < -15.0)

            inc mousestarty%
            zpos! = zspos! + (mousestarty% - %mousey) * 0.03

        endwhile

    endif

    'Tastaturzoom
    cas isKey(~VK_SUBTRACT)     : zpos! = zpos! - 0.06
    cas isKey(~VK_ADD)    : zpos! = zpos! + 0.06
    'Zoom begrenzen
    cas (zpos! > -2.0)  : zpos! = -2.0
    cas (zpos! < -15.0) : zpos! = -15.0
    'Sonstige Tastatureingaben
    cas IsKey(27) : Ende% = 1

ENDPROC

Proc DrawGLScene

    oGL("Clear")
    ogl("Origin",0,0,-0.2)
    oGL("Move", xpos!, ypos!, zpos!)
    oGL("Rotate", xrot!,yrot!,zrot!)
    oGL("glDrawArrays",~GL_TRIANGLES, 0 ,count&-1)'mode, first, count
    oGL("Show")

ENDPROC

' Hauptprogramm
' -------------
style de fenêtre 1+2+4+8+16
windowtitle "Sphere"
window (%maxx *  0.5 -480), (%maxy *  0.5 - 300) - 960,600'kompatible Schreibweise
UseIcon "Gesicht"
oGL("Init", %hWnd, 1,1,1,1)
oGL("PosMode",1)
oGL("glEnable", ~GL_CULL_FACE)
'oGL("glShadeModel", ~GL_FLAT)
cas usetex& : oGL("glEnableClientState",~GL_TEXTURE_COORD_ARRAY_EXT)
cas usenormal& : oGL("glEnableClientState",~GL_NORMAL_ARRAY_EXT)
oGL("glEnableClientState",~GL_VERTEX_ARRAY_EXT)
cas usetex& : oGL("glTexCoordPointer",2,~GL_DOUBLE,0,texture#)
cas usenormal& : oGL("glNormalPointer",~GL_DOUBLE,0,normal#)
oGL("glVertexPointer",3,~GL_DOUBLE,0,vertex#)
hPic&=create(«PCSI»,-1,"smile.png")
tex&[1]=ogl("getTextureBmp",hPic&,2)
DeleteObject hPic&
oGL("Texture",tex&[1],1)
'oGL("Texture",0,1)

whileloop 0, 500

    'Sphere(X, Y, Z, Taille, Scheiben, Segmente)
    Sphere((rnd(1000)-500)*0.01,(rnd(1000)-500)*0.01,(rnd(1000)-500)*0.01,0.05,6,6)

endwhile

zpos! = -5
xrot! = -90
yrot! = 0
time& = &gettickcount

WhileNot ende%

    si (frame& MOD 100 = 0)

        time& = ((&gettickcount - time&) * 0.01) + 1
        fps& =  1000 / time&
        setText %hWnd, str$(fps&) + " fps"
        time& = &gettickcount

    endif

    MouseKeyboard()
    DrawGLScene()
    inc frame&

Endwhile

oGL("Done")
Fin

342 kB
Hochgeladen:16.09.2021
Downloadcounter70
Download
339 kB
Hochgeladen:16.09.2021
Downloadcounter57
Download
12 kB
Hochgeladen:16.09.2021
Downloadcounter56
Download
 
16.09.2021  
 



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

1.399 Views

Untitledvor 0 min.
Sven Bader02.02.2023
Ernst29.05.2022
p.specht18.11.2021
Peter Max Müller18.11.2021
plus...

Themeninformationen

cet Thema hat 1 participant:

Sven Bader (1x)


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie