成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一起學 WebGL:繪制三角形

開發 前端
這次繪制三角形,要繪制的點就有三個了,不再是一個。為此我們需要用到緩存區對象(buffer object)。

三角形可太重要了,再復雜的三維模型都是由一個個小三角形組合而成,越多越精細越真實。

繪制三角形

這次繪制三角形,要繪制的點就有三個了,不再是一個。為此我們需要用到緩存區對象(buffer object)。

通過緩存區對象,我們可以一次性向頂點著色器傳入多個頂點數據。

Float32Array

首先我們來用 Float32Array 數組保存需要用到的三個點的位置信息。

// 頂點數據
const vertices = new Float32Array([
// 第一個點
0, 0.5,
// 第二個點
-0.5, -0.5,
// 第三個點
0.5, -0.5
]);

為了更簡單一些,這里先不考慮 z 維度,每個頂點只用了 x 和 y 分量。到時候傳遞到頂點著色器的 gl_Position  時,z 會自動填充默認的 0。

Float32Array 是一個比較特殊的 JavaScript 數組,最初也是為了和 WebGL 配合使用的,它可以創建一個 32 位浮點數的強類型數組。

普通的 JS 數組沒有類型的概念,數組元素可能是數字、字符串、對象的混合體,傳給 WebGL,要處理也麻煩,不太合適。

需要注意的是這種強類型數組的 API 和普通數組不一樣,比如不能用 push 方法。

緩沖區對象的創建和數據寫入

// 創建緩沖區對象
const vertexBuffer = gl.createBuffer();
// 綁定緩沖區對象到上下文
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
// 向緩沖區對象寫入數據
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

首先是用 gl.createBuffer 方法創建一個緩沖區對象。

然后用 gl.bindBuffer(target, buffer) 將緩存區綁定到 gl 上下文指定目標(gl.ARRAY_BUFFER)中。target 參數還有另一個值是 gl.ELEMENT_ARRAY_BUFFER,這個我們后面章節講如何繪制立方體的時候會用到哈。

buffer 參數就是剛剛創建的緩沖區對象。

最后往緩沖區對象寫入我們剛剛的數組數據。最后一個參數 gl.STATIC_DRAW,表示數據寫入后不會再被修改,去繪制 靜態 場景。

綁定到頂點著色器上

接著就是讓緩沖區對象對接上頂點著色器的變量。

// 獲取 a_Position 變量地址
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
// 將緩沖區對象分配給 a_Position 變量
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
// 允許訪問緩存區
gl.enableVertexAttribArray(a_Position);

首先通過 gl.getAttribLocation 拿到頂點著色器中聲明的 a_Position 變量的地址。

然后是比較復雜的 gl.vertexAttribPointer 方法。參數說明:

  1. location,待分配的 attribute 變量地址;
  2. size,每個頂點分量分量個數,就是一次從中取幾個作為一個頂點數據,不夠的補缺省值。
  3. type,指定數據格式,gl.FLOAT 表示使用的是 Float32Array 的類型。
  4. normalize,是否將浮點數歸一化到 [0, 1] 或 [-1, 1] 。
  5. stride,相鄰兩個頂點之間的字節數,以后用數組保存多種信息數據時會用到。
  6. offset,指定緩沖區對象中的偏移量。

目前我們只需要知道 location 和 size 就行了。最后兩個參數會在繪制顏色漸變的三角形用到,這里不細說。

最后是用調用  gl.enableVertexAttribArray(a_Position),表示 a_Position 變量對應的緩沖區被開啟了。開啟后,我們就不能再用原來的 gl.vertexAttrib3f 來傳遞數據了,WebGL 會從緩存區一個個拿。如果你想關閉分配,可以調用

繪制

/*** 繪制 ***/
// 清空畫布,并指定顏色
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// 繪制三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);

最后是清空畫布,然后繪制三角形。

這里 gl.drawArrays 方法的第一個 mode 參數換成了 gl.TRIANGLES(三角形圖元),不再是原來的 gl.POINTS。

繪制效果:

圖片

如果用原來的 gl.POINTS,并設置好 gl_PointSize 指定點大小,則會繪制出下面的效果:

圖片

代碼

下面是完整的代碼實現。

/** @type {HTMLCanvasElement} */
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

const vertexShaderSrc = `
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
gl_PointSize = 10.0;
}
`;

const fragmentShaderSrc = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;

/**** 渲染器生成處理 ****/
// 創建頂點渲染器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);
// 創建片元渲染器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSrc);
gl.compileShader(fragmentShader);
// 程序對象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
gl.program = program;

// 頂點數據
const vertices = new Float32Array([
// 第一個點
0,
0.5,
// 第二個點
-0.5,
-0.5,
// 第三個點
0.5,
-0.5
]);

// 創建緩存對象
const vertexBuffer = gl.createBuffer();
// 綁定緩存對象到上下文
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
// 向緩存區寫入數據
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

// 獲取 a_Position 變量地址
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
// 將緩沖區對象分配給 a_Position 變量
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

// 允許訪問緩存區
gl.enableVertexAttribArray(a_Position);

/*** 繪制 ***/
// 清空畫布,并指定顏色
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// 繪制三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);

在線 demo:

https://codesandbox.io/s/gbh1xf?file=/index.js。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-05-06 07:23:57

2023-11-01 07:51:15

WebGPU3D 圖形

2023-04-12 07:46:24

JavaScriptWebGL

2016-10-20 13:36:28

WebRTC瀏覽器服務器

2021-10-19 10:09:21

三角形個數數組

2023-05-16 07:44:03

紋理映射WebGL

2023-05-31 20:10:03

WebGL繪制立方體

2023-04-11 07:48:32

WebGLCanvas

2022-03-16 14:27:49

CSS三角形前端

2022-09-14 15:17:26

ArkUI鴻蒙

2013-09-26 13:43:13

iOS開發OpenGL ES教程圖元

2021-08-29 18:32:18

CSS

2020-12-09 08:34:24

css生成器設計師

2023-04-26 07:42:16

WebGL圖元的類型

2024-02-20 18:30:53

CSS屬性邊框

2012-12-24 09:55:15

iOSUnity3D

2023-03-29 07:31:09

WebGL坐標系

2023-05-04 08:48:42

WebGL復合矩陣

2023-06-26 15:14:19

WebGL紋理對象學習

2021-07-16 05:59:27

CSS 技巧帶圓角的三角形
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠色综合网站久久久久久久 | 久久99精品久久久久久 | 日韩精品视频在线播放 | 综合精品久久久 | 精品久久久久久亚洲综合网 | 91精品在线播放 | 啪啪综合网 | 在线免费观看a级片 | 91小视频| 日韩一区二区三区在线视频 | 九九久久精品视频 | 日本a视频 | 99视频免费在线观看 | 欧美日韩不卡在线 | aacc678成免费人电影网站 | 91婷婷韩国欧美一区二区 | 中文字幕亚洲一区 | 日韩视频在线免费观看 | 欧美中文| 免费视频成人国产精品网站 | 古典武侠第一页久久777 | 91精品国产综合久久婷婷香蕉 | 天堂久久天堂综合色 | 黄色毛片一级 | 国产精品123区 | 亚洲第一网站 | 亚洲毛片在线观看 | 国产成人久久精品 | 成人在线电影网站 | 国产精品国产 | 伊人青青久久 | 亚洲欧美一区二区三区国产精品 | 欧美亚洲视频 | 国产福利在线视频 | 一区二区三区在线电影 | 日韩午夜电影在线观看 | 亚洲欧美在线观看 | 国产传媒毛片精品视频第一次 | 天天插日日操 | 国产精品美女视频 | 亚洲激精日韩激精欧美精品 |