背景

刚来公司的第一个项目就是通过OpenGL加载汽车的3D模型,UI设计提供了基础色(Base_Color)、粗糙度(roughness)、金属度(metallic),就是按照PBR提供的材质。之前的加载鞋子模型采用的方案是Blinn-Phone光照模型,Blinn-Phone光照模型也可以实现汽车3D模型的效果,实现过程中需要调整漫反射、高光的参数达到一个比较满意效果,与真实的效果相比较很难令人信服。所以汽车3D模型采用PBR技术实现,下面就介绍下Android端PBR Shader的实现,由于PBR理论知识相对复杂,这里只介绍带贴图的PBR的实现对于文章中涉及的其他概念请自行查阅资料。

PBR基本原理和实现

满足以下条件的光照模型才能称之为PBR光照模型:

  • 基于微平面模型(Be based on the microfacet surface model)。
  • 能量守恒(Be energy conserving)。
  • 使用基于物理的BRDF(Use a physically based BRDF)。

微平面模型

大多数PBR技术都是基于微平面理论。在此理论下,认为在微观上所有材质表面都是由很多朝向不一的微小平面组成,有的材质表面光滑一些,有的粗糙一些。
当光线射入这些微平面后,通常会产生镜面反射。对于越粗糙的表面,由于其朝向更无序,反射的光线更杂乱,反之,平滑的微平面,反射的光线更平齐。

从微观角度来说,没有任何表面是完全光滑的。由于这些微平面已经微小到无法逐像素地继续对其进行细分,因此我们只有假设一个粗糙度(Roughness)参数,然后用统计学的方法来概略的估算微平面的粗糙程度。
因此,粗糙度越高的表面,表面光线反射越分散,反之则越集中:

在实际的PBR实现中,粗糙度(Roughness)是用来调整PBR效果的一个重要参数之一
我们可以基于一个平面的粗糙度来计算出某个向量的方向与微平面平均取向方向一致的概率。这个向量便是位于光线向量

OpenGL中PBR着色器的实现相关推荐

  1. Learn OpenGL(七)——OpenGL中使用着色器的基本步骤及GLSL渲染简单示例

    OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...

  2. Opengl ES之着色器

    前言 在前面我们介绍了 OpenglEs之EGL环境搭建 ,在后面的例子中,我们将无可避免地需要使用到着色器.而着色器才是Opengl的灵魂所在,有了着色器才有了Opengl天马行空的世界. 图形渲染 ...

  3. OpenGL在frag着色器中模拟手电筒效果

    在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079) ...

  4. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  5. 【OpenGL ES】着色器Shader与程序Program

    在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...

  6. OpenGL ES _ 着色器_片断着色器详解

    OpenGL ES _ 入门_01 OpenGL ES _ 入门_02 OpenGL ES _ 入门_03 OpenGL ES _ 入门_04 OpenGL ES _ 入门_05 OpenGL ES ...

  7. 用vulkan写个引擎 (四)PBR着色器

    PBR全称(Physicallly-Based Rendering),基于物理的渲染.本文将提供一份GLSL实用型着色器.对于理论部分网络上已经有太多文章了. 仓库:https://bitbucket ...

  8. OpenGL ES像素着色器

    OpenGL ES像素着色器 原文   http://www.tairan.com/archives/7509 目 录 准备开始 像素着色器 vs 顶点/片段着色器 像素着色器101:渐变 像素着色器 ...

  9. OpenGL ES像素着色器教程

    OpenGL ES像素着色器教程 时间 2014-08-27 09:54:51   泰然 原文   http://www.tairan.com/archives/7509 主题  OpenGL ES ...

  10. 【OpenGL基础】|| 着色器介绍

    文章目录 1. GLSL 2. 数据类型 3. 输入与输出 4. uniform变量 5. 更多属性 着色器(shader)是运行在GPU上的小程序,将输入转化为输出.着色器之间不能相互通信,唯一的沟 ...

最新文章

  1. R语言进行主成分分析(PCA)、使用prcomp函数进行主成分分析:碎石图可视化(scree plot)、R通过条形图(bar plot)来可视化主成分分析的碎石图(scree plot)
  2. maven 编译mybatis项目时xml文件无法编译到target目录下的解决方法
  3. VS 条件断点学习总结2
  4. 动态代理案例1:运用Proxy动态代理来增强方法
  5. Robot Framework - Variable file
  6. Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?
  7. 分布式锁的三种实现方式_分布式锁的多种实现方式
  8. mysql vb_vb连接mysql
  9. 关于Java中子类调用父类方法
  10. php滑动轮播效果,js实现移动端手指滑动轮播图效果
  11. 通过代码控制ArcGIS Server的服务
  12. VS中使用码云gitee建立源代码管理
  13. 超靠谱,一文教会你如何注册申请安徽省实用新型专利
  14. Windows下 使用Python 3 调用讯飞 TTS 引擎实现文本转语音
  15. 【GO】panic: reflect.Value.Interface: cannot return value obtained from unexported field or method
  16. 国内首届 Flutter Festival 为热爱开启!
  17. Dynamic ODT
  18. android设置头像同时设置模糊背景
  19. 2014-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  20. 2021年软件开发趋势大预测

热门文章

  1. java for循环打印平行四边形,正三角形,菱形和空心菱形
  2. 饥荒模块显示检查工作室订阅服务器,饥荒工作室新作《欺诈之地》正式上架Steam商店...
  3. [AV1] AV1 帧内预测
  4. mac OS系统中 设置ssh连接端口
  5. 微信小程序开发|起步-工欲善其事必先利其器
  6. html新闻公告滚动效果,好用的滚动公告HTML代码
  7. tolower()函数用法
  8. 阿里云镜像下载docker
  9. 计算机网络连接无线局域网,电脑如何连接无线局域网
  10. 快手之家(aardio.net) - 开头难