Are display lists slower than just spitting out geometry?
The above code would suggest so.... Strange, they say display lists are faster.
Framework brl.GLGraphics Import brl.bmploader Import brl.max2d Global ScreenWidth:Int=800 Global ScreenHeight:Int=600 Global ScreenDepth:Int=0 Global box:Int ' Storage For The Box Display List Global top:Int ' Storage For The Top Display List Global xrot:Float ' Rotates Cube On The X Axis Global yrot:Float ' Rotates Cube On The Y Axis Global ListDraw:Int=1 Global Keytrig:Int=0 Global boxcol:Float[]=[1.0,0.0,0.0,1.0,0.5,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0] Global topcol:Float[]=[0.5,0.0,0.0,0.5,0.25,0.0,0.5,0.5,0.0,0.0,0.5,0.0,0.0,0.5,0.5] Global Checkimage:Byte[128,128,3] Global Texname:Int ' Storage for 1 texture Global FPS_Array:Int[50] GLGraphics(ScreenWidth,ScreenHeight,ScreenDepth,0,gl_BACKBUFFER | gl_DEPTHBUFFER) ' | gl_FULLSCREEN) '(0) InitGl() ' false While Not KeyHit(KEY_ESCAPE) nehe12() glDisable(GL_TEXTURE_2D) glDisable(GL_DEPTH_TEST) glDisable(GL_LIGHT0) glDisable(GL_LIGHTING) glDisable(GL_COLOR_MATERIAL) glColor3f(1.0,1.0,1.0) 'Framecounter-------------------------------------------- NewFrameTime = MilliSecs() FPSTime = NewFrameTime - OldFrameTime If FPSTime = 0 Then FPSTime = 1000 Else FPSTime = 1000/FPSTime OldFrameTime = MilliSecs() FPSTotal=0 For A = 1 To 49 FPS_Array[A-1] = FPS_Array[A] FPSTotal = FPSTotal + FPS_Array[A] Next FPS_Array[49] = FPSTime FPSTotal = FPSTotal + FPSTime NewFPSTime = FPSTotal / 50 GLDrawText("FPS : "+NewFPSTime +" List:"+ListDraw,ScreenWidth-(8*18),ScreenHeight-16-8) '-------------------------------------------------------- GLDrawText("NeHe's Display List Tutorial (lesson 12)",10,24) glEnable(GL_TEXTURE_2D ) glEnable(GL_DEPTH_TEST) glEnable(GL_LIGHT0) glEnable(GL_LIGHTING) glEnable(GL_COLOR_MATERIAL) Flip Wend End Function InitGl() LoadGlTextures() ' Load The Texture(s) BuildLists() glEnable GL_TEXTURE_2D ' Enable Texture Mapping glClearColor(0.0, 0.0, 0.0, 0.5) ' This Will Clear The Background Color To Black glClearDepth 1.0 ' Enables Clearing Of The Depth Buffer glDepthFunc GL_LESS ' The Type Of Depth Test To Do glEnable GL_DEPTH_TEST ' Enables Depth Testing glShadeModel(GL_SMOOTH) ' Enables Smooth Color Shading glEnable(GL_LIGHT0) ' Quick And Dirty Lighting (Assumes Light0 Is Set Up) glEnable(GL_LIGHTING) ' Enable Lighting glEnable(GL_COLOR_MATERIAL) ' Enable Material Coloring glViewport(0,0,ScreenWidth,ScreenHeight) ' Set viewport glMatrixMode(GL_PROJECTION) glLoadIdentity() ' Reset The Projection Matrix gluPerspective(45.0,Float(ScreenWidth)/Float(ScreenHeight),0.5,100.0) ' Calculate The Aspect Ratio Of The Window glMatrixMode(GL_MODELVIEW) End Function Function LoadGlTextures() Local PointeurImg:Byte Ptr Local TexWidth Local TexHeight tex01:TPixmap=LoadPixmap("data\cube.bmp") TexWidth=tex01.Width TexHeight=tex01.Height PointeurImg=PixmapPixelPtr(tex01,0,0) pp=0 For y=TexHeight-1 To 0 Step -1 For x=0 To TexWidth-1 Checkimage[y,x,0]=PointeurImg[pp] Checkimage[y,x,1]=PointeurImg[pp+1] Checkimage[y,x,2]=PointeurImg[pp+2] pp=pp+3 Next Next ' Create Texture glGenTextures 1, Varptr Texname glBindTexture GL_TEXTURE_2D,Texname glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR glTexParameteri GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR glTexImage2D GL_TEXTURE_2D, 0, 3, TexWidth, TexHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, Checkimage End Function Function nehe12() Local yloop:Int Local xloop:Int If KeyDown(KEY_LEFT) Then yrot:-0.2 If KeyDown(KEY_RIGHT) Then yrot:+0.2 If KeyDown(KEY_UP) Then xrot:-0.2 If KeyDown(KEY_DOWN) Then xrot:+0.2 If KeyDown(KEY_1) And Keytrig = 0 Then ListDraw=1-ListDraw;Keytrig=1 If KeyDown(KEY_1)=0 And Keytrig = 1 Then Keytrig = 0 glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ' Clear The Screen And The Depth Buffer glBindTexture(GL_TEXTURE_2D, Texname) For yloop=1 To 100 For xloop=0 To yloop-1 glLoadIdentity() ' Reset The View glTranslatef(1.4+(Float(xloop)*2.8)-(Float(yloop)*1.4),((6.0-Float(yloop))*2.4)-7.0,-20.0) glRotatef(45.0-(2.0*Float(yloop))+xrot,1.0,0.0,0.0) glRotatef(45.0+yrot,0.0,1.0,0.0) If ListDraw Then glColor3fv(Varptr boxcol[yloop-1]) '(boxcol[yloop-1]) glCallList(box) glColor3fv(Varptr topcol[yloop-1]) glCallList(top) Else glColor3fv(Varptr boxcol[yloop-1]) ManualDraw() EndIf Next Next End Function Function ManualDraw() glBegin(GL_QUADS) ' Bottom Face glNormal3f( 0.0,-1.0, 0.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) ' Front Face glNormal3f( 0.0, 0.0, 1.0) glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) ' Back Face glNormal3f( 0.0, 0.0,-1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) ' Right face glNormal3f( 1.0, 0.0, 0.0) glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) ' Left Face glNormal3f(-1.0, 0.0, 0.0) glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) glEnd() glBegin(GL_QUADS) ' Top Face glNormal3f( 0.0, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); glEnd() End Function ' Build Cube Display Lists Function BuildLists() box=glGenLists(2) ' Generate 2 Different Lists glNewList(box,GL_COMPILE) ' Start With The Box List glBegin(GL_QUADS) ' Bottom Face glNormal3f( 0.0,-1.0, 0.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) ' Front Face glNormal3f( 0.0, 0.0, 1.0) glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) ' Back Face glNormal3f( 0.0, 0.0,-1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) ' Right face glNormal3f( 1.0, 0.0, 0.0) glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0) glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0) glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0) ' Left Face glNormal3f(-1.0, 0.0, 0.0) glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0) glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0) glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0) glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0) glEnd() glEndList() top=box+1 ' Storage For "Top" Is "Box" Plus One glNewList(top,GL_COMPILE) ' Now The "Top" Display List glBegin(GL_QUADS) ' Top Face glNormal3f( 0.0, 1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); glEnd() glEndList() End Function
The above code would suggest so.... Strange, they say display lists are faster.