2021年8月29日 星期日

開發WebGL的第一步

 出處:https://segmentfault.com/a/1190000024442475

作者:Aral Roca

翻譯:瘋狂的技術宅

原文:

未經允許嚴禁轉載

在本文中,我們將了解什麼是WebGL,以及如何通過與GPU 進行對話來繪製“三角形”。儘管有更好的方法來實現本文中的例子,例如用具有2d 上下文的canvas 甚至可以用CSS,但我們要從WebGL 開始。就像“hello world” 一樣,了解它是如何工作的。

image.png

什麼是WebGL?

WebGL 的字面定義是 但這並不意味著我們可以通過3D 庫提供的一個好用的API 去指揮電腦:“在這裡放個茶杯,在這裡放攝像機,在這裡畫一個字符等”。

它屬於低級API,可以將 你可以把WebGL 理解為柵格化引擎。它基於OpenGL ES 3.0 圖形API。

image.png

網上現有的3d 庫(例如 他們需要一種能夠與GPU 通訊來告知繪製內容的方法。

當然也可以通過THREE.js 的 但是本文的目的是了解其在內部的工作方式,即這些3d 庫時如何通過WebGL 與GPU 通信的。我們要在沒有任何3D 庫的幫助下渲染出一個三角形。THREE.Triangle

image.png

創建WebGL 畫布

在繪製三角形之前,需要先定義WebGL 渲染的三角形的區域。

我們將使用HTML5 的元素canvas,將上下文設置為webgl2

import 

export   ) {

  useEffect
    
gl.
    
  }, [])

  return   

clearColor 方法用RGBA(取值範圍:0 到1)設置畫布的背景色。

clear方法用來把緩衝區初始化為預設值。其對應的常數值將取決於你的GPU。

創建canvas 後,就可以用WebGL 渲染三角形了。

頂點坐標

首先要知道我們所使用的這些向量的取值範圍是-1 至1。

畫布的坐標範圍:

image.png

  • (0,0)
  • (1,1)
  • (1,-1)
  • (-1,1)
  • (-1,-1)

要繪製的三角形的三個頂點為 把三角的頂點坐標存儲到數組中::

image.png

const

GLSL 和著色器

著色器是計算機圖形學中的一種程序,可以高度靈活地計算渲染效果。這些著色器用類似於C 或C++ 的OpenGL ES 著色語言(GLSL ES)編寫,並在GPU上編碼並運行。

image.png

每個WebGL 程序都由兩個著色器函數組成;幾乎所有的WebGL API 都以不同的方式運行這兩個函數。

頂點著色器

頂點著色器的工作是計算頂點的位置。有了這個結果(所以要先創建這個頂點著色器:

const
  precision mediump float;
  in vec2 position;

  void main () {
      gl_Position = vec4(position.x, position.y, 0.0, 1.0); // x,y,z,w
  }
`

可以將其作為模板字符串保存在我們的JavaScript 代碼中。

第一行(#version 300 es

第二行(可用的選項有precision mediump float;highpmediumplowphighp

在第三行(三角形的每個向量都是二維的。in vec2 position;

初始化後在程序啟動時調用 GPU 將通過將當前頂點的位置保存到 第一個和第二個參數是 第三個參數是 最後一個參數是maingl_Positiongl_Position = vec4(position.x, position.y, 0.0, 1.0);vec2xyz0.0w1.0

GLSL 識別並在內部使用 gl_Position

創建著色器後,應對其進行編譯:

const
gl.gl.

// Catch some possible errors on vertex shader

}

片段著色器

“片段著色器”在“頂點著色器”之後執行。著色器的工作是計算與每個位置對應的像素點的顏色。

我們用相同的顏色填充這個三角形:

const
  precision mediump float;
  out vec4 color;

  void main () {
      color = vec4(0.7, 0.89, 0.98, 1.0); // r,g,b,a
  }`

gl.gl.

// 在片段著色器上捕獲一些可能出現的錯誤

}

儘管在這裡返回的 由於要用 vect4rgba(179, 229, 252, 1)

從著色器創建程序

編譯好著色器後,需要創建要運行GPU 的程序,同時添加兩個著色器。

constgl.

// 捕獲在程序中可能出現的錯誤

}

創建緩衝區

我們將使用緩衝區把內存分配給GPU,並把內存綁定到用於CPU-GPU 通信的通道。用此通道將三角形坐標發送到GPU。

// 為gpu分配內存


// 將此內存綁定到通道

// 使用此通道將數據發送到GPU(三角形坐標)gl. gl. 
  
  
)

// 發送數據後釋放內存,避免內存洩漏問題

image.png

把數據從CPU 鏈接到GPU

在我們的 但是尚未指定此變量應採用我們要通過緩衝區的值。必須通過以下方式表明它:position

constgl.gl.gl.position,
  
  
   

繪製三角形

一旦為三角形創建了帶有著色器的程序,並創建了將數據從CPU發送到GPU的鏈接緩衝區之後,最後就可以告訴GPU 渲染三角形了。

image.png

gl.gl.
  
   

這個方法用來從數組數據渲染圖元。圖元可以是點、線或三角形。在這裡指定gl.TRIANGLES

結論

用WebGL 只能繪製三角形、直線或點,因為它只能柵格化,所以只能進行向量可以執行的操作。這意味著WebGL 從概念上講是簡單的,而過程卻相當複雜,而且根據你要開發的內容會變得越來越複雜。光柵化2D 三角形並不像在3D 遊戲中使用紋理、變化,變換那樣。


其它高讚文章:


繼續閱讀
《前端圖形學從入門到放棄》001 畫一個三角形

說人話webgl就是個工具,可以拿來畫圖的,它依賴於canvas,在canvas上你可以獲取2d的上下文,也可以獲取webgl的上下文。類似寶可夢新手村可以選蒜頭王八也可以選黃皮耗子

這是上帝的傑作閱讀18

WebGL 紋理顏色原理

WebGL繪製圖像時,往著色器中傳入顏色信息就可以給圖形繪製出相應的顏色,現在已經知道頂點著色器和片段著色器一起決定著向顏色緩衝區寫入顏色信息並最終呈現出來,那麼這個過程是什麼樣,如果圖形的顏色需要用現...

騰訊雲加社區閱讀12

WebGL入門教程一:基本概念和使用說明

閱讀這篇文章的人應該都知道Canvas繪製二維位圖是通過getContext('2d')獲取類似畫筆的東西在其中繪製,而這裡是繪製三維位圖,通過getContext('webgl')來獲取這只神奇的筆。

心葉閱讀7

WebGL 初探

目前,我們有很多方案可以快速的接觸到WebGL 並繪製複雜的圖形,但最後發現我們忽視了很多細節性的東西。當然,這對初學WebGL 是有必要的,它能迅速提起我們對WebGL 的學習興趣。當學習到更加深入的階段時,我...

sundway閱讀61

WebGL 初印象

最近由於工作需要,開始學習WebGL 相關的知識。這篇文章的目的就是記錄下學習過程中的一些知識概念,並實現一個簡單的demo,幫助大家快速理解webgl 的概貌並上手開發。最後會分享自己對於webgl 的幾點想法,...

JoeRay61閱讀51

新手向!用WebGL寫一個旋轉的動態三角形,總共分三步!(註釋超詳細!!)

html部分還是比較簡單,引入的matrix.js是矩陣變換的一些方法,網上有很多,大家可以搜一搜(我的線性代數知識已經還給我的高數老師了,最近考慮著手撿起來)

姝婷同學閱讀43

WebGL 學習—— 繪製一個三角形

WebGL 可以實現非常多炫酷的效果,隨便截了一張three.js 的demo: 但是WebGL 的學習總是令前端感到絕望,有許多複制的概念:渲染管線、著色器、齊次坐標、投影等等。大部分人學到繪製一個三角形就被勸退了。...

unholypanda閱讀1

優雅的學習webgl(1)—從0開始構造你的第一個webgl程序

學習webgl也有小半年的時間了,有了一些心得和體會,在這裡做一個記錄,整個系列的代碼都會給出,這篇文章是這個系列的第一篇文章,帶你走進webgl的世界。

yuxiaoliang閱讀1

沒有留言: