08.webgl_buffergeometry_attributes_none ,three官方示例+編輯器+AI快速學習

本實例主要講解內容

這個Three.js示例展示了無屬性幾何體渲染技術,通過WebGL 2的gl_VertexID特性和偽隨機數生成算法,在著色器中動態計算頂點位置和顏色,而不需要在CPU端預先定義幾何體數據。

核心技術包括:

  • WebGL 2的頂點ID特性
  • 著色器中的偽隨機數生成
  • 無屬性幾何體渲染
  • 純GPU端的幾何體生成

在這里插入圖片描述

完整代碼注釋

<!DOCTYPE html>
<html lang="en"><head><title>three.js WebGL 2 - buffergeometry - attributes - none</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="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> WebGL 2 - buffergeometry - attributes - none</div><!-- 頂點著色器 --><script id="vertexShader" type="x-shader/x-vertex">uniform mat4 modelViewMatrix;uniform mat4 projectionMatrix;uniform float seed; // 隨機數種子// IEEE 754浮點數常量const uint ieeeMantissa = 0x007FFFFFu;const uint ieeeOne = 0x3F800000u;// 哈希函數 - 生成偽隨機無符號整數uint hash(uint x) {x += ( x << 10u );x ^= ( x >>  6u );x += ( x <<  3u );x ^= ( x >> 11u );x += ( x << 15u );return x;}// 二維哈希函數uint hash(uvec2 v) { return hash( v.x ^ hash(v.y) ); }// 生成0-1之間的偽隨機浮點數float hashNoise(vec2 xy) {uint m = hash(floatBitsToUint(xy));m &= ieeeMantissa;m |= ieeeOne;return uintBitsToFloat( m ) - 1.0;}// 生成指定范圍內的偽隨機浮點數float pseudoRandom(float lower, float delta, in vec2 xy) {return lower + delta*hashNoise(xy);}// 生成指定范圍內的偽隨機三維向量vec3 pseudoRandomVec3(float lower, float upper, int index) {float delta = upper - lower;float x = pseudoRandom(lower, delta, vec2(index, 0));float y = pseudoRandom(lower, delta, vec2(index, 1));float z = pseudoRandom(lower, delta, vec2(index, 2));return vec3(x, y, z);}out vec3 vColor; // 輸出到片段著色器的顏色void main()	{// 計算頂點位置// 使用 gl_VertexID 作為索引生成偽隨機位置// 每個三角形的三個頂點共享相同的基礎位置,添加微小偏移形成三角形const float scale = 1.0/64.0;vec3 position = pseudoRandomVec3(-1.0, +1.0, gl_VertexID/3) + scale * pseudoRandomVec3(-1.0, +1.0, gl_VertexID);// 計算頂點顏色vec3 color = pseudoRandomVec3(0.25, 1.0, gl_VertexID/3);// 設置頂點位置和顏色gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0 );vColor = color;}</script><!-- 片段著色器 --><script id="fragmentShader" type="x-shader/x-fragment">precision mediump float;in vec3 vColor; // 從頂點著色器傳入的顏色out vec4 fColor; // 最終輸出顏色void main()	{fColor = vec4(vColor, 1); // 使用傳入的顏色作為片段顏色}</script><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 = 4;// 初始化場景scene = new THREE.Scene();scene.background = new THREE.Color( 0x050505 );scene.fog = new THREE.Fog( 0x050505, 2000, 3500 );// 創建幾何體// 注意:這里沒有設置任何頂點屬性,所有數據都在著色器中生成const triangleCount = 10000;const vertexCountPerTriangle = 3;const vertexCount = triangleCount * vertexCountPerTriangle;const geometry = new THREE.BufferGeometry();geometry.setDrawRange( 0, vertexCount ); // 僅設置繪制范圍// 創建材質const material = new THREE.RawShaderMaterial( {uniforms: {seed: { value: 42 }, // 設置隨機數種子},vertexShader: document.getElementById( 'vertexShader' ).textContent,fragmentShader: document.getElementById( 'fragmentShader' ).textContent,side: THREE.DoubleSide, // 雙面渲染glslVersion: THREE.GLSL3 // 使用GLSL 3.0} );// 創建網格mesh = new THREE.Mesh( geometry, material );mesh.frustumCulled = false; // 禁用視錐體剔除scene.add( mesh );// 初始化渲染器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( time ) {// 旋轉網格mesh.rotation.x = time / 1000.0 * 0.25;mesh.rotation.y = time / 1000.0 * 0.50;renderer.render( scene, camera );}</script></body>
</html>

無屬性幾何體渲染技術解析

WebGL 2的頂點ID特性

WebGL 2引入了gl_VertexID內置變量,它表示當前正在處理的頂點索引:

  1. 無需頂點屬性:傳統渲染需要在BufferGeometry中定義頂點位置、顏色等屬性,而使用gl_VertexID可以完全在著色器中生成這些數據
  2. 高效并行計算:每個頂點的計算是并行進行的,充分利用GPU的計算能力
  3. 動態幾何體:可以根據需要動態生成不同的幾何體,無需在CPU端預先生成和上傳數據

在本示例中,我們通過gl_VertexID計算每個頂點的位置和顏色,實現了完全在GPU端生成幾何體的效果。

著色器中的偽隨機數生成

為了在著色器中生成看似隨機的頂點位置和顏色,我們使用了偽隨機數生成算法:

  1. 哈希函數:通過位運算實現的哈希函數,將輸入值映射為看似隨機的輸出值
  2. 浮點數轉換:將生成的無符號整數轉換為0-1之間的浮點數
  3. 確定性隨機:相同的輸入會生成相同的輸出,這對于渲染一致性非常重要

在本示例中,我們使用頂點ID和隨機種子作為輸入,生成確定性的隨機頂點位置和顏色。這意味著每次渲染相同的場景時,結果都是一樣的,但看起來是隨機的。

無屬性幾何體的優勢與應用場景

這種渲染技術具有以下優勢:

  1. 減少內存占用:無需在CPU和GPU之間傳輸大量頂點數據
  2. 提高渲染效率:減少了數據傳輸和BufferGeometry的創建開銷
  3. 動態生成復雜幾何體:適合生成粒子系統、程序化地形、流體模擬等

適用場景包括:

  1. 粒子系統:每個粒子的位置和屬性可以在著色器中動態生成
  2. 程序化內容:如程序化地形、建筑等
  3. 大數據可視化:當數據量非常大時,可以避免內存問題
  4. 實時生成效果:如爆炸碎片、煙霧等效果
性能考慮與限制

使用無屬性幾何體渲染時需要注意:

  1. 著色器復雜度:復雜的計算會增加GPU負擔,可能導致性能下降
  2. 隨機數質量:簡單的哈希函數生成的隨機數質量有限,不適合需要高質量隨機數的場景
  3. 調試困難:著色器中的計算難以調試,需要仔細設計算法
  4. 兼容性:僅支持WebGL 2的瀏覽器才能使用

這種技術在特定場景下非常強大,但并不適合所有情況。在實際應用中,需要根據具體需求權衡其優缺點。

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

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

相關文章

Ubuntu 22.04搭建OpenStreeMap地址解析服務(保姆級教程)

1.數據準備 1.1.全球數據 下載地址&#xff1a;https://planet.openstreetmap.org/ 1.2.特定區域的數據 下載地址&#xff1a;Geofabrik Download Server 2.安裝必要的軟件包 2.1.更新系統軟件包 sudo apt updatesudo apt upgrade 2.2.安裝所需要的軟件包 執行下面的命…

Ubuntu 22.04.5 LTS上部署Docker及相關優化

以下是在Ubuntu 22.04.5 LTS上部署Docker及相關優化的步驟&#xff1a; 安裝Docker 更新系統&#xff1a;在安裝Docker之前&#xff0c;先確保系統是最新的&#xff0c;執行以下命令&#xff1a;sudo apt update sudo apt upgrade -y安裝依賴包&#xff1a;安裝一些必要的依賴…

React -> AI組件 -> 調用Ollama模型, qwen3:1.7B非常聰明

使用 React 搭建一個現代化的聊天界面&#xff0c;支持與 Ollama 本地部署的大語言模型進行多輪對話。界面清爽、功能完整&#xff0c;支持 Markdown 渲染、代碼高亮、<think> 隱藏思考標簽、流式漸進反饋、暗黑模式適配等特性。 &#x1f9e9; 核心功能亮點 ? 模型選擇…

vue2/3 中使用 @vue-office/docx 在網頁中預覽(docx、excel、pdf)文件

1. 安裝依賴&#xff1a; #docx文檔預覽組件npm install vue-office/docx vue-demi0.14.6#excel文檔預覽組件npm install vue-office/excel vue-demi0.14.6#pdf文檔預覽組件npm install vue-office/pdf vue-demi0.14.6 vue2.6版本或以下還需要額外安裝 vue/composition-api …

【應用密碼學】實驗五 公鑰密碼2——ECC

一、實驗要求與目的 1.復習CCC基本概念&#xff0c;并根據實驗平臺提供的資料完成驗證性實驗。 2.編程練習&#xff1a;以書上例題小模數p為例編程實現ECC的基本運算規則。 二、實驗內容與步驟記錄&#xff08;只記錄關鍵步驟與結果&#xff0c;可截圖&#xff0c;但注意排版…

rust-candle學習筆記9-使用tokenizers加載qwen3分詞,使用分詞器處理文本

參考&#xff1a;about-pytorch&#xff0c; about-tokenizers 在魔搭社區鏈接下載qwen3的tokenizer.json文件 添加依賴庫&#xff1a; cargo add tokenizers tokenizers庫初體驗&#xff1a; use tokenizers::tokenizer::{self, Result, Tokenizer};fn main() -> Resu…

【MySQL】存儲引擎 - ARCHIVE、BLACKHOLE、MERGE詳解

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

5.Redission

5.1 前文鎖問題 基于 setnx 實現的分布式鎖存在下面的問題&#xff1a; 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如 HashTable 這樣的代碼中&#xff0c;他的方法都是使用 sync…

C語言主要標準版本的演進與核心區別的對比分析

以下是C語言主要標準版本的演進與核心區別的對比分析 K&R C&#xff08;1978年&#xff09; 定位?&#xff1a;非標準化的原始版本&#xff0c;由Brian Kernighan和Dennis Ritchie定義 特性?&#xff1a; 基礎語法&#xff1a;函數聲明無參數列表&#xff08;如int func…

【C++設計模式之Template Method Pattern】

C設計模式之Template Method Pattern 模式定義核心思想動機(Motivation)結構&#xff08;Structure&#xff09;實現步驟應用場景要點總結 模式定義 模式定義&#xff1a; 定義一個操作中的算法的骨架(穩定)&#xff0c;而將一些步驟延遲(變化)到子類中。Template Method使得子…

【動態導通電阻】p-GaN HEMTs正向和反向導通下的動態導通電阻

2024 年,浙江大學的 Zonglun Xie 等人基于多組雙脈沖測試方法,研究了兩種不同技術的商用 p-GaN 柵極 HEMTs 在正向和反向導通模式以及硬開關和軟開關條件下的動態導通電阻(RON)特性。實驗結果表明,對于肖特基型 p-GaN 柵極 HEMTs,反向導通時動態 RON 比正向導通高 3%-5%;…

PDFMathTranslate:科學 PDF 文件翻譯及雙語對照工具

PDFMathTranslate&#xff1a;科學 PDF 文件翻譯及雙語對照工具 在科研和學習過程中&#xff0c;我們經常會遇到大量的英文 PDF 文獻&#xff0c;翻譯這些文獻成為了一項繁瑣且耗時的工作。PDFMathTranslate 是一款強大的科學 PDF 文件翻譯及雙語對照工具&#xff0c;它能夠保…

Flutter PIP 插件 ---- 為iOS 重構PipController, Demo界面,更好的體驗

接上文 Flutter PIP 插件 ---- 新增PipActivity&#xff0c;Android 11以下支持自動進入PIP Mode 項目地址 PIP&#xff0c; pub.dev也已經同步發布 pip 0.0.3&#xff0c;你的加星和點贊&#xff0c;將是我繼續改進最大的動力 在之前的界面設計中&#xff0c;還原動畫等體驗一…

【Ansible】之inventory主機清單

前言 本篇博客主要解釋Ansible主機清單的相關配置知識 一、inventory 主機清單 Inventory支持對主機進行分組&#xff0c;每個組內可以定義多個主機&#xff0c;每個主機都可以定義在任何一個或多個主機組內。 如果是名稱類似的主機&#xff0c;可以使用列表的方式表示各個主機…

基于幾何布朗運動的股價預測模型構建與分析

基于幾何布朗運動的股價預測模型構建與分析 摘要 本文建立基于幾何布朗運動的股價預測模型&#xff0c;結合極大似然估計與蒙特卡洛模擬&#xff0c;推導股價條件概率密度函數并構建動態預測區間。實證分析顯示模型在標普500指數預測中取得89%的覆蓋概率&#xff0c;波動率估…

【前端】【JavaScript】【總復習】四萬字詳解JavaScript知識體系

JavaScript 前端知識體系 &#x1f4cc; 說明&#xff1a;本大綱從基礎到高級、從語法到應用、從面試到實戰&#xff0c;分層級講解 JavaScript 的核心內容。 一、JavaScript 基礎語法 1.1 基本概念 1.1.1 JavaScript 的發展史與用途 1. 發展簡史 1995 年&#xff1a;JavaS…

[Java實戰]Spring Boot 3 整合 Apache Shiro(二十一)

[Java實戰]Spring Boot 3 整合 Apache Shiro&#xff08;二十一&#xff09; 引言 在復雜的業務系統中&#xff0c;安全控制&#xff08;認證、授權、加密&#xff09;是核心需求。相比于 Spring Security 的重量級設計&#xff0c;Apache Shiro 憑借其簡潔的 API 和靈活的擴…

PyTorch API 6 - 編譯、fft、fx、函數轉換、調試、符號追蹤

文章目錄 torch.compiler延伸閱讀 torch.fft快速傅里葉變換輔助函數 torch.func什么是可組合的函數變換&#xff1f;為什么需要可組合的函數變換&#xff1f;延伸閱讀 torch.futurestorch.fx概述編寫轉換函數圖結構快速入門圖操作直接操作計算圖使用 replace_pattern() 進行子圖…

可觀測性方案怎么選?SelectDB vs Elasticsearch vs ClickHouse

可觀測性&#xff08;Observability&#xff09;是指通過系統的外部輸出數據&#xff0c;推斷其內部狀態的能力。可觀測性平臺通過采集、存儲、可視化分析三大可觀測性數據&#xff1a;日志&#xff08;Logging&#xff09;、鏈路追蹤&#xff08;Tracing&#xff09;和指標&am…

機器人廚師上崗!AI在餐飲界掀起新風潮!

想要了解人工智能在其他各個領域的應用&#xff0c;可以查看下面一篇文章 《AI在各領域的應用》 餐飲業是與我們日常生活息息相關的行業&#xff0c;而人工智能&#xff08;AI&#xff09;正在迅速改變這個傳統行業的面貌。從智能點餐到食材管理&#xff0c;再到個性化推薦&a…