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
intm_GLPixelIndex;
None.gifHGLRCm_hGLContext;
//绘制环境
None.gif

None.gifGLfloatxrot;
//绕x轴旋转量
None.gif
GLfloatyrot;//绕y轴旋转量
None.gif

None.gifGLfloatxspeed;
//X旋转速度
None.gif
GLfloatyspeed;//Y旋转速度
None.gif

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

None.gifGLuintfilter;
None.gifGLuinttexture[
1];
None.gifGLfloatLightAmbient[
4];//环境光参数
None.gif
GLfloatLightDiffuse[4];//漫射光参数
None.gif
GLfloatLightPosition[4];//光源位置
None.gif

None.gifGLbooleanbLighting;
//是否启用光照
None.gif
boollPressed;
None.gif
boolfPressed;
None.gif
None.gif
None.gifGLuintbox;
//保存盒子的显示列表
None.gif
GLuinttop;//保存盒子顶部的显示列表
None.gif
GLuintxloop;//X轴循环变量
None.gif
GLuintyloop;//Y轴循环变量
None.gif

None.gif
None.gif
staticGLfloatboxcol[5][3];
None.gif
None.gif
staticGLfloattopcol[5][3];

None.gif成员函数区:
None.gif
None.gifBOOLCOpenGLDemoView::PreTranslateMessage(MSG
*pMsg)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
InBlock.gif
if(pMsg->message==WM_KEYDOWN)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSendMessage(pMsg
->message,pMsg->wParam,pMsg->lParam);
InBlock.gif
returntrue;
ExpandedSubBlockEnd.gif}

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

ExpandedBlockEnd.gif}

None.gif
None.gif
voidCOpenGLDemoView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
//TODO:Addyourmessagehandlercodehereand/orcalldefault
InBlock.gif
switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
caseVK_LEFT:
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{//左键
InBlock.gif
yspeed-=0.02f;
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

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

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

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

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

InBlock.gif
caseVK_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.giffPressed
=TRUE;
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

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

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

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

None.gif
None.gif
voidCOpenGLDemoView::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
//TODO:Addyourmessagehandlercodehereand/orcalldefault
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.giffilter
=(filter+1)%3;
ExpandedSubBlockEnd.gif}

InBlock.giffPressed
=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.gifglEnable(GL_LIGHTING);
ExpandedSubBlockEnd.gif}

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

ExpandedSubBlockEnd.gif}

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

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

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

None.gif
None.gif
None.gifGLvoidCOpenGLDemoView::BuildLists()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gifbox
=glGenLists(2);//Generate2DifferentLists
InBlock.gif
glNewList(box,GL_COMPILE);//StartWithTheBoxList
InBlock.gif
glBegin(GL_QUADS);
InBlock.gif
//BottomFace
InBlock.gif
glNormal3f(0.0f,-1.0f,0.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
InBlock.gif
//FrontFace
InBlock.gif
glNormal3f(0.0f,0.0f,1.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);
InBlock.gif
//BackFace
InBlock.gif
glNormal3f(0.0f,0.0f,-1.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);
InBlock.gif
//Rightface
InBlock.gif
glNormal3f(1.0f,0.0f,0.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
InBlock.gif
//LeftFace
InBlock.gif
glNormal3f(-1.0f,0.0f,0.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
InBlock.gifglEnd();
InBlock.gifglEndList();
InBlock.giftop
=box+1;//StorageFor"Top"Is"Box"PlusOne
InBlock.gif
glNewList(top,GL_COMPILE);//NowThe"Top"DisplayList
InBlock.gif
glBegin(GL_QUADS);
InBlock.gif
//TopFace
InBlock.gif
glNormal3f(0.0f,1.0f,0.0f);
InBlock.gifglTexCoord2f(
0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
InBlock.gifglTexCoord2f(
0.0f,0.0f);glVertex3f(-1.0f,1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);
InBlock.gifglTexCoord2f(
1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
InBlock.gifglEnd();
InBlock.gifglEndList();
ExpandedBlockEnd.gif}

None.gif
None.gif
intCOpenGLDemoView::DrawGLScene()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{//Here'sWhereWeDoAllTheDrawing
InBlock.gif

InBlock.gifglClear(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT);//ClearScreenAndDepthBuffer
InBlock.gif

InBlock.gifglPushAttrib(GL_COLOR_BUFFER_BIT
|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
InBlock.gifglPushMatrix();
InBlock.gif
InBlock.gifglBindTexture(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.gifglLoadIdentity();
//ResetTheView
InBlock.gif
glTranslatef(1.4f+(float(xloop)*2.8f)-(float(yloop)*1.4f),((6.0f-float(yloop))*2.4f)-7.0f,z);
InBlock.gifglRotatef(
45.0f-(2.0f*yloop)+xrot,1.0f,0.0f,0.0f);
InBlock.gifglRotatef(
45.0f+yrot,0.0f,1.0f,0.0f);
InBlock.gifglColor3fv(boxcol[yloop
-1]);
InBlock.gifglCallList(box);
InBlock.gifglColor3fv(topcol[yloop
-1]);
InBlock.gifglCallList(top);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gifxrot
+=this->xspeed;
InBlock.gifyrot
+=this->yspeed;
InBlock.gif
returnTRUE;//EverythingWentOK
ExpandedBlockEnd.gif
}

None.gif
None.gifBOOLCOpenGLDemoView::InitGL(GLvoid)
//AllSetupForOpenGLGoesHere
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
if(!LoadGLTextures())//JumpToTextureLoadingRoutine(NEW)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnFALSE;//IfTextureDidn'tLoadReturnFALSE
ExpandedSubBlockEnd.gif
}

InBlock.gif
this->BuildLists();
InBlock.gifglEnable(GL_TEXTURE_2D);
//EnableTextureMapping(NEW)
InBlock.gif

InBlock.gifglLightfv(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.gifglShadeModel(GL_SMOOTH);
//EnableSmoothShading
InBlock.gif
COLORREFcolor=::GetSysColor(COLOR_3DFACE);
InBlock.gifglClearColor((
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.gifglClearDepth(
1.0f);//DepthBufferSetup
InBlock.gif
glEnable(GL_DEPTH_TEST);//EnablesDepthTesting
InBlock.gif
glDepthFunc(GL_LEQUAL);//TheTypeOfDepthTestingToDo
InBlock.gif
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//ReallyNicePerspectiveCalculations
InBlock.gif

InBlock.gif
returnTRUE;//InitializationWentOK
ExpandedBlockEnd.gif
}
效果如图所示:
200782401.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值