【转】我的opengl编程学习(二)(混合、深度测试、雾化、
2009-11-13 16:00
375 查看
12 混合
混合的底层原理是:如果不开启混合,那么对于帧缓存中的同样一个片断,后来的颜色将会覆写原有的颜色,而开启混合,则会在后来的颜色到来时利用混合因子重新计算该颜色而不是简单的覆写。其中后来的颜色叫做源颜色,而缓存中原来存在的颜色叫做目的颜色。
glEnable(GL_BLEND)打开混合开关,这样ALPHA值就可能会起作用了(如果你使用这个作为因子的话)
用 glBlendFunc()来产生源颜色和目的颜色的混合因子,有各种产生方法,最后总的混合颜色=源颜色×源颜色的混合因子+目的颜色×目的颜色的混合因子
下面是几个我左的各种混合参数的例子
0 1混合,就是只保留第一个framebuffer上面的东西,后面的绘制都看不见了
1 0混合
用后来的帧缓存替换前面的帧缓存,只有后面帧的信息
将目的和源的AILPHA都设为常量0.5的混合
src 1-src混合
后面的帧的混合系数采用后面帧的颜色值
其实就是颜色越浅的地方透明度越高,好像更加虚幻
13深度测试
在设计到消隐到情况(可能发遮挡),都要开启深度测试
Glenable(depth_test),硬件上就是打开了深度缓存区,当有新的同样XY坐标的片断到来时,比较两者的深度,并且在初始化时打开深度,并且绘制每一帧前要gl_clear(gl-depth-bit)(这根clear_buffer_bit类似,而且同样要设置clear_deppth_bitd 值,用glClearDepth(GLclampd depth),一般设为1,这将背景设为最深,这是默认的,通常不用写)
14 雾
首先glEnable(GL_FOG)
然后用glFog*()设置雾的衰减因子的计算模型和强度和颜色还有雾的范围(还可以用glHint()来设置雾的质量
最要呕注意雾的绘制要再绘制被雾影响的物体之前
15多边形平移
再OPENGL中有时为了绘制一个又高亮的轮廓的多边形,或者有时为了做贴花效果,就要将一个多边形和另一个线框叠加,这样有时会产生叠加部分颜色的冲突或不稳定,为了解决这个问题,可以采用多边形平移,它可以将其中一个的深度信息做一个合理的平移,使前后区分,步骤是:
首先用glEnable(GL_POLYGON_OFFSET_xx)打开平移开关;
然后glPolygonOffset(factor, units)产生平移的距离,平移距离等于m * factor + r * units,这里M是一个多边形本身深度变化的最大值,通常可以都设为1
16显示列表
-1.产生一个列表:用n=glGenLists (×)产生一个独一无二的LIST标识号,然后用glNewList(theTorus, GL_COMPILE);
这里面的第二个参数可以是GL_COMPILE和GL_COMPILE_AND_EXCUTE,二者的区别是前者在产生列表时不执行绘制,只在calllist的时候绘制,而后者是在产生列表时就立即绘制,一般采用 GL_COMPILE会提高渲染性能
绘制代码;
glEndList();产生列表
使用列表,用glCallList(n)绘制那个列表的内容
-2列表中可以存放的内容:
Matrix operations Raster bitmaps and images Lights, material properties, and lighting models Textures Polygon stipple patterns
使用列表而不是做成函数的好处是,使用函数要每次进行很多矩阵运算,而列表中实际只是存放这些运算的结果,值进行了一次运算,每次调用结果
-3 glIsList,判断一个数是否被作为列表标识符
glDeleteLists,删除一个标识符范围的列表
-4 绘制多个列表:
glListBase(base);//定义当前在绘制多个列表时的基础标识号的值
glCallLists(len, GL_BYTE, s);//绘制LEN个列表,并且S为列表的偏移量的指针,绘制的列表的号=BASE+S里的偏移
17
glPushAttrib()和glPopAttrib()用来存储一组状态值,如颜色、各种状态的开关等
18 Pixels, Bitmaps, Fonts, and Images
-1 OPENGL中所指的BITMAP实质就是二值图像(不局限于黑白),每个像素只有一位,当为1时,将绘制当前设定当颜色,为0时不绘制。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leonwei/archive/2009/03/27/4029328.aspx
混合的底层原理是:如果不开启混合,那么对于帧缓存中的同样一个片断,后来的颜色将会覆写原有的颜色,而开启混合,则会在后来的颜色到来时利用混合因子重新计算该颜色而不是简单的覆写。其中后来的颜色叫做源颜色,而缓存中原来存在的颜色叫做目的颜色。
glEnable(GL_BLEND)打开混合开关,这样ALPHA值就可能会起作用了(如果你使用这个作为因子的话)
用 glBlendFunc()来产生源颜色和目的颜色的混合因子,有各种产生方法,最后总的混合颜色=源颜色×源颜色的混合因子+目的颜色×目的颜色的混合因子
下面是几个我左的各种混合参数的例子
0 1混合,就是只保留第一个framebuffer上面的东西,后面的绘制都看不见了
1 0混合
用后来的帧缓存替换前面的帧缓存,只有后面帧的信息
将目的和源的AILPHA都设为常量0.5的混合
src 1-src混合
后面的帧的混合系数采用后面帧的颜色值
其实就是颜色越浅的地方透明度越高,好像更加虚幻
13深度测试
在设计到消隐到情况(可能发遮挡),都要开启深度测试
Glenable(depth_test),硬件上就是打开了深度缓存区,当有新的同样XY坐标的片断到来时,比较两者的深度,并且在初始化时打开深度,并且绘制每一帧前要gl_clear(gl-depth-bit)(这根clear_buffer_bit类似,而且同样要设置clear_deppth_bitd 值,用glClearDepth(GLclampd depth),一般设为1,这将背景设为最深,这是默认的,通常不用写)
14 雾
首先glEnable(GL_FOG)
然后用glFog*()设置雾的衰减因子的计算模型和强度和颜色还有雾的范围(还可以用glHint()来设置雾的质量
最要呕注意雾的绘制要再绘制被雾影响的物体之前
15多边形平移
再OPENGL中有时为了绘制一个又高亮的轮廓的多边形,或者有时为了做贴花效果,就要将一个多边形和另一个线框叠加,这样有时会产生叠加部分颜色的冲突或不稳定,为了解决这个问题,可以采用多边形平移,它可以将其中一个的深度信息做一个合理的平移,使前后区分,步骤是:
首先用glEnable(GL_POLYGON_OFFSET_xx)打开平移开关;
然后glPolygonOffset(factor, units)产生平移的距离,平移距离等于m * factor + r * units,这里M是一个多边形本身深度变化的最大值,通常可以都设为1
16显示列表
-1.产生一个列表:用n=glGenLists (×)产生一个独一无二的LIST标识号,然后用glNewList(theTorus, GL_COMPILE);
这里面的第二个参数可以是GL_COMPILE和GL_COMPILE_AND_EXCUTE,二者的区别是前者在产生列表时不执行绘制,只在calllist的时候绘制,而后者是在产生列表时就立即绘制,一般采用 GL_COMPILE会提高渲染性能
绘制代码;
glEndList();产生列表
使用列表,用glCallList(n)绘制那个列表的内容
-2列表中可以存放的内容:
Matrix operations Raster bitmaps and images Lights, material properties, and lighting models Textures Polygon stipple patterns
使用列表而不是做成函数的好处是,使用函数要每次进行很多矩阵运算,而列表中实际只是存放这些运算的结果,值进行了一次运算,每次调用结果
-3 glIsList,判断一个数是否被作为列表标识符
glDeleteLists,删除一个标识符范围的列表
-4 绘制多个列表:
glListBase(base);//定义当前在绘制多个列表时的基础标识号的值
glCallLists(len, GL_BYTE, s);//绘制LEN个列表,并且S为列表的偏移量的指针,绘制的列表的号=BASE+S里的偏移
17
glPushAttrib()和glPopAttrib()用来存储一组状态值,如颜色、各种状态的开关等
18 Pixels, Bitmaps, Fonts, and Images
-1 OPENGL中所指的BITMAP实质就是二值图像(不局限于黑白),每个像素只有一位,当为1时,将绘制当前设定当颜色,为0时不绘制。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leonwei/archive/2009/03/27/4029328.aspx
相关文章推荐
- 我的opengl编程学习(二)(混合、深度测试、雾化、多边形平移、显示列表)
- cocos2D-X源码分析之从cocos2D-X学习OpenGL(14)----深度测试
- 【学习OpenGL】(五)——隐藏表面消除(深度测试)
- Win32 OpenGL编程(13) 隐藏表面消除(深度测试)及雾效果
- OpenGL学习脚印:深度测试(depth testing)
- openGL之深度测试、表面剔除、剪裁---openGL学习笔记(五)
- 深度学习基础模型算法原理及编程实现--04.改进神经网络的方法
- python的GUI编程--wxpython学习(四)-->练习:一个自动测试app启动时间的小工具
- Qt下的OpenGL 编程(12)阶段学习总结
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
- OpenGL中的混合测试
- 我的编程学习日志(4)-- 一种简单的测试代码的方法(freopen)
- 七月算法深度学习 第三期 学习笔记-第二节 DNN与混合网络
- OpenGL中的Alpha测试,深度测试,模板测试,裁减测试
- 吴恩达Coursera深度学习课程 DeepLearning.ai 编程作业——Optimization Methods(2-2)
- opengl基础学习专题 (一 )编程环境搭建
- 华为软件编程规范学习(十一)--代码测试、维护
- 机器码农:深度学习自动编程
- 【caffe-Windows】caffe在Windows下训练深度学习网络并测试(以mnist为例)
- OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试