OpenGL的显示列表

我们用glNewList()命令来开始构造显示列表。第二个参数GL_COMPILE告诉OpenGL我们想预先在内存中构造这个列表,这样每次画的时候就不必重新计算怎么构造物体了。GL_COMPILE类似于编程。在你写程序的时候,把它装载到编译器里,你每次运行程序都需要重新编译。而如果他已经编译成了.exe文件,那么每次你只需要点击那个.exe文件就可以运行它了,不需要编译。当OpenGL编译过显示列表后,就不需要再每次显示的时候重新编译它了。这就是为什么用显示列表可以加快速度。<?xml:namespace prefix = o />

你可以在glNewList()glEngList()中间加上任何你想加上的代码。可以设置颜色,贴图等等。唯一不能加进去的代码就是会改变显示列表的代码。显示列表一旦建立,你就不能改变它。

比如你想加上glColor3ub(rand()%255,rand()%255,rand()%255),使得每一次画物体时都会有不同的颜色。但因为显示列表只会建立一次,所以每次画物体的时候颜色都不会改变。物体将会保持第一次建立显示列表时的颜色。 如果你想改变显示列表的颜色,你只有在调用显示列表之前改变颜色。

None.gif 成员变量区:
None.gif    
int  m_GLPixelIndex;
None.gif    HGLRC m_hGLContext;
// 绘制环境
None.gif

None.gif    GLfloat xrot;
// 绕x轴旋转量
None.gif
    GLfloat yrot; // 绕y轴旋转量
None.gif

None.gif    GLfloat xspeed;                                    
//  X 旋转速度
None.gif
    GLfloat yspeed;                                     //  Y 旋转速度
None.gif

None.gif    GLfloat    z;                                
//  深入屏幕的距离
None.gif

None.gif    GLuint filter;
None.gif    GLuint texture[
1 ];
None.gif    GLfloat LightAmbient[
4 ];                  //  环境光参数
None.gif
    GLfloat LightDiffuse[ 4 ];                  //  漫射光参数
None.gif
    GLfloat LightPosition[ 4 ];                  //  光源位置
None.gif

None.gif    GLboolean bLighting;
// 是否启用光照 
None.gif
     bool  lPressed;
None.gif    
bool  fPressed;
None.gif
None.gif
None.gif    GLuint box;
//  保存盒子的显示列表
None.gif
    GLuint top; //  保存盒子顶部的显示列表
None.gif
    GLuint xloop; //  X轴循环变量
None.gif
    GLuint yloop; //  Y轴循环变量
None.gif

None.gif
None.gif
static  GLfloat boxcol[ 5 ][ 3 ];
None.gif
None.gif
static  GLfloat topcol[ 5 ][ 3 ];

None.gif 成员函数区:
None.gif
None.gifBOOL COpenGLDemoView::PreTranslateMessage(MSG
*  pMsg) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO: Add your specialized code here and/or call the base class
InBlock.gif
    if(pMsg->message == WM_KEYDOWN)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{       
InBlock.gif        SendMessage(pMsg
->message, pMsg->wParam, pMsg->lParam);
InBlock.gif        
return true;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return CView::PreTranslateMessage(pMsg);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
void  COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO: Add your message handler code here and/or call default
InBlock.gif
    switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
case VK_LEFT:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//左键
InBlock.gif
            yspeed-=0.02f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case VK_RIGHT:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//右键
InBlock.gif
            yspeed+=0.02f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case VK_NEXT:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//Page_Down键按下
InBlock.gif
            z+=0.2f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case VK_PRIOR:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//Page_Up键按下
InBlock.gif
            z-=0.2f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case VK_UP:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//Page_Up键按下
InBlock.gif
            xspeed-=0.02f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case VK_DOWN:
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{//Page_Up键按下
InBlock.gif
            xspeed+=0.02f;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case 'F':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            fPressed 
= TRUE    ;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case 'L':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            lPressed 
= TRUE;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
InBlock.gif    
default:
InBlock.gif        
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    CView::OnKeyDown(nChar, nRepCnt, nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gif
void  COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
// TODO: Add your message handler code here and/or call default
InBlock.gif
    switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
case 'F':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(fPressed == TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                filter
=(filter+1)%3;
ExpandedSubBlockEnd.gif            }

InBlock.gif            fPressed 
= FALSE;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
case 'L':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(lPressed==TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{//防止长时间按着'L'键而导致光照持续变化
InBlock.gif
                bLighting = !bLighting;
InBlock.gif                
if(bLighting)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    glEnable(GL_LIGHTING);
ExpandedSubBlockEnd.gif                }

InBlock.gif                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    glDisable(GL_LIGHTING);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            lPressed 
= FALSE;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
default:
InBlock.gif        
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    CView::OnKeyUp(nChar, nRepCnt, nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gifGLvoid COpenGLDemoView::BuildLists()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    box
=glGenLists(2);                                    // Generate 2 Different Lists
InBlock.gif
    glNewList(box,GL_COMPILE);                            // Start With The Box List
InBlock.gif
        glBegin(GL_QUADS);
InBlock.gif            
// Bottom Face
InBlock.gif
            glNormal3f( 0.0f,-1.0f0.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f(-1.0f-1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f-1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
InBlock.gif            
// Front Face
InBlock.gif
            glNormal3f( 0.0f0.0f1.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
InBlock.gif            
// Back Face
InBlock.gif
            glNormal3f( 0.0f0.0f,-1.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);
InBlock.gif            
// Right face
InBlock.gif
            glNormal3f( 1.0f0.0f0.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
InBlock.gif            
// Left Face
InBlock.gif
            glNormal3f(-1.0f0.0f0.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
InBlock.gif        glEnd();
InBlock.gif    glEndList();
InBlock.gif    top
=box+1;                                            // Storage For "Top" Is "Box" Plus One
InBlock.gif
    glNewList(top,GL_COMPILE);                            // Now The "Top" Display List
InBlock.gif
        glBegin(GL_QUADS);
InBlock.gif            
// Top Face
InBlock.gif
            glNormal3f( 0.0f1.0f0.0f);
InBlock.gif            glTexCoord2f(
0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
InBlock.gif            glTexCoord2f(
0.0f0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
InBlock.gif            glTexCoord2f(
1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
InBlock.gif        glEnd();
InBlock.gif    glEndList();
ExpandedBlockEnd.gif}

None.gif
None.gif
int  COpenGLDemoView::DrawGLScene()                                   
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {// Here's Where We Do All The Drawing
InBlock.gif
    
InBlock.gif    glClear(GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT);    // Clear Screen And Depth Buffer
InBlock.gif

InBlock.gif    glPushAttrib(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
InBlock.gif    glPushMatrix();
InBlock.gif
InBlock.gif    glBindTexture(GL_TEXTURE_2D, texture[
this->filter]);//绑定到选定的纹理上
InBlock.gif
    for (yloop=1;yloop<6;yloop++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
for (xloop=0;xloop<yloop;xloop++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            glLoadIdentity();                            
// Reset The View
InBlock.gif
            glTranslatef(1.4f+(float(xloop)*2.8f)-(float(yloop)*1.4f),((6.0f-float(yloop))*2.4f)-7.0f,z);
InBlock.gif            glRotatef(
45.0f-(2.0f*yloop)+xrot,1.0f,0.0f,0.0f);
InBlock.gif            glRotatef(
45.0f+yrot,0.0f,1.0f,0.0f);
InBlock.gif            glColor3fv(boxcol[yloop
-1]);
InBlock.gif            glCallList(box);
InBlock.gif            glColor3fv(topcol[yloop
-1]);
InBlock.gif            glCallList(top);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    xrot
+=this->xspeed;
InBlock.gif    yrot
+=this->yspeed;
InBlock.gif    
return TRUE;                                        // Everything Went OK
ExpandedBlockEnd.gif
}

None.gif
None.gifBOOL COpenGLDemoView::InitGL(GLvoid)                                        
//  All Setup For OpenGL Goes Here
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
if (!LoadGLTextures())                                // Jump To Texture Loading Routine ( NEW )
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
return FALSE;                                    // If Texture Didn't Load Return FALSE
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
this->BuildLists();
InBlock.gif    glEnable(GL_TEXTURE_2D);                            
// Enable Texture Mapping ( NEW )
InBlock.gif

InBlock.gif    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);                
// 设置环境光
InBlock.gif
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);                // 设置漫射光
InBlock.gif
    glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);            // 设置光源位置
InBlock.gif
    glEnable(GL_LIGHT1);                            // 启用一号光源
InBlock.gif

InBlock.gif    glShadeModel(GL_SMOOTH);                            
// Enable Smooth Shading
InBlock.gif
    COLORREF color = ::GetSysColor(COLOR_3DFACE);
InBlock.gif    glClearColor((
float)GetRValue(color)/255.0f,
InBlock.gif                 (
float)GetGValue(color)/255.0f,
InBlock.gif                 (
float)GetBValue(color)/255.0f,
InBlock.gif                 
1.0);
InBlock.gif
InBlock.gif    glClearDepth(
1.0f);                                    // Depth Buffer Setup
InBlock.gif
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
InBlock.gif
    glDepthFunc(GL_LEQUAL);                                // The Type Of Depth Testing To Do
InBlock.gif
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    // Really Nice Perspective Calculations
InBlock.gif

InBlock.gif    
return TRUE;                                        // Initialization Went OK
ExpandedBlockEnd.gif
}
效果如图所示:   
200782401.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值