07.three官方示例+編輯器+AI快速學習webgl_buffergeometry_attributes_integer

本實例主要講解內容

這個Three.js示例展示了WebGL 2環境下的整數屬性渲染技術。通過創建大量隨機分布的三角形,并為每個三角形分配不同的整數索引,實現了基于索引動態選擇紋理的效果。

核心技術包括:

  • WebGL 2環境下的整數屬性支持
  • 頂點著色器與片段著色器中的整數變量傳遞
  • 多紋理動態切換
  • 幾何體與材質的自定義著色器實現

在這里插入圖片描述

完整代碼注釋

<!DOCTYPE html>
<html lang="en"><head><title>three.js WebGL 2 - buffergeometry - integer attributes</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="main.css"></head><body><div id="container"></div><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> WebGL 2 - buffergeometry - integer attributes</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';let camera, scene, renderer, mesh;init();function init() {// 初始化相機camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 3500 );camera.position.z = 2500;// 初始化場景scene = new THREE.Scene();scene.background = new THREE.Color( 0x050505 );scene.fog = new THREE.Fog( 0x050505, 2000, 3500 );// 創建幾何體const triangles = 10000; // 三角形數量const geometry = new THREE.BufferGeometry();// 存儲頂點位置、UV坐標和紋理索引const positions = [];const uvs = [];const textureIndices = [];// 三角形分布范圍和大小const n = 800, n2 = n / 2; // 三角形分布的立方體范圍const d = 50, d2 = d / 2; // 單個三角形的大小// 生成隨機三角形for ( let i = 0; i < triangles; i ++ ) {// 隨機位置const x = Math.random() * n - n2;const y = Math.random() * n - n2;const z = Math.random() * n - n2;// 三角形的三個頂點const ax = x + Math.random() * d - d2;const ay = y + Math.random() * d - d2;const az = z + Math.random() * d - d2;const bx = x + Math.random() * d - d2;const by = y + Math.random() * d - d2;const bz = z + Math.random() * d - d2;const cx = x + Math.random() * d - d2;const cy = y + Math.random() * d - d2;const cz = z + Math.random() * d - d2;// 添加頂點位置positions.push( ax, ay, az );positions.push( bx, by, bz );positions.push( cx, cy, cz );// 添加UV坐標uvs.push( 0, 0 );uvs.push( 0.5, 1 );uvs.push( 1, 0 );// 添加紋理索引(0,1,2 循環)const t = i % 3;textureIndices.push( t, t, t );}// 設置幾何體屬性geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );geometry.setAttribute( 'uv', new THREE.Float32BufferAttribute( uvs, 2 ) );geometry.setAttribute( 'textureIndex', new THREE.Int16BufferAttribute( textureIndices, 1 ) );geometry.attributes.textureIndex.gpuType = THREE.IntType; // 指定GPU使用整數類型geometry.computeBoundingSphere(); // 計算邊界球體// 加載紋理const loader = new THREE.TextureLoader();const map1 = loader.load( 'textures/crate.gif' );const map2 = loader.load( 'textures/floors/FloorsCheckerboard_S_Diffuse.jpg' );const map3 = loader.load( 'textures/terrain/grasslight-big.jpg' );// 創建自定義著色器材質const material = new THREE.ShaderMaterial( {uniforms: {uTextures: {value: [ map1, map2, map3 ] // 紋理數組}},vertexShader: /* glsl */`in int textureIndex; // 從幾何體傳入的紋理索引(整數)flat out int vIndex; // "flat" 表示不進行插值(整數屬性必須)out vec2 vUv; // UV坐標void main()	{vIndex = textureIndex;vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );}`,fragmentShader: /* glsl */`flat in int vIndex; // 從頂點著色器傳入的紋理索引in vec2 vUv; // UV坐標uniform sampler2D uTextures[ 3 ]; // 紋理數組out vec4 outColor; // 輸出顏色void main()	{// 根據索引選擇不同的紋理if ( vIndex == 0 ) outColor = texture( uTextures[ 0 ], vUv );else if ( vIndex == 1 ) outColor = texture( uTextures[ 1 ], vUv );else if ( vIndex == 2 ) outColor = texture( uTextures[ 2 ], vUv );}`,side: THREE.DoubleSide, // 雙面渲染glslVersion: THREE.GLSL3 // 使用GLSL 3.0} );// 創建網格并添加到場景mesh = new THREE.Mesh( geometry, material );scene.add( mesh );// 初始化渲染器(必須支持WebGL 2)renderer = new THREE.WebGLRenderer( { antialias: true } );renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );renderer.setAnimationLoop( animate );document.body.appendChild( renderer.domElement );}// 動畫循環function animate() {const time = Date.now() * 0.001;// 旋轉網格mesh.rotation.x = time * 0.25;mesh.rotation.y = time * 0.5;renderer.render( scene, camera );}</script></body>
</html>

WebGL 2整數屬性技術解析

WebGL 2與整數屬性

WebGL 2相比WebGL 1提供了更強大的功能,包括對整數數據類型的直接支持:

  1. 整數頂點屬性:WebGL 2允許在頂點著色器中使用整數類型的屬性,這在WebGL 1中是受限的
  2. 更高的精度:支持16位和32位整數,提供更精確的數據表示
  3. 更高效的數據傳輸:整數數據可以更高效地從CPU傳輸到GPU
  4. 簡化的著色器邏輯:避免了在WebGL 1中需要將整數編碼為浮點數的復雜操作

在本示例中,我們使用了Int16BufferAttributeTHREE.IntType來定義和指定整數屬性。

頂點著色器與片段著色器通信

在著色器編程中,數據從頂點著色器傳遞到片段著色器需要特別注意:

  1. 插值行為:默認情況下,頂點著色器輸出的變量會在光柵化階段進行插值,這對于浮點數是合適的,但對于整數會導致錯誤
  2. flat限定符:使用flat限定符可以禁止插值,確保每個片段接收到的是頂點的原始整數值
  3. 數據類型匹配:頂點著色器和片段著色器中的變量類型必須嚴格匹配

在本示例中,我們使用了flat out int vIndexflat in int vIndex來確保整數數據正確傳遞。

多紋理動態選擇

本示例展示了如何基于整數屬性動態選擇不同的紋理:

  1. 紋理數組:在著色器中定義uniform sampler2D uTextures[3]來存儲多個紋理
  2. 條件判斷:在片段著色器中使用if-else語句根據整數索引選擇相應的紋理
  3. 高效切換:通過整數索引直接訪問紋理數組,避免了使用多個材質的開銷

這種技術在需要大量不同紋理的場景中非常有用,比如地形渲染、角色換裝系統等。

性能優化考慮

使用整數屬性和自定義著色器時,需要注意以下幾點:

  1. 數據類型選擇:根據實際需求選擇合適的整數類型(Byte, Short, Int),避免浪費GPU內存
  2. 批處理:將多個具有相同材質的對象合并為一個,減少Draw Call
  3. 紋理管理:確保紋理尺寸合理,并考慮使用紋理圖集(Texture Atlas)減少紋理切換
  4. 著色器復雜度:避免在片段著色器中使用復雜的條件判斷,可能影響性能

這種技術適用于需要在單個幾何體上應用多種紋理或材質屬性的場景,通過減少材質和Draw Call數量來提高渲染性能。

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

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

相關文章

WebSocket:實時通信(如聊天應用)從零到一的深度解析

簡介 在現代互聯網應用中,實時通信已成為不可或缺的核心功能。從在線聊天到金融數據監控,從協同辦公到在線游戲,實時性需求推動了WebSocket技術的廣泛應用。本文將從底層協議原理出發,結合企業級開發場景,系統講解WebSocket的實現機制、實戰技巧與優化策略。通過完整的代…

【NLP 困惑度解析和python實現】

**困惑度&#xff08;Perplexity&#xff09;**是自然語言處理和機器學習中常用的評價指標&#xff0c;尤其在評估語言模型時廣泛使用。它衡量的是一個概率模型對一個樣本&#xff08;如一句話&#xff09;的預測能力。 一、困惑度的定義 對于一個語言模型 $ P $ 和一個測試語…

編程題 02-線性結構3 Reversing Linked List【PAT】

文章目錄 題目輸入格式輸出格式輸入樣例輸出樣例 題解解題思路完整代碼 編程練習題目集目錄 題目 Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L being 1 → …

互聯網大廠Java求職面試實戰:Spring Boot到微服務全景解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 2. 我的免費工具站&#xff1a; 歡迎訪問 https://tools-6wi.pages.dev/ &#x1f601; 3. 畢業設計專欄&#xff0c;畢業…

課程11. 計算機視覺、自編碼器和生成對抗網絡 (GAN)

計算機視覺、自編碼器和生成對抗網絡&#xff08;GAN&#xff09; 自動編碼器Vanilla自動編碼器使用 AE 生成新對象. 變分 AE (VAE)AE 條件 GAN理論示例下載并準備數據GAN模型 額外知識 課程計劃&#xff1a; 自動編碼器&#xff1a; 自動編碼器結構&#xff1b;使用自動編碼器…

MarkitDown:AI時代的文檔轉換利器

在當今AI快速發展的時代,如何高效地將各種格式的文檔轉換為機器可讀的格式,成為了一個迫切需要解決的問題。今天,我們來介紹一款由微軟開發的強大工具——MarkitDown,它正是為解決這一問題而生的。 什么是MarkitDown? MarkitDown是一個用Python編寫的輕量級工具,專門用…

Python實戰案例:打造趣味猜拳小游戲

Python實戰案例&#xff1a;猜拳小游戲 文章目錄 Python實戰案例&#xff1a;猜拳小游戲一、案例背景二、代碼實現三、代碼解析3.1 執行過程3.2 流程圖 四、案例總結1. 核心知識點運用2. 編程思維提升 一、案例背景 猜拳游戲&#xff08;石頭剪刀布&#xff09;是一款規則簡單…

MCP:重塑AI交互的通用協議,成為智能應用的基礎設施

目錄: 為什么我們需要一個AI世界的USB-C?MCP的核心架構與工作原理MCP如何解決當前AI生態系統的碎片化問題從代碼到實踐:構建基于MCP的智能應用MCP的未來:從工具到生態為什么我們需要一個AI世界的USB-C? 還記得在USB-C標準普及之前,我們的數字生活是什么樣子嗎?抽屜里塞…

如何保證RabbitMQ消息的順序性?

保證RabbitMQ消息的順序性是一個常見的需求&#xff0c;尤其是在處理需要嚴格順序的消息時。然而&#xff0c;默認情況下&#xff0c;RabbitMQ不保證消息的全局順序&#xff0c;因為消息可能會通過不同的路徑&#xff08;例如不同的網絡連接或線程&#xff09;到達隊列&#xf…

HTML-2.2 列表--無序列表、有序列表、定義列表

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。小編作為新晉碼農一枚&#xff0c;會定期整理一些寫的比較好的代碼&#xff0c;作為自己的學習筆記…

Vuex和Vue的區別

Vue和Vuex有著不同的功能和定位&#xff0c;主要區別如下&#xff1a; 概念與功能 - Vue&#xff1a;是一個構建用戶界面的JavaScript框架&#xff0c;專注于視圖層的開發&#xff0c;采用組件化的方式構建應用程序&#xff0c;通過數據綁定和指令系統&#xff0c;能方便地…

數據可視化-----子圖的繪制及坐標軸的共享

目錄 繪制固定區域的子圖 &#xff08;一&#xff09;、繪制單子圖 subplot()函數 Jupyter Notebook的繪圖模式 &#xff08;二&#xff09;、多子圖 subplots()--可以在規劃好的所有區域中一次繪制多個子圖 &#xff08;三&#xff09;、跨行跨列 subplot2grid()---將整…

基于Qt6 + MuPDF在 Arm IMX6ULL運行的PDF瀏覽器——MuPDF Adapter文檔

項目地址&#xff1a;總項目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子項目地址&#xff1a;CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 這個部分說的是Mupdf_adaper下的文檔的工…

Linux 防火墻 firewalld 實戰配置教程!

最近工作上處理了很多關系配置服務器防火墻的操作&#xff0c;于是想寫一篇理論與實踐并存的文章&#xff0c;在這里分享給大家&#xff0c;希望對您有所幫助&#xff01; 主要包括以下幾部分內容&#xff1a; 防火墻概述 firewalld原理框架 與iptables的異同點 firewalld常…

C#發送文件到藍牙設備

測試環境&#xff1a; visual studio 2022 win11筆記本電腦&#xff0c;具有藍牙功能 .net6控制臺 測試步驟如下&#xff1a; 1 新增名為BluetoothDemo控制臺項目 2 通過nuget安裝InTheHand.Net.Bluetooth&#xff0c;版本選擇4.2.1和安裝InTheHand.Net.Obex&#xff0c;版…

初識 Pandas:Python 數據分析的利器

在數據分析、數據清洗和可視化等領域&#xff0c;Python 無疑是最受歡迎的語言之一&#xff0c;而在 Python 的數據處理生態中&#xff0c;Pandas 是最核心、最基礎的庫之一。如果你接觸數據分析、機器學習、金融建模&#xff0c;或者只是想處理一些 Excel 表格&#xff0c;那么…

SpringBoot項目使用POI-TL動態生成Word文檔

近期項目工作需要動態生成Word文檔的需求&#xff0c;特意調研了動態生成Word的技術方案。主要有以下兩種&#xff1a; 第一種是FreeMarker模板來進行填充&#xff1b;第二種是POI-TL技術使用Word模板來進行填充&#xff1b; 以下是關于POI-TL的官方介紹 重點關注&#xff1…

fakeroot 在沒有超級用戶權限的情況下模擬文件系統的超級用戶行為

fakeroot 是一個在 Linux 環境中使用的工具&#xff0c;它允許用戶在沒有超級用戶權限的情況下模擬文件系統的超級用戶行為。它是一個在 Linux 環境中廣泛使用的工具&#xff0c;通常包含在大多數 Linux 發行版的軟件倉庫中。? 主要功能 ?模擬 root 權限?&#xff1a;fake…

Spring Spring Boot 常用注解整理

Spring & Spring Boot 常用注解整理 先理解核心概念&#xff1a;什么是注解&#xff08;Annotation&#xff09;&#xff1f;第一部分&#xff1a;IOC&#xff08;控制反轉&#xff09;和 DI&#xff08;依賴注入&#xff09;1. Component2. Service, Repository, Controll…

AIGC與數字媒體實驗室解決方案分享

第1部分 概述 1.1 建設目標 1.深度融合AIGC技術&#xff0c;培養能夠駕馭新質生產力的數字媒體人才 通過引入前沿的AIGC技術&#xff0c;確保學生能夠接觸到最先進的人工智能應用。教學內容理論和實踐結合&#xff0c;讓學生在實際操作中熟練掌握AIGC工具&#xff0c;生成高…