Three.js陰影

目錄

Three.js入門

Three.js光源

Three.js陰影

Three.js紋理貼圖

使用燈光后,場景中就會產生陰影。物體的背面確實在黑暗中,這稱為核心陰影(core shadow)。我們缺少的是落下的陰影(drop shadow),即對象在其他對象上創建陰影。本文主要探索是落下的陰影(drop shadow)的相關內容。

陰影

支持陰影的光源類型

前面的文章我們有介紹過,只有部分光源支持陰影:

  • 平行光(DirectionalLight)
  • 點光源(PointLight)
  • 聚光燈(SpotLight)

它們對應的陰影在three.js中也有對應的實現類:

  • 平行光陰影(DirectionalLightShadow)
  • 點光源陰影(PointLightShadow)
  • 聚光燈陰影(SpotLightShadow)

陰影的代碼實現

在入門系列中有介紹陰影的基本代碼實現,這里再簡單敘述一遍。主要分為四個步驟:

  1. 告訴渲染器顯示陰影貼圖;
    renderer.shadowMap.enabled = true;
    
  2. 對需要投影的物體設置castShadowtrue
    sphere.castShadow = true; 
    
  3. 對需要接收投影的物體設置receiveShadowtrue
    plane.receiveShadow = true; 
    
  4. 最后,對可以產生陰影的光源設置castShadowtrue
    light.castShadow = true;
    

至此,我們應該就可以在接收投影的物體上看到陰影了!

陰影的實現原理

每次渲染時,three.js 將為每個支持陰影的光源都會做一次渲染。

  • 光源具有一個相機,以這個相機為視角進行渲染;
  • 光源的渲染結果被作為紋理存儲起來,也就是 陰影貼圖(shadow map);
  • 陰影貼圖將被用于所有需要接受陰影的材質(material),并投影到幾何體(geometry)上。

    有些材質不接受光照,所以材質也會影響陰影的顯示。

在這里插入圖片描述

陰影的優化和調整

陰影貼圖大小
directionalLight.shadow.mapSize.width = 1024;
directionalLight.shadow.mapSize.height = 1024;
  • 陰影貼圖越大約清晰,但是越消耗資源;
  • 512和1024大小對比圖,就可以看出來對比效果是1024更清晰(運行效果更明顯)。
    在這里插入圖片描述
相機設置
幅度

我們先來看一個陰影不完整的現象:

不完整

正交相機OrthographicCamera

平行光源用的是正交相機進行渲染:

export class DirectionalLight extends Light<DirectionalLightShadow> {shadow: DirectionalLightShadow;
}export class DirectionalLightShadow extends LightShadow<OrthographicCamera> {camera: OrthographicCamera;
}
  1. 用相機輔助線看一下光線的陰影的相機視角:
const cameraHelper = new THREE.CameraHelper(directionalLight.shadow.camera);
scene.add(cameraHelper);

在這里插入圖片描述
球體超過了陰影的相機視角的上邊緣。

  1. 擴大相機的上邊緣
directionalLight.shadow.camera.top = 8; // 這個值不是固定的,視場景不同

在這里插入圖片描述

far

和相機的渲染一致,設置相機的far,可以控制是否顯示陰影。

directionalLight.shadow.camera.far = 100;

在這里插入圖片描述

Blur 模糊

我們可以使用 radius 屬性控制陰影模糊:

directionalLight.shadow.radius = 20

在這里插入圖片描述

陰影的邊緣會有模糊的效果。

陰影的類型

Three.js中,ShadowMapType枚舉定義了幾種陰影映射的類型:

  • BasicShadowMap:基本陰影映射類型,使用簡單的陰影投影算法生成陰影。這是默認的陰影映射類型。

性能優秀但是質量不好(默認)

  • PCFShadowMap:使用 Percentage-Closer Filtering (PCF)技術生成陰影,以獲得更平滑的陰影邊緣效果。

性能稍差但是擁有光滑的邊緣

  • PCFSoftShadowMap:使用軟陰影技術生成陰影,通過多次采樣和模糊處理來產生更柔和的陰影效果。

性能稍差但是擁有更 soft 的邊緣

  • VSMShadowMap:使用Variance Shadow Mapping (VSM)技術生成陰影,以獲得更高質量的陰影效果和更柔和的陰影邊緣。

性能稍差,更多限制,有著意想不到的效果

代碼實現:

renderer.shadowMap.type = THREE.BasicShadowMap;

我項目中使用,倒是看不出來有啥大的區別。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34966.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】——棧、隊列的相關習題

目錄 題型一&#xff08;棧與隊列的基本概念&#xff09;題型二&#xff08;棧與隊列的綜合&#xff09;題型三&#xff08;循環隊列的判空與判滿&#xff09;題型四&#xff08;循環鏈表表示隊列&#xff09;題型五&#xff08;循環隊列的存儲&#xff09;題型六&#xff08;循…

一文揭秘餓了么跨端技術的演進、實踐與落地

跨端技術背景與演進歷程 跨端&#xff0c;究竟跨的是哪些端&#xff1f; 自 90 年的萬維網出現&#xff0c;而后的三十多年&#xff0c;我們依次經歷了 PC 時代、移動時代&#xff0c;以及現在的萬物互聯&#xff08;的 IoT &#xff09;時代&#xff0c;繁榮的背后&#xff…

【Apollo】Apollo-ros版本架構學習與源碼分析

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 這篇文章主要介紹Apollo-ros版本架構學習與源碼分析。 無專精則不能成&#xff0c;無涉獵則不能通。——梁啟超 歡迎來到我的博客&#xff0c;一起學習&#xff0c;共同進步。 喜歡的朋友可以關注一下&a…

微信小程序如何自定義分享卡片文案和圖片

微信小程序提供了onShareAppMessage方法&#xff0c;專門用來監聽用戶點擊頁面內轉發按鈕&#xff08;button 組件 open-type"share"&#xff09;或右上角菜單“轉發”按鈕的行為&#xff0c;并自定義轉發內容。 > 注意&#xff1a;只有定義了此事件處理函數&…

Android studio 設置安卓手機

參考這個鏈接 ghttps://developer.android.com/studio/debug/dev-options 列出常用手機的設置&#xff0c;但是我的手機不在此列 Google Pixel Settings > About phone > Build number Samsung Galaxy S8 and later Settings > About phone > Software informa…

git: ‘lfs‘ is not a git command. see ‘git --help‘

在克隆hugging face里面的項目文件的時候&#xff0c;需要用到git lfs&#xff0c;本文介紹安裝git lfs方法 在Ubuntu下 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs在Windows下 到這個鏈…

解決GitHub的速度很慢的幾種方式

1. GitHub 鏡像訪問 這里提供兩個最常用的鏡像地址&#xff1a; https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是說上面的鏡像就是一個克隆版的 GitHub&#xff0c;你可以訪問上面的鏡像網站&#xff0c;網站的內容跟 GitHub 是完整同步…

期權定價模型系列【4】—期權組合的Delta-Gamma-Vega中性

期權組合的Delta-Gamma-Vega中性 期權組合構建時往往會進行delta中性對沖&#xff0c;在進行中性對沖后&#xff0c;期權組合的delta敞口為0&#xff0c;此時期權組合仍然存在gamma與vega敞口。因此研究期權組合的delta-gamma-vega敞口中性是有必要的。 本文旨在對delta-gamma-…

關于新手學習STM32開發應該如何入門?

對于新手來說&#xff0c;學習STM32開發可能會感到困惑&#xff0c;尤其是在拿到開發板后該如何入門。在這里有嵌入式學習路線&#xff0c;畢設&#xff0c;各種項目&#xff0c;需要留個6。以下是部分內容概述&#xff1a;硬件介紹&#xff1a;了解STM32開發板的基本硬件組成和…

Springboot 默認路徑說明

Spring Boot基本上是Spring框架的擴展&#xff0c;它消除了設置Spring應用程序所需的樣板配置&#xff0c;極大的方便了開發者&#xff0c;其默認識別路徑如下&#xff1a; Spring Boot 作為Spring默認將 /** 所有訪問映射到以下目錄&#xff1a; 1、classpath:/static 用于加…

【密碼學】穴居人密碼

穴居人密碼 文字記載中&#xff0c;有時會把來自古希臘文化之前的各種記錄作為密碼學的例子&#xff0c;但稱它們為密碼學一定太不嚴格了&#xff0c;這是因為那些方法都太原始了。密碼學的起源能追溯到多早&#xff0c;取決于你把密碼學的相關定義確定得有多寬泛。大多數作者都…

每日后端面試5題 第四天

1. 線程池的核心參數&#xff08;高薪常問&#xff09; &#xff08;1&#xff09;corePoolSize&#xff1a;核心線程個數 &#xff08;2&#xff09;maximumPoolSize&#xff1a;最大線程個數 &#xff08;3&#xff09;keepAliveTime&#xff1a;最大存活時間 &#xff0…

如何在Vue中進行單元測試?什么是Vue的模塊化開發?

1、如何在Vue中進行單元測試&#xff1f; 在Vue中進行單元測試可以提高代碼的可維護性和可讀性&#xff0c;同時也能夠幫助開發者更快地找到代碼中的問題和潛在的錯誤。下面是一些在Vue中進行單元測試的步驟&#xff1a; 安裝單元測試工具 首先需要安裝一個單元測試工具&…

第8章 【C語言】善于利用指針

8.1 指針是什么 由于通過地址能找到所需的變量單元&#xff0c;可以說&#xff0c;地址指向該變量單元。將地址形象化稱為“指針”。 直接按變量名進行的訪問&#xff0c;稱為“直接訪問”方式。 還可以采用另一種稱為“間接訪問”的方式&#xff0c;即將變量i的地址存放在另…

如何讓你的圖片服務也有類似OSS的圖片處理功能

原文鏈接 前言 有自己機房的公司一般都有一套存儲系統用于存儲公司的圖片、視頻、音頻、文件等數據&#xff0c;常見的存儲系統有以NAS、FASTDFS為代表的傳統文件存儲&#xff0c;和以Minio為代表的對象存儲系統&#xff0c;隨著云服務的興起很多公司逐漸將數據遷移到以阿里云…

二叉樹的性質和完全二叉樹的性質

二叉樹的性質&#xff1a; 在二叉樹的第i層至多有 2 i 1 ( i > 1 ) 2^{i1}(i>1) 2i1(i>1) 深度為k的二叉樹最多有 2 k ? 1 2^k-1 2k?1個結點 對于任意一棵二叉樹T&#xff0c;如果其終端結點數為 n 0 n_0 n0?&#xff0c;度為2的結點數為 n 2 n_2 n2?,則 n 0 …

【劍指 Offer 39】數組中超過一半的數字

題目&#xff1a; 數組中有一個數字出現的次數超過數組長度的一半&#xff0c;請找出這個數字。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例&#xff1a; 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2 思考&#xff1a; 方法一&#xff1a;投…

5.0 Python 定義并使用函數

函數是python程序中的基本模塊化單位&#xff0c;它是一段可重用的代碼&#xff0c;可以被多次調用執行。函數接受一些輸入參數&#xff0c;并且在執行時可能會產生一些輸出結果。函數定義了一個功能的封裝&#xff0c;使得代碼能夠模塊化和組織結構化&#xff0c;更容易理解和…

企業有VR全景拍攝的需求嗎?能帶來哪些好處?

在傳統圖文和平面視頻逐漸疲軟的當下&#xff0c;企業商家如何做才能讓遠在千里之外的客戶更深入、更直接的詳細了解企業品牌和實力呢&#xff1f;千篇一律的紙質材料已經過時了&#xff0c;即使制作的再精美&#xff0c;大家也會審美疲勞&#xff1b;但是你讓客戶遠隔千里&…

(MySQL經驗)之MySQL單表行數最好低于2000w

作為在后端開發&#xff0c;是不是經常聽到過&#xff0c;mysql 單表最好不要超過 2000w,單表超過 2000w 就要考慮數據遷移了&#xff0c;表數據都要到 2000w &#xff0c;查詢速度變得賊慢。 1、建表操作 建一張表 CREATE TABLE person( id int NOT NULL AUTO_INCREMENT PRI…