当前位置:文档之家› OpenGL高级课题与纹理映射技术教程

OpenGL高级课题与纹理映射技术教程

◦ 图元保存在显示列表中、显示列表保存在 显卡中

保留模式(retained mode)
◦ 所有数据预先置入显存
立即模式与显示列表
立即模式 多项式 求值器 顶点操作 和 图元组装
CPU
列出显示
显示 列表
光栅化
象素 操作
帧 缓冲
纹理 内存 象素 操作
显示列表
创建显示列表
GLuint id;
void init( void ) { id = glGenLists( 1 ); glNewList( id, GL_COMPILE ); /* other OpenGL routines */ glEndList(); }
抖动

glEnable( GL_DITHER );

抖动用于加强视觉效果
◦ 用于模拟更多颜色

打印设置

目前,该功能ቤተ መጻሕፍቲ ባይዱ少被用到
象素上的逻辑操作

使用位逻辑操作结合多个象素值
glLogicOp( mode );

命令模式
GL_XOR GL_AND

目前,该功能很少被用到
累积缓冲器

颜色缓冲器合成的问题
◦ 有限颜色分辨率
截断 精度损失
◦ 累积缓冲区扮演着“浮点”颜色缓冲区的 角色
合成到积累缓冲区 将结果转换到帧缓冲区
累积缓冲区存取

glAccum( op, value )
◦ 操作
在积累缓冲区中的操作: GL_ADD, GL_MULT 读缓冲区操作: GL_ACCUM, GL_LOAD 写缓冲区操作: GL_RETURN
景深

沿平行焦平面的方向移动视点
后平面
焦平面
前平面
眼睛位置1
眼睛位置2
景深
雾化

glFog{if}( property, value )

景深效果处理
◦ 指定线性雾化渐变区域大小
GL_FOG_LINEAR

环境效果
◦ 模拟真实雾化效果
GL_FOG_EXP GL_FOG_EXP2
雾化

包围盒外的象素被裁剪掉 便于更新视域的一小块区域
影响glClear()操作
模板缓冲区(stencil buffer)

用模板缓冲区的值控制绘制
◦ 无法通过模板测试的象素将不被绘制 ◦ 例子:在模板缓冲区中创建一个蒙板,并 仅绘制那些不在蒙板区域内的物体
控制模板缓冲区

glStencilFunc( func, ref, mask )
高级成像

成像子集
◦ 只有当GL_ARB_imaging有定义时才有效
颜色矩阵 卷积 颜色表 直方图 MinMax 高级混合
立即模式、显示列表和保留模 式

立即模式(immediate mode)
◦ 图元直接发送到绘制流水线并显示 ◦ 不需要显卡内存

显示列表(display list)

使用模板


当stencil = 1绘制物体
glStencilFunc( GL_EQUAL, 0x1, 0x1 )

当stencil != 1绘制
◦ glStencilFunc( GL_NOTEQUAL, 0x1, 0x1 ); ◦ glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
创建模板
glInitDisplayMode( …|GLUT_STENCIL|… ); glEnable( GL_STENCIL_TEST ); glClearStencil( 0x0 );

glStencilFunc( GL_ALWAYS, 0x1, 0x1 ); glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE ); 绘制蒙板
OpenGL高级课题与纹理映射技术
OpenGL 架构
顶点操作 求值器
顶点变换与光照计算
像素级光照计算 CPU
显示列表 光栅化 逐个象素操作 帧缓冲
OpenGL其他高级课题
纹理 后象素处理
纹理映射
帧缓冲区操作
关于帧缓冲区(frame buffer)
象素 裁剪 测试 Alpha 测试 模板 测试
深度 测试

在纹理映射时用alpha值作为蒙板
混合

结合输出与帧缓冲器中原有的象素值 glBlendFunc( src, dst )
Cr src C f dst C p
混合 方程
象素 (src) 帧缓冲器 象素 (dst) 混合后 的象素
裁剪包围盒

其他的裁剪测试
glScissor( x, y, w, h )
◦ glAccum(GL_ACCUM, 0.5)将写缓冲区 的每一个值乘以0.5,然后加到累积缓冲区 中
累积缓冲区的应用
颜色合成:透明 全屏反走样:A-buffer算法 景深:Depth Cue 滤波: 运动模糊: Motion blur

反走样(Anti-aliasing)

消除锯齿状 glEnable( mode )
混合
抖动
逻辑 操作
帧缓冲区
Alpha: 第四维颜色分量

透明度的度量
◦ 模拟透明物体
玻璃、水等
◦ 合成图像 ◦ 反走样 ◦ 混合状态下有效 glEnable( GL_BLEND );
Alpha测试

基于alpha值选择象素
glAlphaFunc( func, value ) glEnable( GL_ALPHA_TEST );
◦ 用func比较缓冲区的值与 ref ◦ 只对那些mask值为1的象素进行操作 ◦ func 是一个标准比较函数

glStencilOp( fail(模板失败), zfail(模板 通过,z失败), zpass(两者都通过) )
◦ 基于模板测试和深度测试的结果相应调整 模板缓冲区的值: GL_KEEP, GL_INCR
GL_POINT_SMOOTH GL_LINE_SMOOTH GL_POLYGON_SMOOTH
◦ 象素的Alpha值由象素被覆盖 大小决定 ◦ 可以是RGBA或颜色索引模式
全屏反走样: 视点抖动

当我们略微移动视点时,图像随之平移
◦ 每一幅图像有不同的走样情况 ◦ 用积累缓冲区对图像作平均,将消除这些 走样
调用显示列表
void display( void ) { glCallList( id ); }
显示列表



不是所有的OpenGL程序都能存储在显 示列表当中 显示列表创建后,状态仍然能够被改变 显示列表可以嵌套调用 显示列表一旦创建,不能进行编辑
相关主题