OpenGL的显示列表
2007-08-24 11:30
302 查看
我们用glNewList()命令来开始构造显示列表。第二个参数GL_COMPILE告诉OpenGL我们想预先在内存中构造这个列表,这样每次画的时候就不必重新计算怎么构造物体了。GL_COMPILE类似于编程。在你写程序的时候,把它装载到编译器里,你每次运行程序都需要重新编译。而如果他已经编译成了.exe文件,那么每次你只需要点击那个.exe文件就可以运行它了,不需要编译。当OpenGL编译过显示列表后,就不需要再每次显示的时候重新编译它了。这就是为什么用显示列表可以加快速度。
你可以在glNewList()和glEngList()中间加上任何你想加上的代码。可以设置颜色,贴图等等。唯一不能加进去的代码就是会改变显示列表的代码。显示列表一旦建立,你就不能改变它。
比如你想加上glColor3ub(rand()%255,rand()%255,rand()%255),使得每一次画物体时都会有不同的颜色。但因为显示列表只会建立一次,所以每次画物体的时候颜色都不会改变。物体将会保持第一次建立显示列表时的颜色。 如果你想改变显示列表的颜色,你只有在调用显示列表之前改变颜色。
成员变量区:
int m_GLPixelIndex;
HGLRC m_hGLContext;//绘制环境
GLfloat xrot;//绕x轴旋转量
GLfloat yrot;//绕y轴旋转量
GLfloat xspeed; // X 旋转速度
GLfloat yspeed; // Y 旋转速度
GLfloat z; // 深入屏幕的距离
GLuint filter;
GLuint texture[1];
GLfloat LightAmbient[4]; // 环境光参数
GLfloat LightDiffuse[4]; // 漫射光参数
GLfloat LightPosition[4]; // 光源位置
GLboolean bLighting;//是否启用光照
bool lPressed;
bool fPressed;
GLuint box;// 保存盒子的显示列表
GLuint top;// 保存盒子顶部的显示列表
GLuint xloop;// X轴循环变量
GLuint yloop;// Y轴循环变量
static GLfloat boxcol[5][3];
static GLfloat topcol[5][3];
成员函数区:
BOOL COpenGLDemoView::PreTranslateMessage(MSG* pMsg)
void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
GLvoid COpenGLDemoView::BuildLists()
int COpenGLDemoView::DrawGLScene()
BOOL COpenGLDemoView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
if (!LoadGLTextures()) // Jump To Texture Loading Routine ( NEW )
return FALSE; // If Texture Didn't Load Return FALSE
}
this->BuildLists();
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
glEnable(GL_LIGHT1); // 启用一号光源
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
COLORREF color = ::GetSysColor(COLOR_3DFACE);
glClearColor((float)GetRValue(color)/255.0f,
(float)GetGValue(color)/255.0f,
(float)GetBValue(color)/255.0f,
1.0);
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}效果如图所示:
你可以在glNewList()和glEngList()中间加上任何你想加上的代码。可以设置颜色,贴图等等。唯一不能加进去的代码就是会改变显示列表的代码。显示列表一旦建立,你就不能改变它。
比如你想加上glColor3ub(rand()%255,rand()%255,rand()%255),使得每一次画物体时都会有不同的颜色。但因为显示列表只会建立一次,所以每次画物体的时候颜色都不会改变。物体将会保持第一次建立显示列表时的颜色。 如果你想改变显示列表的颜色,你只有在调用显示列表之前改变颜色。
成员变量区:
int m_GLPixelIndex;
HGLRC m_hGLContext;//绘制环境
GLfloat xrot;//绕x轴旋转量
GLfloat yrot;//绕y轴旋转量
GLfloat xspeed; // X 旋转速度
GLfloat yspeed; // Y 旋转速度
GLfloat z; // 深入屏幕的距离
GLuint filter;
GLuint texture[1];
GLfloat LightAmbient[4]; // 环境光参数
GLfloat LightDiffuse[4]; // 漫射光参数
GLfloat LightPosition[4]; // 光源位置
GLboolean bLighting;//是否启用光照
bool lPressed;
bool fPressed;
GLuint box;// 保存盒子的显示列表
GLuint top;// 保存盒子顶部的显示列表
GLuint xloop;// X轴循环变量
GLuint yloop;// Y轴循环变量
static GLfloat boxcol[5][3];
static GLfloat topcol[5][3];
成员函数区:
BOOL COpenGLDemoView::PreTranslateMessage(MSG* pMsg)
void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
GLvoid COpenGLDemoView::BuildLists()
int COpenGLDemoView::DrawGLScene()
BOOL COpenGLDemoView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
if (!LoadGLTextures()) // Jump To Texture Loading Routine ( NEW )
return FALSE; // If Texture Didn't Load Return FALSE
}
this->BuildLists();
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
glEnable(GL_LIGHT1); // 启用一号光源
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
COLORREF color = ::GetSysColor(COLOR_3DFACE);
glClearColor((float)GetRValue(color)/255.0f,
(float)GetGValue(color)/255.0f,
(float)GetBValue(color)/255.0f,
1.0);
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}效果如图所示:
相关文章推荐
- OpenGL(八) 显示列表
- Opengl中列表的显示
- OpenGL入门学习——第八课 使用显示列表
- OpenGL学习笔记(8)显示列表
- NeHe OpenGL教程 第十二课:显示列表
- OpenGL系列教程之七:OpenGL显示列表
- OpenGL 学习 显示列表
- 计算机图形学(二)输出图元_18_显示列表_2_执行OpenGL显示表
- [OpenGL] 斯坦福兔子与显示列表
- 计算机图形学09一一OpenGL 显示列表
- OpenGL--显示列表
- 【Qt OpenGL教程】12:显示列表
- OPENGL的显示列表
- OpenGL显示列表(转)
- OpenGL基础图形编程 - 显示列表
- OpenGL基础图形编程 - 显示列表
- 【OpenGL】OpenGL系列——04显示列表与光照材质
- OpenGL显示列表
- OpenGL学习笔记(8)显示列表
- OpenGL学习笔记:显示列表