位置: 编程技术 - 正文

使用着色器模拟雾效果(着色器模型)

编辑:rootadmin

推荐整理分享使用着色器模拟雾效果(着色器模型),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:着色器模型,着色器怎么用,使用着色器模拟软件,着色器模型,着色器编写,着色器调试,使用着色器模拟软件,使用着色器模拟软件,内容如对您有帮助,希望把文章链接给更多的朋友!

上一篇关于天空盒的blog谈到了雾效果,那么这次来讨论一下用着色器实现雾效果的具体实现方法.

雾在大自然中是一种常见的天气现象,比如清晨时分在山上就能看到这种效果.我们可以使用OpenGL轻松地模拟出来,使用固定管线设置GL_FOG_COLOR,GL_FOG_DENSITY,GL_FOG_START,GL_FOG_END,GL_FOG_MODE等GL_FOG系列参数,然后调用glEnable(GL_FOG)最后渲染场景即能看到这种效果了.事实上这种固定管线的实现只是向API传递一些参数而已,而且在OpenGL2.x版本以后就不推荐使用固定管线,甚至在3.x版本之后逐渐废弃了.使用固定管线看&#;很简单,事实上我们并不清楚它的工作原理,更要命的是在一些新的显卡上使用固定管线会出现一些奇怪的问题,甚至在OpenGL ES 2.0任何固定管线的东西都不能再用了.那么怎么办捏? 嗯...用着色器实现!

首先让我们来看下雾效果的公式:

GL_LINEAR: fogFactor=(end-z)/(end-start)

GL_EXP: fogFactor=e^(-(density*z))

GL_EXP2: fogFactor=e^(-(density*z)^2)

雾效果有三种实现公式,EXP2优于EXP,EXP优于LINEAR.这里density相当于GL_FOG_DENSITY即雾的浓度,可以根据个人口味调整,z是摄像机到顶点?片段?(根据雾效果的细致程度而定)的距离(也可以用两者z&#;之差近&#;,效果其实差不多,后者没有距离运算效率更高些),e就是数学常量与对数运算密切相关如同PI之于圆.

既然知道了公式,那么是时候上干货了:

Vertex Shader:

[plain] view plaincopyuniform float fogDensity; varying float fogFactor; float gainFogFactor(vec4 vecPos) { float LOG2E = 1.; float fogDist = abs(vecPos.z); float result = exp2( -fogDensity * fogDensity * fogDist * fogDist * LOG2E ); result = clamp(result, 0.0, 1.0); return result; } void main() { ... gl_Position = ftransform(); fogFactor = gainFogFactor(gl_Position); } 看明白了么? 嗯,这段代码是EXP2公式的实现,解释一下,exp2(n)用于计算2的n次方,我们把它重新组合一下:2^(-density^2 * z^2 * log2e)=(2^(log2e))^(-density^2 * z^2),又使用着色器模拟雾效果(着色器模型)

2^log2e=e那么最终的结果是e^((-density^2 * z^2))=e^(-(density*z)^2)也就是上面的EXP2算法,这里fogDist就是摄像机到顶点在z轴方向上的距离即z.

这边怎么能把经过投影变换的顶点坐标给当作参数传递给gainFogFactor函数捏?其实在雾的计算当中我们只要用到z坐标就行了,投影变换并不会改变z坐标的大小,换句话说,这边的gl_Position.z依然是摄像机到顶点在z轴方向上的距离之差.

接着是Fragment Shader:

[plain] view plaincopyuniform samplerCube texCube; uniform vec4 fogColor; uniform int isFog; varying vec3 texCoord; varying float fogFactor; vec4 gainFinalColor(vec4 srcColor) { vec4 result = mix(fogColor, srcColor, fogFactor); return result; } void main() { vec4 texColor = textureCube(texCube, texCoord); if(isFog == 1) gl_FragColor = gainFinalColor(texColor); else gl_FragColor = texColor; } 根据雾化因子把雾的颜色与片段颜色混合一下即得到最终的结果.

不开雾:

开启雾:

哈,效果出来了! 嗯,移动摄像机看看.

这就是雾模拟的一种实现.看懂了么? 什么?数学还给老师了? 赶紧敲一遍代码体会一下!

OpenGL学习之API详解 转载自

Build Qt5.3.1 for Freescale I.MX6Q based Linux 3.0. 在移植QT5到IMX6Qlinux平台时,一次又一次的升级,带来了一些明显的性能提升,这说明在嵌入式上,QT底层对OpenGLegl的优化做的越来越好,越来越兼容.在Qt5.1-Qt5.2

OpenGL OpenGL(OpenGraphicsLibrary)定义了一个跨编程语言、跨平台的编程接口规的专业的图形程序接口。它用于二维和三维图像,是一个底层图形库。OpenGLES(OpenGLforEm

标签: 着色器模型

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

上一篇:用球体模拟天空(用球体模拟天空的游戏)

下一篇:OpenGL学习之API详解(opengl api version)

  • 税控盘是干什么用的
  • 税收管辖权是什么的重要组成部分
  • 清算组的性质
  • 员工垫付的费用报销会计分录
  • 企业留存的盈余公积属于哪个会计科目
  • 老板住酒店的住宿费发票入什么会计科目
  • 发票用完了领发票需要带什么东西
  • 公司购买汽车的购置税怎么做账
  • 运输费增值税专用发票几个点
  • 税款所属期什么意思
  • 董事费监事费个税计算
  • 房地产公司产品无偿提供他人使用 税
  • 小企业营业外收入明细
  • 机关和事业单位哪个好
  • 因质量问题怎么赔偿
  • 地税局返的个人所得税手续费多久返还?
  • 税务局代开票流程是怎样的?
  • 预缴增值税怎么填表
  • 代开专票需要去报税吗?
  • 房产税要来了!租金也要交,最高达到12%
  • 某物业公司组织工人进入下水道
  • 过路过桥费电子票验证
  • 先抵押 后租赁
  • 商品流通企业代表企业
  • 合同银行账户与开票信息不一致会计如何处理
  • 信用卡核销是什么意思
  • 在建工程的工资计入哪里
  • 资产处置收益计入哪个会计科目
  • 发票丢失登报声明怎么写
  • 修叉车这个工作怎么样
  • 一次性购房发票什么时候给开
  • 2021新版win10
  • 建筑工程简易计税可以抵扣吗
  • AquariumDesktop.exe进程危险吗 AquariumDesktop是什么进程
  • 开具给个人的发票哪里查询
  • 按简易办法征收增值税的行为有
  • kazaalite.exe是什么进程 kazaalite进程有什么用
  • 设置浏览器显示网络异常
  • thinkphp curl
  • 野生动植物种源包括
  • 预付款发票不能回来了怎么处理
  • 提取现金 备发工资
  • php mysql_list_dbs()函数用法示例
  • 前端面试题校招
  • 生态位模型原理
  • php charat
  • ppp中启用chap命令
  • 可转换优先股会稀释股权吗
  • 从网上学电脑下载什么软件
  • 增值税专用发票的税率是多少啊
  • 酒店收入是什么收入
  • 关税完税价格计算增值税
  • 广告设计要交文化事业建设
  • 可转债中签卖出流程
  • 增值税一般纳税人是什么意思
  • 记账凭证核算处理方法
  • 去年暂估费用,今年收到发票怎么处理
  • 公共电话亭的话费怎么算
  • 一般纳税人资格证书怎么查询
  • 堤围防护费是什么
  • 现金日记账是会计人员根据审核后的
  • 逐步测试法计算内含报酬率
  • 私车公用税务处理
  • 零余额账户银行日记账
  • 金蝶计价方法在哪里
  • 无形资产减值准备是什么科目
  • MySQL删除重复数据只保留一条
  • win10 9月更新 问题
  • centos破解密码命令
  • task host windows解决
  • WIN7系统如何设置表格默认保存位置
  • win10专业版怎么安装
  • linux文件复制到windows
  • Android自定义对话框
  • javascript高级程序设计pdf百度云
  • pm2系统的操作
  • 甘肃税务局电子税务局app
  • 2019税务系统升级
  • 陕西电子税务电话是多少
  • 摩托车的消费税计税依据
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设