我的opengl编程学习(二)(混合、深度测试、雾化、多边形平移、显示列表)

来源:互联网 发布:东方飞扬档案软件 编辑:程序博客网 时间:2024/05/07 00:26

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为列表的偏移量的指针,绘制的列表的号=BASES里的偏移

17

glPushAttrib()glPopAttrib()用来存储一组状态值,如颜色、各种状态的开关等

18 Pixels, Bitmaps, Fonts, and Images

1 OPENGL中所指的BITMAP实质就是二值图像(不局限于黑白),每个像素只有一位,当为1时,将绘制当前设定当颜色,为0时不绘制。

原创粉丝点击