(一)使用 WebGL 繪制一個簡單的點和原理解析

使用 WebGL 繪制一個簡單的點,我們需要通過 WebGL 的管線來進行一系列的步驟。以下是實現的詳細步驟和原理解析:

WebGL 繪制點的基本步驟

  1. 初始化 WebGL 上下文
    首先,我們需要獲取 WebGL 上下文,這樣才能進行所有的繪圖操作。通常,WebGL 上下文是通過 <canvas> 元素獲取的。

  2. 編寫著色器代碼(Shader)
    WebGL 使用著色器(Shaders)來定義如何處理頂點數據和像素數據。我們需要兩個著色器:頂點著色器和片段著色器。

  3. 創建緩沖區
    WebGL 使用緩沖區存儲頂點數據,我們需要一個頂點緩沖區來存儲繪制的點的坐標。

  4. 設置 WebGL 狀態
    我們需要設置 WebGL 的一些狀態,確保它正確地繪制圖形。

  5. 執行繪制命令
    最后,使用 WebGL 提供的 drawArraysdrawElements 來執行繪制。

步驟 1:初始化 WebGL 上下文

<canvas id="myCanvas" width="500" height="500"></canvas>
<script>const canvas = document.getElementById('myCanvas');const gl = canvas.getContext('webgl');if (!gl) {console.log('WebGL not supported');}
</script>

步驟 2:編寫著色器代碼

頂點著色器

頂點著色器負責處理每個頂點的位置,在這里我們定義一個點的坐標。

const vertexShaderSource = `attribute vec4 a_position;void main(void) {gl_Position = a_position;}
`;
片段著色器

片段著色器定義每個像素的顏色。為了使點看起來為某種顏色,我們在片段著色器中設置 gl_FragColor

const fragmentShaderSource = `precision mediump float;void main(void) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);  // 紅色}
`;

步驟 3:創建緩沖區

我們需要將頂點數據存儲在緩沖區中。因為我們繪制的是一個點,頂點數據只有一個點的坐標。

const vertices = new Float32Array([0.0, 0.0,  // 點的坐標
]);// 創建并綁定頂點緩沖區
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

步驟 4:編譯和鏈接著色器

接下來,我們編譯頂點著色器和片段著色器,并將它們鏈接成一個程序。

// 編譯著色器的函數
function compileShader(source, type) {const shader = gl.createShader(type);gl.shaderSource(shader, source);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {console.error('Error compiling shader:', gl.getShaderInfoLog(shader));}return shader;
}const vertexShader = compileShader(vertexShaderSource, gl.VERTEX_SHADER);
const fragmentShader = compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER);// 創建著色器程序
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {console.error('Error linking program:', gl.getProgramInfoLog(shaderProgram));
}gl.useProgram(shaderProgram);

步驟 5:啟用頂點屬性并綁定緩沖區

為了使 WebGL 知道如何從緩沖區中提取數據并傳遞給著色器,我們需要啟用頂點屬性。

const positionAttributeLocation = gl.getAttribLocation(shaderProgram, 'a_position');
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(positionAttributeLocation);

步驟 6:清除畫布并繪制

在繪制之前,我們需要清除畫布,然后執行繪制命令。

// 清空畫布
gl.clearColor(0.0, 0.0, 0.0, 1.0);  // 設置背景色為黑色
gl.clear(gl.COLOR_BUFFER_BIT);// 繪制點
gl.drawArrays(gl.POINTS, 0, 1);  // 繪制一個點
</script>

原理解析

WebGL 渲染管線
  1. 頂點著色器:WebGL 將每個頂點的數據(如坐標)傳遞給頂點著色器。在本例中,a_position 變量接收的是一個二維坐標([0.0, 0.0]),頂點著色器將其轉換為裁剪空間中的位置。

  2. 裁剪空間與屏幕空間:頂點著色器的輸出(gl_Position)會經過裁剪和投影變換,最終轉換到屏幕空間。

  3. 片段著色器:每個像素(即片段)都會被片段著色器處理。在本例中,片段著色器簡單地給每個像素設置紅色。

  4. 繪制命令:在這一步,WebGL 使用 gl.drawArrays(gl.POINTS, 0, 1) 來繪制點。gl.POINTS 表示我們要繪制的是一個點。

重要概念
  • 著色器:著色器是 WebGL 中的一個重要概念,它定義了如何處理頂點數據和片段數據。
  • 緩沖區:WebGL 使用緩沖區來存儲頂點數據。數據存儲在內存中,通過 GPU 加速處理。
  • 繪制命令gl.drawArraysgl.drawElements 是 WebGL 繪制圖形的命令,前者是根據緩沖區中的數據繪制,后者則是通過索引來繪制。

總結

通過以上步驟,我們使用 WebGL 成功繪制了一個點。在這個過程中,關鍵的概念包括著色器、緩沖區和繪制命令。

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

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

相關文章

Vue路由跳轉報錯

說明&#xff1a;使用 Vue 的router.replace/push&#xff0c;若跳轉到當前路由&#xff0c;控制臺會報錯如下&#xff1a;NavigationDuplicated: Avoided redundant navigation to current location 原因&#xff1a;Vue-router在3.1之后把$router.push()方法改為了Promise。所…

【Axure高保真原型】環形進度條(開始暫停效果)

今天和大家分享環形進度條&#xff08;開始暫停效果&#xff09;的原型模版&#xff0c;效果包括&#xff1a; 點擊開始按鈕&#xff0c;可以環形進度條開始讀取&#xff0c;中部百分比顯示環形的讀取進度&#xff1b; 在讀取過程中&#xff0c;點擊暫停按鈕&#xff0c;可以隨…

Euler 21.10(華為歐拉)安裝oracle19c-RAC

1. Euler 21.10安裝oracle19c-RAC 1.1. 環境規劃 1.1.1. 主機規劃 hostname IP 實例名 hfdb90 192.168.40.90 hfdb1 hfdb91 192.168.40.90 hfdb2 系統版本 BigCloud Enterprise Linux For Euler 21.10 (GNU/Linux 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 x86_6…

【python】matplotlib(radar chart)

文章目錄 1、功能描述和原理介紹2、代碼實現3、效果展示4、完整代碼5、多個雷達圖繪制在一張圖上6、參考 1、功能描述和原理介紹 基于 matplotlib 實現雷達圖的繪制 一、雷達圖的基本概念 雷達圖&#xff08;Radar Chart&#xff09;&#xff0c;也被稱為蛛網圖或星型圖&…

(三)通過WebGL繪制一個簡單的三角形來理解渲染管線

理解 WebGL 繪圖原理的關鍵是了解它的渲染管線。WebGL 渲染管線實際上是由多個階段組成的&#xff0c;每個階段都有特定的任務&#xff0c;最終輸出的是屏幕上的圖像。為了讓你能輕松理解這些原理&#xff0c;我將通過一個簡單的例子來詳細解釋。 繪制一個簡單的三角形 我們將…

【shell編程】報錯信息:bash: bad file descriptor(包含6種解決方法)

大家好&#xff0c;我是搖光~ 在運行 Shell 腳本時&#xff0c;遇到 bash: bad file descriptor 錯誤通常意味著腳本嘗試對一個無效或不可用的文件描述符&#xff08;file descriptor&#xff09;執行了讀寫操作。 以下是一些可能導致這個問題的原因、詳細案例以及相應的解決…

Kafka3.x KRaft 模式 (沒有zookeeper) 常用命令

版本號&#xff1a;kafka_2.12-3.7.0 說明&#xff1a;如有多個地址&#xff0c;用逗號分隔 創建主題 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1刪除主題 bin/kafka-topics.sh --delete --boots…

Business Cooperation Process

Business Cooperation Process 商務合作基本流程 并不是每個人都能做到言而有信的&#xff0c;因此還是需要流程來約束的。

模式識別-Ch2-分類錯誤率

分類錯誤率 最小錯誤率貝葉斯決策 樣本 x x x的錯誤率&#xff1a; 任一決策都可能會有錯誤。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

Milvus×全診通:從導診到智能超聲,如何將人效比翻倍

AI與智慧醫療的結合已是未來發展的必然趨勢。近年來&#xff0c;國家衛健委推崇智慧醫療和AI技術&#xff0c;如智能導診、預問診、輔助診斷等&#xff0c;以提高醫療服務效率和診斷準確性&#xff0c;改善患者就醫體驗。 全診通是一家專注于醫療SaaS和人工智能的公司&#xff…

自動駕駛相關知識學習筆記

一、概要 因為想知道SIL、HIL是什么仿真工具&#xff0c;故而瀏覽了自動駕駛相關的知識。 資料來源《自動駕駛——人工智能理論與實踐》胡波 林青 陳強 著&#xff1b;出版時間&#xff1a;2023年3月 二、圖像的分類、分割與檢測任務區別 如圖所示&#xff0c;這些更高階的…

springcloud 介紹

Spring Cloud是一個基于Spring Boot的微服務架構解決方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速構建分布式系統。在Spring Cloud的架構中&#xff0c;服務被拆分為一系列小型、自治的微服務&#xff0c;每個服務運行在其獨立的進程中&#xff0c;并通過…

Blazor用戶身份驗證狀態詳解

在 Blazor 應用程序中&#xff0c;AuthenticationState 是一個核心概念&#xff0c;用于表示用戶的身份驗證狀態。它提供有關當前用戶的信息&#xff0c;例如是否已登錄、用戶的身份信息&#xff08;如用戶名、角色等&#xff09;。 AuthenticationState 通常由 Authenticatio…

VAxios

VAxios&#xff08;或v-axios&#xff09;是一個基于Axios的Vue插件&#xff0c;旨在讓開發者在Vue項目中更方便、快捷地引入和使用Axios。以下是對VAxios的詳細介紹&#xff1a; 一、功能與特性 VAxios作為Axios的Vue封裝插件&#xff0c;繼承了Axios的眾多特性&#xff0c;…

什么是 ERP?

目錄 企業資源計劃&#xff08;ERP&#xff09;的定義 ERP與財務管理的區別 ERP基礎知識 ERP的業務價值 ERP簡史 ERP部署模式&#xff1a;從本地部署到云端 ERP云 — 新的ERP交付模式 遷移至ERP云技術解決方案的7個原因 企業資源計劃&#xff08;ERP&#xff09;的定義 …

Linux環境下確認并操作 Git 倉庫

在軟件開發和版本控制中&#xff0c;Git 已成為不可或缺的工具。有時&#xff0c;我們需要確認某個目錄是否是一個 Git 倉庫&#xff0c;并在該目錄中運行腳本。本文將詳細介紹如何確認 /usr/local/src/zcxt/backend/policy-system-backend 目錄是否是一個 Git 倉庫&#xff0c…

【PLL】非線性瞬態性能

頻率捕獲、跟蹤響應&#xff0c;是大信號非線性行為鎖相范圍內的相位、頻率跟蹤&#xff0c;不是非線性行為 所以&#xff1a;跟蹤&#xff0c;是線性區域&#xff1b;捕獲&#xff0c;是大信號、非線性區域 鎖定范圍&#xff1a;沒有周跳&#xff08;cycle-slipping&#xff0…

QML學習(七) 學習QML時,用好Qt設計器,快速了解各個組件的屬性

在初步學習QML時&#xff0c;特別建議看看Qt設計器&#xff0c;先利用Qt Quick設計師的使用&#xff0c;快速的對Qt Quick的各個組件及其常用的屬性&#xff0c;有個初步的了解和認識。如果初始學習一上來直接以代碼形式開干&#xff0c;很容易一頭霧水。而設計器以最直白的所見…

回調函數和工廠模式

回調函數和工廠模式可以結合使用&#xff0c;以實現靈活的對象創建和動態行為。這種結合通常用于需要根據特定條件創建對象并在對象上執行某些操作的場景。以下是如何將回調函數與工廠模式結合的示例和解釋。 結合使用的場景 動態對象創建&#xff1a;使用工廠模式創建不同類型…

find 查找文件grep匹配數據

一、find介紹 1. find . -iname "*.txt"查找當前目錄下各個文件夾下的txt屬性的文件(i忽略大小寫)。 2.find . -type f 查找當前目錄下各個文件夾下的文件 3.find . -type d 查找當前目錄下各個文件夾下的目錄 4.find . -type f | xargs grep -ain -E "匹配…