three.js各向异性shader实现记录

2024-02-12 14:28

本文主要是介绍three.js各向异性shader实现记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

        • `WebGLMaterials`
        • `ShaderLib`
        • `lights_physical_fragment.glsl`
        • `lights_fragment_maps.glsl`
        • `lights_physical_pars_fragment.glsl`
        • `lights_fragment_begin.glsl`

WebGLMaterials
if ( material.anisotropy > 0 ) {uniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );if ( material.anisotropyMap ) {uniforms.anisotropyMap.value = material.anisotropyMap;refreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );}}
ShaderLib
anisotropyVector: { value: /*@__PURE__*/ new Vector2() },
anisotropyMap: { value: null },
anisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },

meshphysical.glsl

#ifdef USE_ANISOTROPYuniform vec2 anisotropyVector;#ifdef USE_ANISOTROPYMAPuniform sampler2D anisotropyMap;#endif
#endif
lights_physical_fragment.glsl
#ifdef USE_ANISOTROPY#ifdef USE_ANISOTROPYMAPmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );vec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;vec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;#elsevec2 anisotropyV = anisotropyVector;#endifmaterial.anisotropy = length( anisotropyV );if( material.anisotropy == 0.0 ) {anisotropyV = vec2( 1.0, 0.0 );} else {anisotropyV /= material.anisotropy;material.anisotropy = saturate( material.anisotropy );}// Roughness along the anisotropy bitangent is the material roughness, while the tangent roughness increases with anisotropy.material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;#endif
lights_fragment_maps.glsl

#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )#ifdef USE_ANISOTROPYradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );#else
#endif
lights_physical_pars_fragment.glsl

vec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {vec3 f0 = material.specularColor;float f90 = material.specularF90;float roughness = material.roughness;float alpha = pow2( roughness ); // UE4's roughnessvec3 halfDir = normalize( lightDir + viewDir );float dotNL = saturate( dot( normal, lightDir ) );float dotNV = saturate( dot( normal, viewDir ) );float dotNH = saturate( dot( normal, halfDir ) );float dotVH = saturate( dot( viewDir, halfDir ) );vec3 F = F_Schlick( f0, f90, dotVH );#ifdef USE_IRIDESCENCEF = mix( F, material.iridescenceFresnel, material.iridescence );#endif#ifdef USE_ANISOTROPY// 这里用的 anisotropyT 和 anisotropyB 就是各向异性处理中增加的属性// material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;// material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;float dotTL = dot( material.anisotropyT, lightDir );float dotTV = dot( material.anisotropyT, viewDir );float dotTH = dot( material.anisotropyT, halfDir );float dotBL = dot( material.anisotropyB, lightDir );float dotBV = dot( material.anisotropyB, viewDir );float dotBH = dot( material.anisotropyB, halfDir );float V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );float D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );#elsefloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );float D = D_GGX( alpha, dotNH );#endifreturn F * ( V * D );}
void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {//直接镜面反射reflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );
}

将RE_Direct_Physical 方法 定义成 RE_Direct 使用

#define RE_Direct				RE_Direct_Physical
lights_fragment_begin.glsl
RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight )

NUM_POINT_LIGHTS NUM_SPOT_LIGHTS NUM_DIR_LIGHTS 点光源,聚光灯,方向光 这三种 进行每个类型灯光遍历执行大致如下 点光源例

IncidentLight directLight;#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )PointLight pointLight;#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0PointLightShadow pointLightShadow;#endif#pragma unroll_loop_startfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {pointLight = pointLights[ i ];getPointLightInfo( pointLight, geometryPosition, directLight );#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )pointLightShadow = pointLightShadows[ i ];directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;#endifRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );}#pragma unroll_loop_end#endif

这篇关于three.js各向异性shader实现记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702764

相关文章

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化