OpenGL中的抗锯齿绘线(上)

0.前言

        做一个基于OpenGLES的项目,其中涉及到渐变宽度曲线绘制功能的开发(类似下图效果),花了一些时间学习相关的知识,这里做一下总结与整理。受限于个人能力,这里不给出具体实现时OpenGL整个工程的搭建和每个接口函数的详细说明(免得误导他人),只给出大体的使用方法和关键性的调用语句。

 

1.抗锯齿问题

        上图中的效果除了抗锯齿外,还有颜色、宽度、透明度的变化;在OpenGL2.0及其以上版本中,颜色、透明度的变化可以通过shader渲染实现,因此主要问题只剩下抗锯齿和宽度变化,这篇文章首先讲抗锯齿部分的处理。

        OpenGL中已经定义了绘制线段的相关接口函数,从OpenGL1.1中固定渲染管道操作的glBegin(GL_LINES)操作,到OPENGL2.0以上的可编程渲染管道操作的glDrawArray(GL_LINES,...)操作。但是直接调用时,一般绘制的线段在具有一定角度时(非水平、垂直状态下)会产生明显的锯齿状,那么如何消除这种锯齿?OpenGL提供了如下解决方法。

2.解决方法

2.1 glHint()

        这是一个看起来十分神奇的配置,以绘制线段为例,大体调用如下:

	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA);
	glEnable(GL_LINE_SMOOTH);
	glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    /* 绘制线段操作 */

        效果也是出类拔萃,对比如下,左边的线段是默认设置下绘制得到,右边的线段是开启了上述设置后绘制的结果。仔细观察会发现右边的线段宽度比左边要大一些,但实际上代码中两段线段的宽度设置相同。这是一个暗示,暗示OpenGL内部抗锯齿的操作,具体原理分析见下一篇文章。。。

        但我尝试在android平台上(高通8953)如上设置后,并没有产生抗锯齿效果。网上查阅相关问题时,看到一个说法,glHint()只是给硬件一个“建议”,可是否会起作用还要看硬件是否支持这样的设置“建议”,好吧。

2.2 反走样

        线条的锯齿,就是走样的一种表现,相对应的可以通过设置OpenGL中的反走样来处理。OpenGL中设置反走样有如下方式。

1)设置全局环境中的反走样

        OpenGL中默认开启了MSAA,要使用它还需要申请用于多重采样的缓冲区,申请方式与窗口系统有关。在glut中申请调用如下,只需增加一个GLUT_MULTISAMPLE属性

glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH |GLUT_RGBA | GLUT_MULTISAMPLE);

        之后开启多重采样再进行绘制

glEnable(GL_MULTISAMPLE);
/*绘图操作*/

        下图中左边为未开启MSAA的绘制结果,右边为开启MSAA之后的绘制结果。             

        不过在android平台中需要在EGL的初始化代码中做类似的设置,相关设置参考https://blog.csdn.net/u014248312/article/details/78027383

        另外,这种设置只有在默认的绘制环境中起作用。假如你自己创建了一个FBO,在FBO中渲染时,上面的全局设置就无法发挥作用了。因此引入第二种多重采样设置—在FBO中使用多重采样。

2)FBO中的多重采样

        这方面相关介绍很多,链接给出了相关的调用说明,就不再赘述了。

        有两点需要注意

a.FBO中的多重采样只作用于该FBO,譬如使用该FBO渲染,之后将渲染结果拷贝至系统默认FBO(一般是屏幕上),就具有抗锯齿作用;可若需要对该纹理做进一步的后处理,则无法直接操作,需要将该FBO的数据拷贝至一个没有开启多重采样的FBO上,再绑定这个普通FBO的纹理,做后续操作

b. 经过测试发现我的android平台中,若开启了全局MSAA,则在FBO中使用MSAA时,需要在上述操作之后增加一句        glGenerateMipmap(GL_TEXTURE_2D);调用,否则按照a中的操作得到的纹理仍然不具有抗锯齿效果

        啰嗦了半天,也就只是实现了抗锯齿的设置,此时绘制得到的线段宽度无法连续变化。不得已要再进一步,下一篇文章介绍宽度连续变化线段的绘制实现。

3.参考资料

https://blog.csdn.net/wangdingqiaoit/article/details/52830310

https://blog.csdn.net/csxiaoshui/article/details/78932603

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mega_Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值