前面两篇分别讲了Three.js的源码结构和Shader改写方法,本篇做一个基于Standard材质的菲涅尔。
如未读过前两篇的建议先读一下:
Three.js Shader源码结构https://www.jianshu.com/p/8de8a94ac1a9
Three.js Shader改写https://www.jianshu.com/p/5944e10d70cf

仅打开一盏平行光时最终效果如下,可以看到在原有兰伯特的基础上增加了由外向内的菲涅尔效果:

菲涅尔改写

1.改写前准备

参考前面两篇,我们的目标是改写StandardMaterial,所以我们要找到StandardMaterial的源码。打开Three.js的源码,我们发现如下两行定义了StandardMaterial的vertexShader和fragmentShader。

standard: {uniforms: mergeUniforms([
...略]),vertexShader: ShaderChunk.meshphysical_vert,fragmentShader: ShaderChunk.meshphysical_frag},

顺藤摸瓜找到meshphysical_frag指向的是fragment$5:

meshphysical_vert: vertex$5,meshphysical_frag: fragment$5,

而fragment$5最后用到的include是:

#include <dithering_fragment>

所以我们要在最后修改颜色的话,就得replace这句话。下面这段代码就实现了一个球的菲涅尔,至于菲涅尔的算法1-NdotV这里就不赘述了。

const geometry1 = new THREE.SphereGeometry(0.2, 32, 16);const material1 = new THREE.MeshStandardMaterial({ color: 0xffffff });const sphere1 = new THREE.Mesh(geometry1, material1);scene.add(sphere1);sphere1.position.y = 0.5;let uniforms = {rimColor: { value: new THREE.Color(0xff00ff) },rimPower: { value: 0.6 },}sphere1.material.onBeforeCompile = function (shader) {shader.uniforms.rimColor = uniforms.rimColor;shader.uniforms.rimPower = uniforms.rimPower;shader.fragmentShader = /* glsl */`uniform vec3 rimColor;uniform float rimPower;${shader.fragmentShader.replace('#include <dithering_fragment>','#include <dithering_fragment>\n\tfloat dotNV = 1.0-saturate( dot( normal, geometry.viewDir ) );\n\tgl_FragColor.rgb += rimPower*dotNV*rimColor;')}`;};

加载的模型的材质改写也很简单,遍历所有子物体,如果isMesh则执行.material.onBeforeCompile。


http://www.taodudu.cc/news/show-3741055.html

相关文章:

  • 现代图形学入门-18课 高级光线传播
  • 菲尼尔反射 【Unity Shader 入门精要10.1.5】
  • 渲染算法学习(三)-- Materials
  • 现代计算机图形学入门-闫令琪 17课基本材质
  • OpenGL ES2.0 菲尼尔着色器
  • 渲染算法学习(六)-- Real-Time Physically-Based Materials
  • 微服务之hystrix
  • Spring 线程池的使用和配置
  • 微服务架构技术选型
  • 微服务面试篇-Sentinel
  • 微服务预热那些事
  • 微服务常见问题
  • 通过一张图详解微服务各个组件
  • 微服务入门基础
  • 微服务可靠性测试_微服务可靠性设计
  • 微服务架构学习笔记
  • 线程池到底参数设置多少线程才合适?
  • 面试之微服务篇
  • 微服务分布式
  • 总结:微服务
  • 异步线程池
  • 微服务容错
  • 用了这么久线程池,你真的知道如何合理配置线程数吗?
  • springboot微服务实战:初探异步线程池(四种创建多线程对比)
  • 微服务入门(四)异步与线程池、MD5、RabbitMQ
  • Spring Cloud Alibaba 微服务生态基础实践,线程池的底层原理
  • KeilC51_v960a版20200626((含汉字补丁,STC15说明书,stc-isp-15xx-v6.87H)
  • 关于keil c51和mdk兼容安装后代码提示功能不见了的解决方法
  • Proteus中查看C51内存中变量的值 寄存器的值
  • Uneral UE4 虚幻 编辑器 闪退 崩溃 Unreal Engine is exiting due to D3D device being lost

Three.js MeshStandardMaterial菲涅尔实现相关推荐

  1. Shader学习21——基于菲涅尔透明的扫描线

    看到人家这样的一个效果,于是想自己也复制一个 Mar-26-2021 17-16-26.gif 想了一下思路,应该是菲涅尔的做的一个透明效果(单纯的菲涅尔透明可以看这篇),再去做了一个线的效果,线应该 ...

  2. 菲涅尔效应(Fresnel Effect)

    当光从一种具有折射率为的介质向另一种具有折射率为的介质传播时,在两者的交界处(通常称作界面)可能会同时发生光的反射和折射.菲涅尔方程描述了不同光波分量被折射和反射的情况.也描述了波反射时的相变. 如果 ...

  3. matlab菲涅尔衍射_有问必答——SYNOPSYS安装体验课堂——可以设计菲涅尔透镜吗?...

    问:SYNOPSYS可以设计菲涅尔透镜吗? 答:在USS中有多种菲涅尔面型,用户输入参数即可. 问:SYNOPSYS中具有的输入方式? 答:大家总是有个误区,以为SYNOPSYS需要输入命令运行,其实 ...

  4. Unity Shader:实现菲涅尔+色散效果的环境映射以及相关原理解析

    文章目录 1,色散在光学中的原理 2,反射的数学计算方法以及用它实现环境映射 3,折射的原理以及色散的实现 4,菲涅尔效果 5,拥有菲涅尔与色散效果的环境映射 1,色散在光学中的原理 复色光 --现实 ...

  5. Unity Shader:实现菲涅尔+色散效果以及相关原理解析

    1,色散在光学中的原理  2,反射的原理以及环境映射的实现  3,折射的原理以及色散的实现  4,菲涅尔效果  5,将菲涅尔与色散效果增加到环境映射中 1,色散在光学中的原理 复色光  --现实生活中 ...

  6. Unity Shader 水多种元素的实现(反射、折射、菲涅尔、深浅、浪花/泡沫、水波、可交互)

    综合效果 经过各元素叠加 和 程序的审美调参 后的综合效果 交互的水波与边缘浪花的合并需要优化一下 反射 两种方案: cubeMap 以水面对称设一个摄像机 cubeMap 实现:反射探针生成Cube ...

  7. 菲涅尔区,前后比,VSWR

    1.菲涅尔区 对于垂直化天线系统,波从奇数菲涅尔区反射时产生的信号更强,偶数则弱. 对于水平化天线系统,波从奇数菲涅尔区反射时产生的信号更弱,偶数则强. 2.后瓣 辐射方向与主瓣相反 3.前后比 主瓣 ...

  8. UA OPTI512R 傅立叶光学导论18 亥姆霍兹方程与惠更斯-菲涅尔原理

    UA OPTI512R 傅立叶光学导论18 亥姆霍兹方程与惠更斯-菲涅尔原理 亥姆霍兹方程 惠更斯-菲涅尔原理 亥姆霍兹方程 考虑source-free material (also linear, ...

  9. 基于Matlab——夫琅禾夫衍射以及菲涅尔衍射

            我以往在学习F分析的时候,编写了一个作业代码,在此附上供大家学习交流. 引言:     在傅里叶光学信息基础中,主要研究的是光在传播过程携带的信息如何去检测得到.如果光在自由空间(均匀 ...

最新文章

  1. 浅谈Java中15种锁的分析比较
  2. Instruments of Xcode
  3. GMGDC专訪戴亦斌:具体解释QAMAster全面測试服务6大功能
  4. git 删除已add的文件夹_如何删除还没有被add到git的文件(git clean的用法)
  5. Django-安装xadmin的方法及主要配置方法
  6. 使用NAT网关轻松为单台云服务器设置多个公网IP
  7. Django 1.8.2 文档 1
  8. url去重:布隆过滤器-python实现
  9. Android事件机制深入探讨(一)
  10. 计算机云处理器,IBM推出最新量子处理器 等于6.5万比特普通计算机
  11. 为何大多数人还在学Java 目前Java好就业吗
  12. 信号完整性(SI)电源完整性(PI)学习笔记(二十六)S参数在信号完整性中的应用(一)
  13. 如何根据原理图画封装_如何将原理图符号画得通俗易懂,看完你就学会了!
  14. ARM裸机开发——双机异步串行通信
  15. 微信小程序如何进行推广?
  16. SIM显示字 SPN,PLMN ,MCC,MNC
  17. 西工大机考《 催化剂工程》大作业网考
  18. android 设置新手引导
  19. Android UI设计之五自定义DrawView组件,实现数字签名效果
  20. 程控电阻白皮书(一)

热门文章

  1. 3ds Max 实验五 二维图形修改器的综合应用
  2. 实现字符串如果超过固定的宽高就截断的方法
  3. 非线性/线性函数拟合 Matlab nlinfit
  4. 时间序列预测模型方法
  5. swift3.0和Objective-C的交互需要注意这些
  6. 在线教育平台的盈利模式有哪些?
  7. MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别
  8. 【JS图形学基础】平面向量的计算和运用实例
  9. java实现倒酒的问题_倒酒 - Sword_Art_Online - 博客园
  10. 华哥倒酒区间标记,二分