OpenGL高级课题与纹理映射技术教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
景深
沿平行焦平面的方向移动视点
后平面
焦平面
前平面
眼睛位置1
眼睛位置2
景深
雾化
glFog{if}( property, value )
景深效果处理
◦ 指定线性雾化渐变区域大小
GL_FOG_LINEAR
环境效果
◦ 模拟真实雾化效果
GL_FOG_EXP GL_FOG_EXP2
雾化
◦ 有限颜色分辨率
截断 精度损失
◦ 累积缓冲区扮演着“浮点”颜色缓冲区的 角色
合成到积累缓冲区 将结果转换到帧缓冲区
累积缓冲区存取
glAccum( op, value )
◦ 操作
在积累缓冲区中的操作: GL_ADD, GL_MULT 读缓冲区操作: GL_ACCUM, GL_LOAD 写缓冲区操作: GL_RETURN
使用模板
当stencil = 1绘制物体
glStencilFunc( GL_EQUAL, 0x1, 0x1 )
当stencil != 1绘制
◦ glStencilFunc( GL_NOTEQUAL, 0x1, 0x1 ); ◦ glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
GL_POINT_SMOOTH GL_LINE_SMOOTH GL_POLYGON_SMOOTH
◦ 象素的Alpha值由象素被覆盖 大小决定 ◦ 可以是RGBA或颜色索引模式
全屏反走样: 视点抖动
当我们略微移动视点时,图像随之平移
◦ 每一幅图像有不同的走样情况 ◦ 用积累缓冲区对图像作平均,将消除这些 走样
在纹理映射时用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 )
◦ 图元保存在显示列表中、显示列表保存在 显卡中
保留模式(retained mode)
◦ 所有数据预ห้องสมุดไป่ตู้置入显存
立即模式与显示列表
立即模式 多项式 求值器 顶点操作 和 图元组装
CPU
列出显示
显示 列表
光栅化
象素 操作
帧 缓冲
纹理 内存 象素 操作
显示列表
创建显示列表
GLuint id;
void init( void ) { id = glGenLists( 1 ); glNewList( id, GL_COMPILE ); /* other OpenGL routines */ glEndList(); }
创建模板
glInitDisplayMode( …|GLUT_STENCIL|… ); glEnable( GL_STENCIL_TEST ); glClearStencil( 0x0 );
glStencilFunc( GL_ALWAYS, 0x1, 0x1 ); glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE ); 绘制蒙板
调用显示列表
void display( void ) { glCallList( id ); }
显示列表
不是所有的OpenGL程序都能存储在显 示列表当中 显示列表创建后,状态仍然能够被改变 显示列表可以嵌套调用 显示列表一旦创建,不能进行编辑
抖动
glEnable( GL_DITHER );
抖动用于加强视觉效果
◦ 用于模拟更多颜色
打印设置
目前,该功能很少被用到
象素上的逻辑操作
使用位逻辑操作结合多个象素值
glLogicOp( mode );
命令模式
GL_XOR GL_AND
目前,该功能很少被用到
累积缓冲器
颜色缓冲器合成的问题
◦ 用func比较缓冲区的值与 ref ◦ 只对那些mask值为1的象素进行操作 ◦ func 是一个标准比较函数
glStencilOp( fail(模板失败), zfail(模板 通过,z失败), zpass(两者都通过) )
◦ 基于模板测试和深度测试的结果相应调整 模板缓冲区的值: GL_KEEP, GL_INCR
混合
抖动
逻辑 操作
帧缓冲区
Alpha: 第四维颜色分量
透明度的度量
◦ 模拟透明物体
玻璃、水等
◦ 合成图像 ◦ 反走样 ◦ 混合状态下有效 glEnable( GL_BLEND );
Alpha测试
基于alpha值选择象素
glAlphaFunc( func, value ) glEnable( GL_ALPHA_TEST );
OpenGL高级课题与纹理映射技术
OpenGL 架构
顶点操作 求值器
顶点变换与光照计算
像素级光照计算 CPU
显示列表 光栅化 逐个象素操作 帧缓冲
OpenGL其他高级课题
纹理 后象素处理
纹理映射
帧缓冲区操作
关于帧缓冲区(frame buffer)
象素 裁剪 测试 Alpha 测试 模板 测试
深度 测试
高级成像
成像子集
◦ 只有当GL_ARB_imaging有定义时才有效
颜色矩阵 卷积 颜色表 直方图 MinMax 高级混合
立即模式、显示列表和保留模 式
立即模式(immediate mode)
◦ 图元直接发送到绘制流水线并显示 ◦ 不需要显卡内存
显示列表(display list)
包围盒外的象素被裁剪掉 便于更新视域的一小块区域
影响glClear()操作
模板缓冲区(stencil buffer)
用模板缓冲区的值控制绘制
◦ 无法通过模板测试的象素将不被绘制 ◦ 例子:在模板缓冲区中创建一个蒙板,并 仅绘制那些不在蒙板区域内的物体
控制模板缓冲区
glStencilFunc( func, ref, mask )