<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      three.js使用Instanced Draw+Frustum Cull+LOD來渲染大場景(開源)

      大家好,本文使用three.js實現了渲染大場景,在移動端也有較好的性能,并給出了代碼,分析了關鍵點,感謝大家~

      關鍵詞:three.js、Instanced Draw、大場景、LOD、Frustum Cull、優化、Web3D、WebGL、開源

      代碼:Github

      我正在承接Web3D數字孿生項目,具體介紹可看承接各種Web3D業務

      加QQ群交流:106047770

      需求描述

      數字孿生項目通常需要渲染超大場景,比如智慧城市就需要渲染一片城市區域,甚至整個城市

      渲染大場景所需要的技術點包括:

      • Instanced Draw
        一個Draw Call批量渲染物體,物體可以有不同的Transform、Color
      • Frustum Cull
        剔除視椎體外的物體
      • Occlusion Cull
        剔除被遮擋的物體(WebGL1不支持)
      • LOD
        根據物體到相機的距離,顯示不同Level的物體。越遠的越粗糙,越近的越細致
      • GPU Driven Pipeline
        把前幾個優化都放到GPU中來做,并且物體可以有更多差異(需要WebGPU)
      • Space Partition
        使用Octree、BVH、BSP等加速結構來劃分場景,在Cull、碰撞檢測、Ray Picking等操作時查詢加速結構而不是遍歷所有物體,從而提高性能
      • Multi Thread Render
        開一個渲染線程來渲染
      • AssetBundle、Stream Load
        劃分為多個場景包,動態、流式加載

      本文使用Instanced Draw+Frustum Cull+LOD來渲染大場景,最終實現效果演示:

      image

      場景總三角面數是千萬級,總物體數量是1萬(PC端)/5000(移動端),動態物體數量是800(PC端)/400(移動端)

      其中,樹使用了Instanced Draw+LOD,白色立方體使用了Instanced Draw

      可以把相機拉進、拉遠,可看到不同Level的樹

      移動相機,可看到紅框內的Triangles在變化(大概在幾十萬到幾百萬),這是Frustum Cull后的三角面數

      在5年前的中配手機上,FPS可達15左右

      下面開始實現各個關鍵點,給出實現的思路:

      Instanced Draw

      比如要將克隆的1000個Mesh改為Instanced的,則保留它們作為source,并創建一個InstancedMesh,count設為1000,寫入1000個Mesh的世界矩陣;然后隱藏source,顯示InstancedMesh
      之所以保留source,是因為可以用它們來做碰撞檢測、Ray Picking等單個Mesh的操作

      值得注意的是物體可能是多材質的Object3D(如樹),所以要將其中的每個Mesh拆分到一組Instanced Draw中。舉例來說,如果樹有個3個材質(即3個子Mesh),則需要創建3個InstancedMesh,然后將所有樹的第一個材質的Mesh對應到第一個InstancedMesh中,其余的以此類推

      Frustum Cull

      image

      如上圖所示,實現Instanced Draw+Frustum Cull的原理是將要剔除的物體移到InstancedMesh的instanceMatrix的最后,并將count減1

      值得注意的是要將three.js默認的對單個Object3D的frustum cull關閉(即將source的frustumCulled設為false)

      另外,我們直接遍歷所有的待剔除物體來進行Fustum Cull檢測,沒有使用Octree等加速結構
      相關的討論請參考:Linear search vs Octree (Frustum cull)

      LOD

      image

      如上圖所示,假設車有3個Level的LOD層級,我們希望離相機越遠,顯示越高的Level(Geometry、Material越簡單)

      我們需要創建3個InstanceMesh,分別對應不同的Level,如下圖所示:
      image

      參考資料

      InstancedMesh2 - Easy handling and frustum culling

      What is a more straightforward way to do instance culling?

      Linear search vs Octree (Frustum cull)

      100kTrees

      LOD + Instancing

      LOD with Instancing and Multi-Material Meshes

      Three.js InstancedMesh performance optimizations - DevLog 10

      posted @ 2024-04-23 11:40  楊元超  閱讀(1261)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产亚洲精品视频一二区| 国产91久久精品一区二区| 人妻中文字幕精品系列| 强伦姧人妻免费无码电影| 秦安县| 熟女国产精品一区二区三| 国产一级毛片高清完整视频版| 久久天天躁狠狠躁夜夜躁2012| 国产无遮挡真人免费视频| 91国在线啪精品一区| 汉阴县| 人妻系列无码专区无码中出 | 毛片久久网站小视频| 他掀开裙子把舌头伸进去添视频| 一色桃子中出欲求不满人妻| 免费A级毛片无码A∨蜜芽试看 | 色悠悠国产精品免费观看| 乱人伦人妻系列| 她也色tayese在线视频| 久久午夜无码免费| 久久久久久国产精品美女| 久久这里有精品国产电影网 | 97se亚洲综合自在线| 亚洲成av人片天堂网无码| 国产360激情盗摄全集| 新邵县| 国产毛片基地| 狠狠色丁香婷婷亚洲综合| 亚洲精品尤物av在线网站| √天堂中文www官网在线| 亚洲真人无码永久在线| 亚洲一区二区精品另类| 悠悠人体艺术视频在线播放| 色狠狠色婷婷丁香五月| 午夜福利国产精品视频| 自拍偷拍第一区二区三区| 亚洲深深色噜噜狠狠网站| 久久久精品2019中文字幕之3| 午夜成人性爽爽免费视频| 内射囯产旡码丰满少妇| 熟妇的奶头又大又长奶水视频 |