《OpelGL编程指南第七版》第六章:混合、抗锯齿、雾和多边形(笔记)

《混合、抗锯齿、雾和多边形偏移》

标签(空格分隔): OpenGL编程指南第七版


6.1 混合

image_1c3ig02611pr8bgqamm1u52suh9.png-98.8kB

6.1.1 源因子与目标因子

image_1c3ighn8615qrjocq6b1pb61m8lm.png-56.3kB
image_1c3igj1071lbee092o41op2bgh13.png-186.5kB
void glBlendFunc(GLenum srcfactor GLenum destfactor);
image_1c3igkq86od5lou1fe0pn524q9.png-120.3kB
image_1c3igl6noh64km21t5k1ek99kum.png-174kB

void glBlenndFuncSeparate(GLenum srcRGB, GLenum destRBG, GLenum srcAlpha, GLenum destAlpha);
image_1c3igodnp16ss19iu18d119nimn02j.png-131.1kB
image_1c3igop9vi81idsnel3bk16d930.png-35.8kB

void glBlendColor(GLclampdf red, GLclampdf green, GLclampdf blue, GLclampdf alpha);
image_1c3igs7ckbjuria1b4limb1l5k3t.png-47kB

6.1.2 启用混合

glEnable(GL_BLEND);

6.1.3 使用混合方程式组合像素

void BlendEquation(GLenum mode);
image_1c3igvn6v10ga1m1910ehrtkmof4a.png-147kB

void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
image_1c3ih1j47loc1ttn1m813o2ekf4n.png-74.7kB

6.1.6 使用深度缓冲区进行三维混合

半透明物体绘图顺序将会极大地影响最终的结果。如果一个不透明的物体遮挡住了一个半透明的物体或者一个不透明的物体,就需要利用深度缓冲区消除这些距离更远的物体。但是吗,如果半透明物体更靠近观察点,就需要把它与位于它后面的不透明物体进行混合。

这个问题的解决方案是启用深度缓冲区。在绘制半透明物体时,让深度缓冲区处于只读状态(半透明间需要注意绘图顺序,由远及近)。

glDepthMask()传递GL_FALSE参数,深度缓冲区就设置为只读。

6.2 抗锯齿

image_1c3jrau281q9o1sb91ttkc1f6669.png-456kB
void glHint(GLenum target, GLenum hint);对图像质量和渲染速度之间的权衡关系施加控制。
image_1c3jrdk1f1u3lgh0rgr1gua1gc3m.png-360kB
image_1c3jrdulk1d2o1tia11umr14t6n13.png-123kB

6.2.1 对点和直线进行抗锯齿处理

对点和直线进行抗锯齿处理的一种方法之一是使用glEnable()函数(GL_POINT_SMOOTH或GL_LINE_SMOOTH)启用抗锯齿。
RGBA模式下的抗锯齿
在RGB模式下,需要启用混合功能。最常用的混合因子是GL_SRC_ALPHA(源)和GL_ONE_MINUS_SRC_ALPHA(目标)。另外也可以使用GL_ONE来表示目标混合因子。
由于所执行的是混合操作(glEnable(GL_BLEND)),可能需要考虑渲染顺序。但是,在大多数情况下,可以忽略渲染顺序,它不会产生明显的不良效果。
image_1c3jri65broh17vr1h6lgvn1t281g.png-8.9kB
image_1c3jrjjp9rvc1jne78e127h2vq1t.png-10.6kB

颜色索引模式下的抗锯齿
image_1c3jt7ea9vou6du9kt134bs2o2a.png-238.9kB

6.2.2 使用多重采样对几何图元进行抗锯齿处理

image_1c3ju968a1i3c1qsi18ic2v51poc2n.png-147.3kB
多重采样特别适合对多边形的边缘进行抗锯齿处理,因为此时不需要进行排序
步骤:

  1. 获取支持多重采样的窗口
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_MUTISAMPLE);
  2. 验证多重采样功能是否可用
    如果查询状态变量GL_SAMPLE_BUFFERS返回的值是1,并且查询GL_SAMPLES返回的值大于1,就可以使用多重采样功能。
    GLint bufs,samples;
    glGetIntergerv(GL_SAMPLE_BUFFERS,&bufs);
    glGetIntergerv(GL_SAMPLES,&samples);
  3. 启用多重采样
    glEnable(GL_MULTISAMPLE);

图片左侧抗锯齿,右侧不抗锯齿
image_1c3jukpa12id10r5n59am44dm34.png-159.1kB
image_1c3jumhgo1hbg1s651jr41vd21hon3h.png-169.6kB

alpha和多重采样
在默认情况下,多重采样计算的覆盖值是独立于alpha值的。但是,如果启用了下面这些特殊的模式,那么在计算片段的覆盖值时,就会考虑alpha值的因素。

  • GL_SAMPLE_ALPHA_TO_COVERAGE:使用片段的alpha值来计算最终的覆盖值。
  • GL_SAMPLE_ALPHA_TO_ONE:把片段的alpha值设置为1,然后在计算覆盖值时使用这个值。
  • GL_SAMPLE_COVERAGE:使用glSampleCoverage()函数所设置的值,这个值与经过计算产生的覆盖值进行组合(使用AND操作)。另外,也可以通过在glSampleCoverage()函数中使用invert标志来反转这个模式。
    void glSampleCoverage(GLclampf value, GLboolean invert);
    image_1c3jvor9msul123c135j1kmvnl3u.png-93kB

6.2.3 对多边形进行抗锯齿处理

image_1c3k088it1c741jr11kin1ams4mk6r.png-142.9kB
image_1c3k0dnvupe41dccph71g5k8bi78.png-493.6kB

6.3 雾

雾是在执行了矩阵变换、光照和纹理之后才应用的。

6.3.1 使用雾

glEnable(GL_FOG);启用雾
GLfloat fogColor4 = { 0.5, 0.5, 0.5, 1.0 };
fogMode = GL_EXP;
glFogi(GL_FOG_MODE, fogMode);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.35);
glHint(GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 1.0);
glFogf(GL_FOG_END, 5.0);

6.3.2 雾方程式

image_1c3k19b95rfvh1r14ct14hq7r97l.png-164.2kB
void glFog{if}(GLenum pname, TYPE param);
void glFog{if}v(GLenum pname, TYPE* param);
image_1c3k1bof15umtmsmm1t9eku982.png-97.8kB
image_1c3k1cpph9lu1c3n1bhnn4r18nm9f.png-62.1kB

RGBA模式下的雾
image_1c3k1e9dsfri1k4524q1sa1ut99s.png-53.1kB

颜色索引模式下的雾
image_1c3k1epvllab12tvnc81jafcgra9.png-54.5kB

雾坐标

image_1c3k33loatcm193213jkobu1he2am.png-197.3kB
void glFogCoord{fd}(TYPE z);
void glFogCoord{fd}v(const TYPE* z);
image_1c3k35ns0pgh361n831j6c1o9tb3.png-117.4kB
此时,视点移动对物体指定雾坐标的顶点的雾效果没有影响。

glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
image_1c3k43jhscpop8f1mnn1evflnfc0.png-15.4kB
image_1c3k446i14e113384001l11oskcd.png-34.2kB

glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
image_1c3k44tu2lroskd98k11gskhqcq.png-14kB
image_1c3k45aah1v8fm6kq5n88ifkbd7.png-24.5kB

6.4 点参数

点参数是一种自动、优雅的解决方案。它根据点和观察点的距离,对点的大小和亮度进行衰减。
void glPointParameter{if}(GLenum pname, GLfloat param);
void glPointParameter{if}v(GLenum panme, const TYPE* param);
image_1c3mduhcc120k8r81j0vvrsbeu9.png-314.2kB

6.5 多边形偏移

着重显示实心物体的边缘。
image_1c3me8mfkd11n74126o6cl1odbm.png-128.9kB
多边形偏移可也以用于在表面上生成贴花、使用隐藏直线消除来渲染图像。除了直线和多边形外,这个技巧也可以用于点图元。
使用glEnable()调用适当的参数(GL_POLYGON_OFFSET_FILL、GL_POLYGON_OFFSET_LINE、GL_POLYGON_OFFSET_POINT)来启用多边形偏移。还必须调用glPolygonMode()函数设置当前的多边形光栅化方法。
void glPolygonOffset(GLfloat factor, GLfloat units);
image_1c3mejq91u8c168mcpfig1r3k23.png-114.9kB

image_1c3mfnnm81ga01r0gijo4421e2o2g.png-102.3kB
image_1c3mfqdm719mevop1pof1ium17vi3q.png-128.6kB
image_1c3mfq0cu15lt1bim1n6p1cd21n2t3d.png-140.7kB

factor = 0.1f,units = 0.0f
image_1c3mfsv568hr1j910491cl11qk947.png-46.2kB

factor = 0.1f,units = 536.0f
image_1c3mg21cmgh51gg718d11t7s17pd5k.png-43.1kB

factor = 1.4f,units = 0.0f
image_1c3mg37rsl591fihik51nff4d061.png-46.8kB

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值