电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

FBO中多重采样抗锯齿

6页
  • 卖家[上传人]:夏**
  • 文档编号:491793083
  • 上传时间:2023-11-14
  • 文档格式:DOCX
  • 文档大小:51.02KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、OpenGL】FBO 中多重采样抗锯齿(MSAA: MultiSampling Anti-Aliasing)今天在写这样一个程序,就是导入一个OBJ模型然后显示出来的时候,遇到了一个问题。 我在程序中开启了多重采样,在屏幕上显示出来的效果确实有抗锯齿。但是当我用FBO离 屏渲染,然后保存为BMP图像的时候,发现保存出来的BMP图像并没有抗锯齿效果。问题产生原因及解决方案:在默认帧缓冲中启用多重采样并不会导致FBO里也会启用多重采样。因此要在FBO里达 到多重采样的效果,必须创建适用多重采样的FBO,而不是普通的FBO。关于FBO介绍及使用可参考:FBO下面分别介绍多重采样抗锯齿以及怎样在FBO中使用这一技术。一、多重采样抗锯齿技术(multisampling anti-aliasing)1、抗锯齿技术种类分类全屏反锯齿全屏反锯齿(full scene Anti-aliasing,简称FSAA),也称全屏抗锯齿,它指的是利用反锯 齿技术对输出到显示器的满屏画面信号进行放大与采样分析并重新制作满屏画面信号输出 至显示器,而不是对画面某一部分使用反锯齿技术。全屏反锯齿对于3D游戏画面有着很大

      2、 的影响,它能使整个3D游戏画面变得细腻、清晰与逼真,这是是一种重要的技术应用。全 屏抗锯齿反锯齿技术,有以下方法:超级采样抗锯齿超级采样抗锯齿(Super-Sampling Anti-aliasing,简称SSAA)此是早期抗锯齿方法,比较 消耗资源,但简单直接,先把图像映射到缓存并把它放大,再用超级采样把放大后的图像像 素进行采样,一般选取2个或4个邻近像素,把这些采样混合起来后,生成的最终像素,令 每个像素拥有邻近像素的特征,像素与像素之间的过渡色彩,就变得近似,令图形的边缘色 彩过渡趋于平滑。再把最终像素还原回原来大小的图像,并保存到帧缓存也就是显存中,替 代原图像存储起来,最后输出到显示器,显示出一帧画面。这样就等于把一幅模糊的大图, 通过细腻化后再缩小成清晰的小图。如果每帧都进行抗锯齿处理,游戏或视频中的所有画面 都带有抗锯齿效果。2而将图像映射到缓存并把它放大时,放大的倍数被用于分别抗锯齿 的效果,如:图1, AA后面的x2、x4、X8就是原图放大的倍数。超级采样抗锯齿中使用 的采样法一般有两种:顺序栅格超级采样(Ordered Grid Super-Sampling,简

      3、称OGSS),采样时选取2个邻近像 素。旋转栅格超级采样(Rotated Grid Super-Sampling,简称RGSS),采样时选取4个邻近像 素。多重采样抗锯齿多重采样抗锯齿(MultiSampling Anti-Aliasing,简称MSAA)是一种特殊的超级采样抗锯 齿(SSAA)。MSAA首先来自于OpenGI。具体是MSAA只对Z缓存(Z-Buffer )和模板缓 存(Ste ncil Buffer)中的数据进行超级采样抗锯齿的处理。可以简单理解为只对多边形的边缘 进行抗锯齿处理。这样的话,相比SSAA对画面中所有数据进行处理,MSAA对资源的消 耗需求大大减弱,不过在画质上可能稍有不如SSAA。覆盖采样抗锯齿覆盖采样抗锯齿(CoverageSampIing Anti-Aliasing,简称 CSAA)可编程过滤抗锯齿可编程过滤抗锯齿(Custom Filter An ti-Aliasi ng)2、多重采样抗锯齿技术详解首先看下面这幅图,左右对比了采样多重采样抗锯齿技术和不采用的效果对比:图一采样多重采样抗锯齿技术前后对比可以看出,左图边缘有很明显的锯齿状。导致这一现

      4、象的原因是:每个像素的绘制是由它是 否完全位于多边形内部所决定的。如果它在多边形内部,则渲染它;否则不渲染。很显然, 这是不准确的。一些像素恰好位于边缘上面。如果我们依据一个像素它位于多边形内部的区 域的大小来决定它的渲染,那么获得的效果要好很多。最终像素的颜色就是多边形颜色和其 外部的颜色的混合。你也许会认为这样会导致性能上的消耗,事实却是如此。但是我们可以 针对每个像素使用多个采样来近似估计最终结果。MSAA技术包括针对每个像素实施多个采样,然后对这些采样的结果进行混合来决定这个 像素的最终值。采样点位于像素内部的不同位置。很显然,大多数的采样点会位于多边形内 部,但是对于那些位于多边形边缘的像素,一些采样点会位于多边形外部。如果对每个像素进行4次采样,那么光栅化的频率将是不进行多重采样的4倍。对于每个像 素,片断着色器执行一次,输出结果由4个采样点中位于多边形内部的数量决定。3、在OpenGL中实现MSAA技术在OpenGL中实施这一技术非常简单,不需要过多的操作。它是通过使用额外的缓冲区来 存储子像素样本来实现的。然后这些样本被合成以生成片断的最终颜色。下面以在Qt中为例来进行

      5、说明,它和使用GLUT等API很相似。(1) 在创建OpenGL窗口的时候,需要选择支持MSAA的OpenGL上下文:Cpp代码1 QGLFormat format;2 format.setVersion(4,0);3 format.setProfile(QGLFormat:CoreProfile);4 format.setSampleBuffers(true);5 format.setSamples(4);6 QGLWidget *glView = new QGLWidget(format);(2) 判断多重采样缓冲区是否存在,以及对每个像素使用几个采样:Cpp代码7 GLint bufs, samples;8 glGetIntegerv(GL_SAMPLE_BUFFERS, &bufs);9 glGetIntegerv(GL_SAMPLES, &samples);10 printf(MSAA: buffers = %d samples = %dn, bufs, samples);(3)启用 MSAA:11 glEnable(GL_MULTISAMPLE);(4)如果要禁用MSAA,

      6、使用以下代码:Cpp代码12 glDisable(GL_MULTISAMPLE);如果使用GLUT,则使用以下代码:Cpp代码13 /申请一个采用了双重缓存,包含颜色,深度的帧缓存和多重采样。14 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_MULTISAMPLE);15 glEnable(GL_MULTISAMPLE);/开启多重缓存16 glDisable(GL_MULTISAMPLE); /关闭多重缓存二、在FBO中使用多重采样抗锯齿技术首先我们需要创建1个适用于多重采样的FBO:Cpp代码17 /创建 FBO: multisampling18 glGenFramebuffers( 1,&m_frameBufferMS);19 glBindFramebuffer(GL_FRAMEBUFFER,m_frameBufferMS);2020 glGenRenderbuffers( 1,&m_renderBufferColorMS);21 glBindRenderbuffer(GL_RENDERBUFFER

      7、,m_renderBufferColorMS);22 glRenderbufferStorageMultisample(GL_RENDERBUFFER,4,23 GL_RGB,m_subImageWidth,m_subImageHeight);24 glBindRenderbuffer(GL_RENDERBUFFER,0);25 glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,26 GL_RENDERBUFFER,m_renderBufferColorMS);2827 glGenRenderbuffers(1,&m_renderBufferDepthMS);28 glBindRenderbuffer(GL_RENDERBUFFER,m_renderBufferDepthMS);29 glRenderbufferStorageMultisample(GL_RENDERBUFFER,4,30 GL_DEPTH_COMPONENT24,m_subImageWidth,m_subImageHeight);31 glBi

      8、ndRenderbuffer(GL_RENDERBUFFER,0);32 glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,33 GL_RENDERBUFFER,m_renderBufferDepthMS);3634 glBindFramebuffer(GL_FRAMEBUFFER,0);记住需要在应用程序后面进行清除操作:Cpp代码35 glDeleteRenderbuffers(1, &m_renderBufferColorMS);36 glDeleteRenderbuffers(l, &m_renderBufferDepthMS);37 glDeleteFramebuffers(1, &m_frameBufferMS);然后在绘制物体的时候进行绑定:Cpp代码38 glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer);39 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);40 if (status !=

      9、 GL_FRAMEBUFFER_COMPLETE)41 42 cout The frame buffer status is not complete! endl;43 return;44 4845 drawing(); /draw something46 glBindFramebuffer(GL_FRAMEBUFFER,0);接下来我要用函数gIReadPixels读取数据,然后保存为BMP图像。在这里我使用了 PBO (像素缓冲区对象)。在这里需要注意的是:不能用gIReadPixels直接读取多重采样缓冲区里面的数据,否则会出现GL_INVALID_OPERATION错误。那么应该怎么做呢?一个常用的方法是创建另外一个FBO。它是一个普通的FBO,用于进行传图操作(Blit). 创建用于Blit的普通FBO:Cpp代码47 /创建普通FBO48 glGenFramebuffers( 1,&m_frameBuffer);49 glBindFramebuffer(GL_FRAMEBUFFER,m_frameBuffer);5450 glGenRenderbuffers( 1,&m_renderBufferColor);51 glBindRenderbuffer(GL_RENDERBUFFER,m_renderBufferColor);52 glRenderbufferStorage(GL_RENDERBUFFER,GL_RGB,53 m_subImageWidth,m_subImageHeight);54 glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,55 GL_RENDERBUFFER,m_rend

      《FBO中多重采样抗锯齿》由会员夏**分享,可在线阅读,更多相关《FBO中多重采样抗锯齿》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.