位置: 编程技术 - 正文

阴影映射(Shadow Map)的研究(四)(阴影效果有什么用)

编辑:rootadmin
阴影映射(Shadow Map)的研究(四)

推荐整理分享阴影映射(Shadow Map)的研究(四)(阴影效果有什么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:阴影和映像效果,阴影啥意思,阴影效果可以应用到哪些对象?,阴影效果可以应用到哪些对象?,阴影和映像效果,阴影和映像效果,阴影映射纹理,阴影和映像效果,内容如对您有帮助,希望把文章链接给更多的朋友!

上一篇文章粗略地介绍了要实现OpenGL ES 2.0的阴影映射所需的知识难点,现在简略地说明一下:1、FBO;2、着色器;3、float的分拆以及组合。上篇文章虽然说已经成功地移植了来自Java编写的Android下阴影映射的效果,但这边采用的很大程度上是OpenGL原生代码编写的内容,接下来的目标是采用自Qt 5起就逐渐采用的Qt对OpenGL的封装类,用面向对象的思维来处理OpenGL对象,这样让代码更加优雅。

1、FBO

首先说一下FBO。在Qt中有QOpenGLFramebufferObject这个类可以实现。这个类自Qt 5.0开始启用,事实上主要对OpenGL的FramebufferObject进行了面向对象的封装。只需要指定size以及可选指定FBO的&#;式,就可以启用了。在渲染目标至FBO的时候,只需要在最开始指定

bool QOpenGLFramebufferObject::bind( )

即可,当将FBO的内容作为纹理的渲染到默认的Framebuffer的时候,只需要指定bool QOpenGLFramebufferObject::bindDefault( )

以及

GLuint QOpenGLFramebufferObject::texture( ) const

即可。使用起来非常方便。

2、着色器

接下来说一下着色器,要写基于OpenGL ES 2.0的程序,着色器是不可避免要写了。在书写OpenGL ES2.0的着色器时,要注意顶点着色器与片断着色器的差异性。目前在渲染阴影映射的时候,牵涉到2 pass的渲染,也就是说要对正常的场景渲染两遍。第一遍是在以光源为视角对整个场景进行渲染,产生深度图;第二遍是以正常摄像机为视角进行渲染,在其中引入第一遍产生的深度图,根据深度图中的深度信息以及该片断在光照视角下所产生的深度信息作比较,来最终得出该片断是否被遮挡。通常是深度的渲染信息大于改片断在光源视角下的深度信息,即表示该片断被遮挡(这里牵涉到深度缓存的相关知识,详见我之前写的文章《深度缓存(Z缓存)的研究》和《阴影映射(Shadow Map)的研究(二)》)。一旦确定被遮挡,那么使用较为深的颜色表示阴影。原理虽然简单,但是需要注意的一些陷阱还是很多的。下面是渲染深度图的顶点着色器以及片断着色器代码:

阴影映射(Shadow Map)的研究(四)(阴影效果有什么用)

这里在片断着色器中,也可以采用gl_FragCoord.z来表示片断的深度(详见我的文章《有关GLSL中的gl_FragCoord》),但是在后来的测试中,我发现这样的精度会受到影响,而且久久得不出想要的阴影效果,于是我放弃了记录gl_FragCoord.z的方案,而是自己计算深度(注意:这里计算的方法和gl_FragCoord.z默认产生的方法不一样,具体来说,是透视除法计算的时机不同)。pack( )函数采用的是普遍的一种将float打包成vec4的一种方案,下面的片断着色器也有解包的步骤。

下面是第二遍渲染的着色器代码:

这里的顶点着色器,核心的内容是将“光源的投影矩阵 * 摄像机的视图矩阵* 模型矩阵 * 模型的顶点数据”作为阴影的坐标加以储存起来,在片断处理阶段,它主要用来为深度图采样用。同样的unpack( )函数和上述提到的pack( )函数是完全相反的操作,这一对函数可以将float数据以几乎不失真的代价还原出来。

3、效果

我将第一版程序经过多次重构使用Qt的方式重写了一遍,使用QOpenGLWidget作为渲染窗体,至少能够在Linux、Windows和Mac上顺利地运行,至于能否在移动平台上运行,还没有确定,不过接下来的一次重构,将阴影映射使用Qt Quick重写,就能够在移动平台上顺利地运行了。

操作方法:鼠标左键旋转中间的立方体,右键显示深度图。下面是深度图:

程序源代码:这里

opengl 投影 glOrtho gluPerspective gluLookAt 转载不同作者的理解 1.

OpenGL 矩阵变换(讲的太好了~!) Overview几何数据——顶点位置,和标准向量(normalvectors),在OpenGL管道raterization处理过程之前可通过顶点操作(VertexOperation)和基本组合操作改变这些数据。Obj

4.3 投影变换 投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。投影也是使用矩阵来实现的。计算一个用

标签: 阴影效果有什么用

本文链接地址:https://www.jiuchutong.com/biancheng/369449.html 转载请保留说明!

上一篇:glUnmapBuffer

下一篇:opengl 投影 glOrtho gluPerspective gluLookAt 转载不同作者的理解(opengl 投影矩阵)

  • 预提所得税的计税依据
  • 电动三轮车发票和合格证丢了怎么上牌照
  • 财税通财务软件如何调整凭证间距
  • 建筑业的账务处理
  • 一般纳税人提供服务税率
  • 固定资产盘盈影响所有者权益吗
  • 一般户用途可以是往来款吗
  • 所购税控盘减免税款
  • 会计分录借贷符号
  • 通行费电子发票没有通行费字样
  • 支付费用可以通过应收账款
  • 产品税率下调企业是否要到税务部门备案
  • 在建工程试运行收入和成本怎么处理
  • 代开工资收服务费怎么做凭证?
  • 企业票据贴现属于什么业务
  • 工会经费可以购买购物卡吗
  • 企业预付一年的房租怎么做分录
  • 个人独资企业可以不开公户吗
  • 分摊长期待摊费用的会计分录
  • 印花税计入税金及附加吗
  • 公司改名字麻烦不
  • 旅行社开具的发票是不都得写旅游服务
  • 提前收取租赁收入的财务处理
  • 公司支付广告服务费账务处理
  • 所得税的税负如何算
  • 补缴员工社保银行怎么查
  • 一般纳税人转让固定资产增值税税率
  • 购材料有折让如何做会计分录?
  • win11怎么用
  • 交城建税的滞纳金是多少
  • 公司代缴社保公司吃亏吗
  • windows已禁用
  • 内置管理员无法激活
  • 笔记本电脑保养与维护
  • 阿巴拉契亚国家步道的英文怎么说
  • 在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
  • ajaxuploadfile
  • 一行简单的代码
  • 公司账户转法人账户
  • rm 删除某个文件
  • 工伤保险赔偿范围和企业承担范围
  • 一般纳税人设备安装税率
  • vite 插件开发
  • js改变内容
  • mongodb索引使用正则表达式
  • python smote算法
  • 员工意外伤害保险可以抵扣进项税吗
  • 银行代发工资必须要本行的卡吗
  • 安装sql server 2008提示重新启动计算机
  • 用sql语句查找年龄大于20
  • 公司注销章子要盖章吗
  • 留抵进项税额怎么做分录
  • 城建税退税分录怎么做
  • 让渡资产使用权收入属于收入吗
  • 通行费电子发票进项税额如何填报
  • 兼职员工对公司的好处
  • 公司基建维修承诺书
  • 建筑安装工程承包合同条例还有效吗
  • 股东投资款是否要缴税
  • 研发投入算到产值里吗
  • myeclipse中连接数据库的地方在哪
  • SQL语句查询数据库账号和权限
  • 为什么windows删除文件很慢
  • windows任务栏变色
  • win7系统怎么设置屏保
  • win7系统无法开机解决方法
  • linux网络聚合
  • cocos2dx-js
  • 批处理保存文件
  • shell脚本自动执行
  • python 如何访问数据库
  • js 原型继承的几种方法
  • 广东省电子税务局电话
  • 浦东经济开发区官网
  • 成都交通官网限号查询系统
  • 什么是金融企业的固定推销人员
  • 强化管理定义
  • 河南省纳税服务平台
  • 个人股和公司股
  • 税务发票定额
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设