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
|