Tuossa pätkässä asetat joka ikiselle kolmiolle oman matriisin, mikä aiheuttaa valtavan hitauden.
Ja niiden päällekkäisyys ei nopeuta tuota juuri lainkaan, ellei sinulla ole valtavan monimutkaista fragment shaderia jossain kätkössä.
Pistetäänpä vielä esimerkkinä joskus cbGL:ää kokeillessani tekemäni kleinin pullo. Tähän suuntaan kehitä jotain, mutta ei näin monimutkaista kaavaa, ettei esilaskenta kasva tuhottoman pitkäksi. Voisihan tuota display listiäkin tietty loopissa piirrustaa.
Code: Select all
Include "glConsts.cb"
Include "cbGL.cb"
cbglInit(640, 480)
' ReSizeGLScene
cbgl4i(glViewport, 0, 0, 640, 480)
cbgl1i(glMatrixMode, GL_PROJECTION)
cbgl0(glLoadIdentity)
cbgl4f(gluPerspective, 45.0, Float(640)/Float(480), 0.1, 100.0)
cbgl1i(glMatrixMode, GL_MODELVIEW)
cbgl0(glLoadIdentity)
cbgl1i(glShadeModel, GL_SMOOTH)
cbgl4f(glClearColor, 0.0, 0.0, 0.0, 0.0)
cbgl1f(glClearDepth, 1.0)
cbgl1i(glEnable, GL_DEPTH_TEST)
cbgl1i(glDepthFunc, GL_LEQUAL)
Function getvert(u#, v#, num%)
a# = Sqrt((Cos(u#)-Cos(2.0*u#))*(Cos(u#)-Cos(2.0*u#)) + (3.0*Sin(u#))*(3.0*Sin(u#)))
r# = (1.0 + .2*Sin(u#))
Select num
Case 0: Return (Sin(u#) - 0.5 * Sin(2.0*u#)+3.0*r#*Sin(u#)*Cos(v#)/a#)
Case 1: Return -(-3.0*Cos(u#) + r#*(Cos(2.0*u#)-Cos(u#))*Cos(v#)/a#)
Case 2: Return (r#*Sin(v#))
EndSelect
EndFunction
cbgl2i(glNewList, 1, GL_COMPILE)
cbgl1i(glBegin, GL_TRIANGLES)
u# = 0
du# = 4
dv# = 4
Repeat
v# = 0
Repeat
cbgl3f(glColor, .5*(1+Sin(u)), .5*(1+Sin(v)), .25(2+Cos(u)+Cos(v)))
cbgl3f(glVertex, getvert(u, v, 0), getvert(u, v, 1), getvert(u, v, 2))
cbgl3f(glVertex, getvert(u+du, v, 0), getvert(u+du, v, 1), getvert(u+du, v, 2))
cbgl3f(glVertex, getvert(u, v+dv, 0), getvert(u, v+dv, 1), getvert(u, v+dv, 2))
cbgl3f(glVertex, getvert(u+du, v+dv, 0), getvert(u+du, v+dv, 1), getvert(u+du, v+dv, 2))
cbgl3f(glVertex, getvert(u+du, v, 0), getvert(u+du, v, 1), getvert(u+du, v, 2))
cbgl3f(glVertex, getvert(u, v+dv, 0), getvert(u, v+dv, 1), getvert(u, v+dv, 2))
v = v + dv
Until v >= 360
u = u + du
Until u >= 360
cbgl3f(glColor, 1.0, 0.0, 0.0)
cbgl3f(glVertex, 0.0, 1.0, 0.0)
cbgl0(glEnd)
cbgl0(glEndList)
SAFEEXIT OFF
Repeat
cbgl1i(glClear, GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT)
ang# = WrapAngle(ang#+0.2)
cbgl0(glLoadIdentity)
cbgl3f(glTranslate, 0.0, 0.0, -11.0)
cbgl4f(glRotate, ang, 0.0, 1.0, 0.0)
cbgl1i(glCallList, 1)
cbglFlip()
Until cbglKeyDown(1)
cbglTerminate()
End