国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于three.js的虛擬人陰影渲染優(yōu)化方案

開(kāi)發(fā) 前端
本文將探討 three.js 中的陰影渲染機(jī)制,并分享一些針對(duì)性能和效果優(yōu)化的實(shí)用技巧,幫助開(kāi)發(fā)者在不同場(chǎng)景下做出最佳的權(quán)衡選擇。

一、前言

在3D網(wǎng)頁(yè)應(yīng)用中,高質(zhì)量的陰影渲染對(duì)于營(yíng)造場(chǎng)景的真實(shí)感至關(guān)重要。作為廣泛采用的 WebGL 框架之一,three.js 為開(kāi)發(fā)者提供了多種陰影渲染選項(xiàng),使得創(chuàng)建生動(dòng)逼真的光影效果成為可能。然而,實(shí)現(xiàn)這些視覺(jué)上的增強(qiáng)往往伴隨著性能開(kāi)銷,尤其在處理復(fù)雜場(chǎng)景或運(yùn)行于低端設(shè)備時(shí)更為明顯。因此,在確保畫面質(zhì)量的同時(shí)優(yōu)化陰影渲染,以提升用戶體驗(yàn)和保持流暢性,便成了一個(gè)核心挑戰(zhàn)。本文將解析 three.js 中的陰影渲染機(jī)制,并提供一系列實(shí)用的優(yōu)化策略,助力開(kāi)發(fā)者在不同應(yīng)用場(chǎng)景下達(dá)成最佳平衡。

二、數(shù)字人中使用的陰影

在開(kāi)發(fā)擬我形象的過(guò)程中,恰當(dāng)運(yùn)用陰影可以顯著增加模型的立體感與真實(shí)度。同時(shí),在地面上添加陰影不僅能夠?yàn)橛^察者提供空間定位的參考點(diǎn),還能大大增強(qiáng)場(chǎng)景的空間層次感和沉浸體驗(yàn)。

圖片

  1. 圖1(全局陰影)

圖片

圖2(地面陰影)

接下來(lái),我們將探討全局陰影的優(yōu)化方法以及地面陰影的具體實(shí)施方案。

三、全局陰影的優(yōu)化

全局陰影的實(shí)現(xiàn)主要依賴于 three.js 提供的 shadowMap。只需簡(jiǎn)單幾步——在 WebGLRenderer 中啟用 shadowMap 功能、定義產(chǎn)生陰影的光源以及設(shè)定哪些物體負(fù)責(zé)投射或接收陰影——即可輕松完成設(shè)置。

若僅使用 three.js 默認(rèn)配置下的陰影設(shè)置,雖然操作簡(jiǎn)便但效果通常不盡如人意。特別是在針對(duì)移動(dòng)平臺(tái)進(jìn)行開(kāi)發(fā)時(shí),考慮到性能限制,我們有必要對(duì) three.js 的陰影特性做進(jìn)一步研究:

3.1 three.js 的陰影

在 three.js 中,陰影的類型主要有兩種,分別是硬陰影(hard shadows)和軟陰影(soft shadows)。硬陰影的邊緣清晰,常用于模擬光源較小或光源位置靠近物體的場(chǎng)景;軟陰影的邊緣較模糊,更加接近現(xiàn)實(shí)中的陰影效果。這兩種陰影效果是通過(guò)不同的陰影貼圖(shadow map)類型實(shí)現(xiàn)的。以下是常見(jiàn)的陰影類型:

3.1.1 BasicShadowMap(硬陰影)

特性: 這是最基本的陰影類型,計(jì)算速度快,性能開(kāi)銷小,但效果相對(duì)簡(jiǎn)單。生成的陰影沒(méi)有柔和的邊緣,呈現(xiàn)出硬邊界。
用途: 用于性能要求較高但不太關(guān)注陰影效果的場(chǎng)景。

圖片

圖3(BasicShadowMap)

3.1.2 PCFShadowMap (Percentage-Closer Filtering)(軟陰影)

特性: 默認(rèn)的陰影類型,邊緣相對(duì)柔和。使用了一種簡(jiǎn)單的濾波技術(shù)來(lái)使陰影邊緣變得平滑。
用途: 大多數(shù)情況下推薦使用,效果較好,性能開(kāi)銷也可以接受。

圖片

圖4(PCFShadowMap)

3.1.3 PCFSoftShadowMap(軟陰影)

特性: 在 PCFShadowMap 的基礎(chǔ)上,進(jìn)一步對(duì)陰影的柔和度進(jìn)行了優(yōu)化,提供更柔和的陰影邊緣效果,但性能開(kāi)銷會(huì)更大。

用途: 用于需要較高質(zhì)量陰影效果的場(chǎng)景。

圖片

圖5(PCFSoftShadowMap)

3.1.4 VSMShadowMap (Variance Shadow Map)(軟陰影)

特性: 使用了方差陰影貼圖算法,能夠生成高質(zhì)量且無(wú)鋸齒的柔和陰影。相比 PCF 技術(shù),它可以產(chǎn)生更加平滑的效果,并且可以避免常見(jiàn)的陰影采樣問(wèn)題。但該技術(shù)可能會(huì)產(chǎn)生“光暈”現(xiàn)象。

用途: 適用于高質(zhì)量陰影場(chǎng)景,特別是需要柔和漸變的陰影效果。

圖片

圖6(VSMShadowMap)

從上面的預(yù)覽圖可以看出,對(duì)于 BasicShadowMap 和 PCFShadowMap,陰影的邊緣有比較多的鋸齒,而對(duì)于 PCFSoftShadowMap,除了有更多的性能開(kāi)銷之外,人物在動(dòng)的時(shí)候邊緣也會(huì)有明顯的閃爍的情況出現(xiàn),而且邊緣模糊半徑過(guò)大導(dǎo)致陰影的效果并不明顯。使用 VSMShadowMap 雖然可以得到相對(duì)好的效果,但是會(huì)出現(xiàn)嚴(yán)重的偽影問(wèn)題,雖然可以通過(guò)調(diào)整 shadow 的偏置值(bias)來(lái)解決,但是過(guò)大的 bias 值會(huì)使得陰影的深度測(cè)試結(jié)果偏移過(guò)多,導(dǎo)致陰影被錯(cuò)誤地渲染得過(guò)遠(yuǎn),從而產(chǎn)生不自然的視覺(jué)效果。

作為一個(gè)手機(jī)上的H5頁(yè)面,除了要保障基礎(chǔ)的視覺(jué)效果,還需要優(yōu)化性能以使其運(yùn)行在更多的設(shè)備上,為了實(shí)現(xiàn)一開(kāi)始向大家展示的效果同時(shí)不增加性能的開(kāi)銷,我們有了下面的優(yōu)化思路。

3.2 優(yōu)化思路

要想有一個(gè)比較好的陰影效果,首先不能是硬陰影,所以排除了 BasicShadowMap;

由于 PCFSoftShadowMap 對(duì)于性能的開(kāi)銷較大的同時(shí)效果提升的也不是很明顯,所以也排除掉;最后由于偽影難以控制,所以我們選擇了基于 PCFShadowMap進(jìn)行優(yōu)化。

為了得到更好的陰影邊緣,可以通過(guò)提升 shadowMap 的分辨率來(lái)優(yōu)化,但是分辨率的提升勢(shì)必會(huì)導(dǎo)致性能開(kāi)銷變大,如何在不提升貼圖分辨率的情況下提升陰影邊緣的質(zhì)量呢?

我們都知道在不同尺寸的屏幕相同分辨率的情況下,越小的屏幕顯示效果越細(xì)膩,DirectionalLight 在生成陰影時(shí),會(huì)使用一個(gè)正交相機(jī)(OrthographicCamera)來(lái)確定渲染陰影的區(qū)域。這個(gè)相機(jī)的四個(gè)邊界(left、right、top、bottom)定義了陰影貼圖的范圍。通過(guò)縮小這些邊界,可以將陰影貼圖的像素更集中于需要渲染陰影的區(qū)域,從而提升陰影的清晰度。實(shí)際上在虛擬人的場(chǎng)景中,用戶的主要注意力都集中在頭部區(qū)域,所以只要將陰影相機(jī)聚焦在頭部的區(qū)域即可,而不需要獲取全局的陰影。

const bias = 1.6 // 設(shè)置一個(gè)y軸的偏置值,使得陰影相機(jī)可以正對(duì)人臉
const mainLight = new THREE.DirectionalLight(0xf2f7ff)
mainLight.intensity = 1.8
mainLight.position.set(0.3, 0.81 + bias, 2.71)
 
const target = new THREE.Object3D()
target.position.set(0, bias, 0)  // 設(shè)置燈光的照射目標(biāo)
group.add(target)
mainLight.target = target
mainLight.castShadow = true
 
mainLight.shadow.radius = 2  // 設(shè)置陰影邊緣的模糊半徑,這個(gè)值并不是越大越好,需要根據(jù)實(shí)際場(chǎng)景進(jìn)行微調(diào)
const { camera } = mainLight.shadow
camera.far = 5
 
// 陰影相機(jī)的默認(rèn)邊界為上下左右分別為5,將其縮小至各0.5
camera.top = -0.5
camera.bottom = 0.5
camera.left = -0.5
camera.right = 0.5

左右滑動(dòng)查看完整代碼

四、地面陰影的實(shí)現(xiàn)

在最開(kāi)始的動(dòng)圖(圖2)中,除了臉部的陰影,還有一個(gè)地面的陰影,很顯然地面陰影不可能專門打一束光照在腳上獲得,這樣會(huì)使得整體的光影顯得很奇怪,那么地面陰影是怎么實(shí)現(xiàn)的呢。

實(shí)際上這里參考了 

model-viewer (https://github.com/google/model-viewer)

的實(shí)現(xiàn),地面上的陰影實(shí)際上是一個(gè)方形加上陰影貼圖:

  • 創(chuàng)建一個(gè)正交相機(jī),將相機(jī)的位置設(shè)置在腳下,朝向上方并有一點(diǎn)點(diǎn)傾角,獲取到從地面向上看的圖像;
  • 創(chuàng)建一個(gè)材質(zhì),并且自定義著色器渲染物體的深度信息,渲染第一步創(chuàng)建的相機(jī)的場(chǎng)景的時(shí)候?qū)⒉馁|(zhì)賦值給scene.overrideMaterial屬性,這樣場(chǎng)景中所有的物體都會(huì)使用這個(gè)材質(zhì)進(jìn)行渲染;
  • 再創(chuàng)建一個(gè)正交相機(jī),用于模糊第一個(gè)相機(jī)獲取到的圖像;
  • 將模糊后的圖像作為貼圖,應(yīng)用到地板平面上;
  • 此方案在每幀畫面渲染之前都要再額外先把地面陰影的場(chǎng)景渲染出來(lái),所以會(huì)增加額外的性能開(kāi)銷,由于地面陰影的邊緣經(jīng)過(guò)模糊平滑的處理,所以分辨率并不需要太高,貼圖尺寸設(shè)置為64*64即可,有效的控制地面陰影帶來(lái)的性能損失。

圖片

// 設(shè)置陰影渲染目標(biāo),作為陰影貼圖
const size = 64
const shadowTarget = new THREE.WebGLRenderTarget(size, size)
const shadowTargetBlur = new THREE.WebGLRenderTarget(size, size)
this.shadowTarget = shadowTarget
this.shadowTargetBlur = shadowTargetBlur
 
// 調(diào)整位置
this.position.set(0, -0.05, 0)
this.rotateX(Math.PI / 2)  //旋轉(zhuǎn)地板與地面平行
 
// 設(shè)置陰影相機(jī)
const camera = new THREE.OrthographicCamera(-0.75, 0.75, 0.75, -0.75, 0, 0.5)
 
// 設(shè)置地面相機(jī)的一個(gè)傾斜角度
camera.rotateX(Math.PI / 6)
camera.rotateY(Math.PI / 6)
this.add(camera)
this.camera = camera
 
// 設(shè)置視覺(jué)相機(jī)
const visionCamera = new THREE.OrthographicCamera(-0.75, 0.75, 0.75, -0.75, 0, 2)
this.add(visionCamera)
this.visionCamera = visionCamera
 
// 設(shè)置深度材質(zhì)的片段著色器
this.depthMaterial.onBeforeCompile = function (shader) {
  shader.fragmentShader = shader.fragmentShader.replace(
    'gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );',
    'gl_FragColor = vec4( vec3( 0.0 ), ( 1.0 - fragCoordZ ) * opacity );'
  )
}
 
// 創(chuàng)建地板
const planeGeometry = new THREE.PlaneGeometry(1.5, 1.5)
const material = new THREE.MeshBasicMaterial({
  opacity: 0.3,
  transparent: true,
  map: shadowTarget.texture,
  side: THREE.DoubleSide,
  color: 0x666666
})
const plane = new THREE.Mesh(planeGeometry, material)
visionCamera.add(plane)
 
const blurPlane = new THREE.Mesh(planeGeometry)
blurPlane.visible = false
visionCamera.add(blurPlane)
 
this.plane = plane
this.blurPlane = blurPlane

左右滑動(dòng)查看完整代碼

五、結(jié)語(yǔ)

針對(duì)全局陰影和地面陰影,我們采取了不同的優(yōu)化方式:

  • 通過(guò)合理選擇陰影的渲染方式、優(yōu)化陰影相機(jī)的視野范圍以及優(yōu)化陰影貼圖的分辨率,可以在保證性能沒(méi)有明顯提升的情況下顯著提升陰影的品質(zhì);
  • 通過(guò)獲取底部視角的深度信息結(jié)合自定義shader來(lái)生成地面陰影,對(duì)頁(yè)面的性能沒(méi)有明顯的損耗的同時(shí)達(dá)到一個(gè)比較好的效果。

后續(xù)也可以通過(guò)在 webview 注入機(jī)型信息,通過(guò)機(jī)型對(duì)手機(jī)的性能進(jìn)行分級(jí),調(diào)用針對(duì)性的渲染方案,可以使頁(yè)面在流暢運(yùn)行的前提下進(jìn)一步提升畫面的表現(xiàn)。為了實(shí)現(xiàn)更好的陰影效果,也可以對(duì) three.js 的陰影相機(jī)進(jìn)行擴(kuò)展,實(shí)現(xiàn)多機(jī)位 shadowMap 等能力,在不增加太多負(fù)載的情況下進(jìn)一步提升陰影的效果。

責(zé)任編輯:龐桂玉 來(lái)源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2024-07-18 06:58:36

2022-03-30 16:02:50

數(shù)字虛擬人AI元宇宙

2022-09-09 07:33:58

AI虛擬人機(jī)器人

2019-11-29 09:30:37

Three.js3D前端

2021-11-22 06:14:45

Three.js3D 渲染花瓣雨

2017-05-08 11:41:37

WebGLThree.js

2022-05-06 11:27:23

虛擬人白皮書行業(yè)

2021-04-23 16:40:49

Three.js前端代碼

2025-05-15 08:45:00

開(kāi)源前端手勢(shì)

2022-07-15 13:09:33

Three.js前端

2022-11-10 16:20:40

2021-12-14 11:44:37

可視化Three.js 信息

2022-01-16 19:23:25

Three.js粒子動(dòng)畫群星送福

2021-12-03 07:27:30

全景瀏覽Three.js

2021-07-28 15:30:32

AI 數(shù)據(jù)人工智能

2023-03-08 08:22:48

虛擬人AI作畫表情遷移

2017-12-26 10:34:57

人工智能虛擬AI

2025-06-17 08:15:00

VTK.jsThree.js3D

2022-09-16 17:20:54

人工智能元宇宙數(shù)字時(shí)代

2024-04-15 12:07:13

AI虛擬人
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产在线一区二区三区播放| 日韩porn| 国产福利久久| 高清欧美精品xxxxx在线看| 毛片网站在线免费观看| 好吊一区二区三区| 久久国产中文字幕| 欧美性xxxxx极品| 99久久99久久精品国产片| 久久电影中文字幕| 欧美午夜久久| 欧美日韩一本到| 久久久婷婷一区二区三区不卡| 午夜在线观看视频| 久久久久国产精品午夜一区| 日韩欧美一区二区不卡| 亚洲欧美日韩在线综合| 丁香花电影在线观看完整版 | 亚洲免费视频中文字幕| 国产999视频| 四虎精品在线| 久久久久91| 国产一级精品aaaaa看| 青青草国产免费一区二区下载 | 色哟哟免费网站| 欧美大片免费高清观看| 91蜜桃视频在线| 久久精品国产99国产精品澳门| 中文字幕天天干| 色老板在线视频一区二区| 精品久久香蕉国产线看观看gif| 国产免费一区二区三区在线能观看 | 欧美成人福利| 亚洲日本欧美天堂| 成人久久一区二区| caoporn免费在线视频| 岛国一区二区在线观看| 久久久久久久久久久成人| 中文在线最新版天堂8| 99亚洲一区二区| 中文字幕日韩综合av| 成人免费观看www在线| 国一区二区在线观看| dy888夜精品国产专区| 亚洲激情欧美| 欧美成人免费大片| 水莓100在线视频| 欧美日韩在线播放三区四区| 污视频在线看网站| 亚洲男人都懂的| 最大av网站| 欧美日韩一区二区三区高清| 大桥未久在线播放| 欧美巨乳在线观看| a毛片不卡免费看片| 亚洲欧洲性图库| 日韩高清dvd| 清纯唯美日韩| 麻豆精品传媒视频| 欧美电影在线观看免费| 精品电影一区二区三区| 992tv在线观看在线播放| 在线精品一区| 欧美极品美女视频网站在线观看免费| 免费看成人吃奶视频在线| 精品视频在线播放色网色视频| 午夜成在线www| 91国产丝袜在线播放| 国产成人av影视| 新狼窝色av性久久久久久| 国产精品福利在线| 成人软件在线观看| 国产成人自拍视频在线观看| 欧美性suv| 欧美在线一区二区视频| 国产精成人品2018| 91精品国产91久久综合桃花| 狠狠干夜夜操| 成人免费视频视频| 在线看视频你懂得| 日韩久久一区二区| av免费在线观| 91国偷自产一区二区开放时间 | 亚洲欧洲精品一区二区三区波多野1战4 | 国产成人一区二区三区| 蜜臀精品一区二区三区在线观看 | 91视频在线免费观看| 日韩一级电影| 久久精品国产美女| 亚洲免费观看在线观看| 成人性生交大片免费看网站| 国产成人免费av电影| 久久99精品国产91久久来源| 国产午夜精品一区| 国产精品网站导航| 北条麻妃在线视频观看| 国产99精品国产| 国产精品av免费观看| 免费av成人在线| 一区二区成人| 色综合天天狠天天透天天伊人| yy6080久久伦理一区二区| 精品久久国产老人久久综合| 男人的天堂在线视频免费观看| 性欧美在线看片a免费观看| 亚洲精品福利| 久久久久久久久久久久久久久久久久av| 亚洲影音一区| 五丁香在线视频| 久久久久久久久久久av| 大桥未久av一区二区三区中文| 蜜桃视频在线观看免费视频网站www | 欧美猛交免费看| 大尺度一区二区| 蜜桃麻豆影像在线观看| 亚洲成**性毛茸茸| 欧美大片免费高清观看| 蜜桃导航-精品导航| 日韩欧美在线播放| 色无极亚洲影院| 大波视频国产精品久久| 欧美国产97人人爽人人喊| 日韩色淫视频| 99re6这里有精品热视频| 精品国产一区二区三区久久影院 | 淫片在线观看| 成人av资源网| 在线免费不卡电影| 手机电影在线观看| 国产丝袜不卡| 欧美色大人视频| 狠狠入ady亚洲精品| 你懂的视频在线| 亚洲国产成人精品久久| 日韩午夜在线| 欧美性videos| 欧美日韩日本网| 国产91富婆露脸刺激对白| 白白色在线观看| 亚洲国产欧美日韩| 亚洲国产美女精品久久久久∴| 91九色综合| 3d动漫一区二区三区| 曰韩精品一区二区| 午夜在线视频播放| 欧美成人dvd在线视频| 精品日韩在线一区| 国产一区二区免费看| 国产1区2区视频| 国产精品免费久久久久影院| 亚洲精品偷拍| 久久精品视频观看| 欧美国产精品人人做人人爱| 91捆绑美女网站| 日韩人体视频| 奇米影视888狠狠狠777不卡| 国产日韩二区| 亚洲国产日韩欧美在线动漫| 成人小视频在线观看| 亚洲精品a区| 人人超碰在线| 国产视频在线观看一区| 欧美精品一区二区久久久| 成人综合婷婷国产精品久久免费| 精品欧美视频| 精品一区国产| 久久久久青草大香线综合精品| 搞黄视频免费在线观看| 国产一区二区日韩| 99久久影视| 久久综合久久网| 欧美午夜不卡在线观看免费| 九九九九九九精品任你躁| 中文字幕亚洲乱码| 日韩国产精品亚洲а∨天堂免| 国产欧美一区二区精品久久久| 欧美日韩亚洲免费| 一区二区三区黄色| 欧美三区不卡| 国产免费拔擦拔擦8x在线播放 | 国产91视觉| 日韩精品在线第一页| 欧美国产日产图区| 欧美另类综合| 青青国产精品| 日韩亚洲一区在线播放| 综合国产在线观看| 久久人体视频| 国产91足控脚交在线观看| 亚洲三级视频网站| 亚洲色无码播放| 久久久人人人| 久久天堂电影| 日韩一级特黄毛片| 国产日产久久高清欧美一区| 国产精品乱人伦| 日韩中文在线播放| 亚洲高清国产精品| 亚洲熟妇国产熟妇肥婆| 5566中文字幕一区二区|