精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一起學 WebGL:三角形加上漸變色

開發 前端
本節講了Varying 的能力:將頂點著色器中的變量傳遞給片元著色器。并演示了使用兩個緩沖區對象,位置數據和顏色數據,以及將它們組合成一個緩沖區對象的實現。

大家好,我是前端西瓜哥。之前教大家繪制一個紅色的三角形,這次我們來畫個有漸變的三角形。

原來的寫法,顏色是在片元著色器中寫死的,這次我們來像傳頂點數據一樣,聲明一個顏色數據傳遞過去。

顏色需要在片元著色器中賦值給內部變量 gl_FragColor,但 attribute 動態類型卻不能在片元著色器中使用。

這時候就要用到一個新的類型 varying 了。(意思為:“變化的“)

varying 用于從頂點著色器中將變量傳遞到片元著色器中

兩個緩沖區對象的寫法

著色器代碼:

const vertexShaderSrc = `
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;
void main() {
 gl_Position = a_Position;
 v_Color = a_Color;
}
`;

const fragmentShaderSrc = `
precision mediump float;
varying vec4 v_Color;
void main() {
  gl_FragColor = v_Color;
}
`;

這里我們需要在兩種著色器中同時聲明 varing 變量,后面的類型也必須是相同的 vec4,變量名也要一致,只能說是完全相同了。

頂點著色器中需要通過 v_Color = a_Color; 賦值。然后在片元著色器中,再將同步過來的 v_Color 賦值給 gl_FragColor。

然后是新增的顏色數組的聲明,以及對應緩存區的創建。

/**** 顏色數據 ****/
// prettier-ignore
const colors = new Float32Array([
  1, 0, 0, // 紅色
  0, 1, 0, // 綠色
  0, 0, 1, // 藍色
])
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
const a_Color = gl.getAttribLocation(gl.program, "a_Color");
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(a_Color);

貼一下完整代碼:

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

const vertexShaderSrc = `
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;
void main() {
 gl_Position = a_Position;
 v_Color = a_Color;
}
`;

const fragmentShaderSrc = `
precision mediump float;
varying vec4 v_Color;
void main() {
  gl_FragColor = v_Color;
}
`;

/**** 渲染器生成處理 ****/
// 創建頂點渲染器
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;

// 頂點數據
// prettier-ignore
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);

/**** 顏色數據 ****/
// prettier-ignore
const colors = new Float32Array([
  1, 0, 0, // 紅色
  0, 1, 0, // 綠色
  0, 0, 1, // 藍色
])
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
const a_Color = gl.getAttribLocation(gl.program, "a_Color");
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(a_Color);

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

demo 地址:

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

渲染結果:

圖片

我們其實只是給三個頂點設置了紅、綠、藍三個顏色,然后 WebGL 會基于它們計算出中間的過內插顏色,將它們填充滿三個點圍成區域的像素點。

單緩沖區的實現

前面的實現用了兩個緩沖區對象分別保存位置信息和顏色信息。

但實際上可以將它們組合在一起,讓數據更緊湊放在一個緩沖區里。

浮點數數組為:

// prettier-ignore
const verticesColors = new Float32Array([
  0, 0.5, 1, 0, 0,  // 點 1 的位置和顏色信息
  -0.5, -0.5, 0, 1, 0,  // 點 2
  0.5, -0.5, 0, 0, 1,  // 點 3
]);

然后是和前一種寫法有一些不同的地方:

// 每個數組元素的字節數
const SIZE = verticesColors.BYTES_PER_ELEMENT;

// 獲取 a_Position 變量地址
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, SIZE * 5, 0);
gl.enableVertexAttribArray(a_Position);

const a_Color = gl.getAttribLocation(gl.program, "a_Color");
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, SIZE * 5, SIZE * 2);
gl.enableVertexAttribArray(a_Color);

主要是 gl.vertexAttribPointer 方法的最后兩個參數 stride 和 offset。

我們看下面這個:

gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, SIZE * 5, SIZE * 2);

stride 為 SIZE * 5(單位為字節,所以要乘以一個數組元素的字節大小),表示 5 個數組元素為一趟,然后 offset 為 SIZE  * 2,表示從第 2 個元素,取 3 個元素作為這一趟的數據內容。

完整代碼實現:

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

const vertexShaderSrc = `
attribute vec4 a_Position;
attribute vec4 a_Color;
varying vec4 v_Color;
void main() {
 gl_Position = a_Position;
 v_Color = a_Color;
}
`;

const fragmentShaderSrc = `
precision mediump float;
varying vec4 v_Color;
void main() {
  gl_FragColor = v_Color;
}
`;

/**** 渲染器生成處理 ****/
// 創建頂點渲染器
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;

// 頂點數據
// prettier-ignore
const verticesColors = new Float32Array([
  0, 0.5, 1, 0, 0,  // 點 1 的位置和顏色信息
  -0.5, -0.5, 0, 1, 0,  // 點 2
  0.5, -0.5, 0, 0, 1,  // 點 3
]);
// 每個數組元素的字節數
const SIZE = verticesColors.BYTES_PER_ELEMENT;

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

// 獲取 a_Position 變量地址
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, SIZE * 5, 0);
gl.enableVertexAttribArray(a_Position);

const a_Color = gl.getAttribLocation(gl.program, "a_Color");
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, SIZE * 5, SIZE * 2);
gl.enableVertexAttribArray(a_Color);

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

demo 地址:

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

結尾

本節講了 varying 的能力:將頂點著色器中的變量傳遞給片元著色器。并演示了使用兩個緩沖區對象,位置數據和顏色數據,以及將它們組合成一個緩沖區對象的實現。

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

2023-04-17 09:01:01

WebGL繪制三角形

2023-11-01 07:51:15

WebGPU3D 圖形

2016-10-20 13:36:28

WebRTC瀏覽器服務器

2021-10-19 10:09:21

三角形個數數組

2022-03-16 14:27:49

CSS三角形前端

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屬性邊框

2023-05-04 08:48:42

WebGL復合矩陣

2023-06-26 15:14:19

WebGL紋理對象學習

2023-04-12 07:46:24

JavaScriptWebGL

2023-03-29 07:31:09

WebGL坐標系

2022-09-14 15:17:26

ArkUI鴻蒙

2018-03-02 15:54:37

三角形主機比特幣

2021-07-16 05:59:27

CSS 技巧帶圓角的三角形

2013-09-26 13:43:13

iOS開發OpenGL ES教程圖元

2021-04-15 06:02:50

CSS 三角形技巧

2023-04-13 07:45:15

WebGL片元著色器

2023-05-16 07:44:03

紋理映射WebGL
點贊
收藏

51CTO技術棧公眾號

黄网站视频在线观看| 五月婷婷视频在线| 色妞ww精品视频7777| 亚洲免费观看视频| 国产伦精品一区二区三区四区视频| 久久久久亚洲av无码专区| 精品女人视频| 欧美日韩国产大片| 99视频精品全部免费看| 色视频精品视频在线观看| 奇米精品一区二区三区在线观看| 久久在线视频在线| 魔女鞋交玉足榨精调教| 日韩成人精品一区二区三区| 精品二区在线观看| 欧美视频精品全部免费观看| 欧美日韩精品在线| 制服诱惑一区| 免费动漫网站在线观看| 国产精品原创巨作av| 日本国产欧美一区二区三区| 粉嫩av性色av蜜臀av网站| 欧美黄色录像| 日韩免费一区二区| 性刺激的欧美三级视频| 2021天堂中文幕一二区在线观| 国产三级久久久| 国产一区二区中文字幕免费看| 国产一区二区在线不卡| 爽好多水快深点欧美视频| 欧美激情a∨在线视频播放| 欧美性猛交xxxx乱| 国产精品毛片av| 91精品久久久久久久久99蜜臂| 日本福利视频一区| av网站网址在线观看| 国产欧美视频一区二区三区| 国产综合 伊人色| 国产黄色片免费观看| 免费成人在线视频观看| 日本精品久久久久影院| 亚洲国产综合久久| 国产精品a久久久久| 久久精品免费电影| 永久免费av无码网站性色av| 国产日产精品一区二区三区四区的观看方式| 日韩丝袜美女视频| 欧美日韩久久婷婷| 国产精品原创视频| 91福利社在线观看| 久久久久久久久久久久久国产精品| 国精一区二区三区| 亚洲综合一区二区三区| 91大学生片黄在线观看| а√中文在线8| 亚洲欧美日韩电影| 国产三级中文字幕| av黄色在线| 一二三区精品视频| 成年人网站国产| 亚洲少妇xxx| 日韩乱码一区二区| 亚洲精品一区二区在线看| 中文字幕亚洲第一| 青青草自拍偷拍| 日韩在线观看| 久久艹在线视频| 欧美日韩一级大片| 韩国久久久久| 1769国产精品| 久久久久久久久久一级| 青青国产91久久久久久| 成人国产精品免费视频| 国产美女精品视频国产| 国产高清不卡二三区| 国产精品免费区二区三区观看| 乱色精品无码一区二区国产盗| av资源网一区| 日韩在线三级| 快射av在线播放一区| 亚洲精品免费在线播放| 国产 日韩 亚洲 欧美| 中文在线免费视频| 欧美色图天堂网| 美女在线视频一区二区| 麻豆视频久久| 精品无人区乱码1区2区3区在线| 国产黄片一区二区三区| 欧美丰满日韩| 久久久久久久久久国产| 特级西西444www大精品视频免费看| 国产精品视频| 成人国产在线激情| 欧美一区二区三区激情| 国产女主播一区| 成人在线观看毛片| 丝袜美腿诱惑一区二区三区| 欧美精品vⅰdeose4hd| 视频免费在线观看| 色综合久久网| 色综合久久88| 亚洲中文无码av在线| 国产精品1区2区| 欧美一级爽aaaaa大片| www.久久ai| 91国在线观看| 91人妻一区二区| 成人看的视频| 久久人人爽人人| 91精品国产乱码久久久久| 99热99精品| 亚洲成av人片一区二区三区| 欧美日韩在线高清| 在线中文字幕-区二区三区四区 | 老头老太做爰xxx视频| 久久久久久久久久久9不雅视频| 97婷婷大伊香蕉精品视频| 91禁在线观看| 欧美激情一区二区三区全黄| 亚洲人成无码网站久久99热国产| 日韩免费在线电影| 亚洲人成在线电影| 久久在线视频精品| 韩国av一区二区三区四区| 日韩aⅴ视频一区二区三区| 9999在线视频| 日韩欧美123| 亚洲激情图片网| 老司机精品导航| 精品视频一区二区三区四区| 欧美人与性动交α欧美精品济南到| 91久久国产最好的精华液| 手机在线看福利| 伊人成综合网yiren22| 国模吧一区二区| 亚洲风情第一页| 亚洲欧美日韩国产中文在线| 亚洲高清免费在线观看| 精品国产一区二区三区av片| 91精品国产91久久| 神宫寺奈绪一区二区三区| 亚洲自拍偷拍麻豆| www.欧美com| 欧美日韩影院| 国产传媒一区| 搞黄网站在线看| 欧美videos中文字幕| 国产成人无码aa精品一区| 韩国一区二区在线观看| 亚洲人成网站在线播放2019| 农村末发育av片一区二区| 天天躁日日躁狠狠躁欧美巨大小说| 欧美激情免费视频| 亚洲av无码乱码国产精品| 一区二区三区日韩欧美精品 | 国产精品1区2区| 欧美日韩中文字幕在线播放| 欧美另类中文字幕| 欧美激情第1页| 色婷婷av一区二区三区之红樱桃| 亚洲超碰97人人做人人爱| 五十路六十路七十路熟婆| 99精品欧美| 欧美亚洲另类久久综合| 欧美一级二级视频| 色偷偷88888欧美精品久久久| 亚洲天堂中文在线| 亚洲人吸女人奶水| 特黄特色免费视频| 国产精品毛片一区二区三区| 女同一区二区| 欧美亚洲综合视频| 欧美久久久精品| 亚洲色图狠狠干| 欧美色电影在线| 青娱乐免费在线视频| av在线不卡电影| 婷婷激情四射五月天| 亚洲欧美综合久久久| 国产伦精品一区二区三区视频免费| av中文在线资源库| 亚洲天堂一区二区三区| 国产精品视频在线观看免费| 亚洲综合丝袜美腿| 国产熟妇久久777777| 久久99国产精品久久| www插插插无码免费视频网站| 日韩在线黄色| 国产欧美 在线欧美| 免费在线播放电影| 亚洲欧美制服中文字幕| 97人妻精品一区二区三区视频 | 福利一区二区免费视频| 欧美俄罗斯性视频| 日本福利片在线| 欧美日韩精品欧美日韩精品一| 久久久久久久久久久久久久久久久| 久久亚洲一区二区三区四区| 老司机午夜性大片| 中文亚洲字幕| 天堂av免费看| 中文字幕乱码久久午夜不卡| 国产精品一区二区三区在线观| 1024在线看片你懂得| 尤物九九久久国产精品的特点| 91久久久久久久久久久久| 亚洲第一成人在线| 国产精品久久久免费看| 成人18视频日本| 777一区二区| 亚洲一区二区伦理| 成人午夜免费在线视频| 日韩欧美视频专区| 免费在线观看91| 极品尤物一区| **亚洲第一综合导航网站| 日韩欧美另类一区二区| 久久久久久综合网天天| 免费av网站在线观看| 亚洲一区av在线播放| 污污视频在线观看网站| 日韩午夜在线播放| 亚洲天堂免费av| 欧美亚洲动漫精品| 国产免费av一区| 精品国产31久久久久久| 欧美日韩在线国产| 亚洲少妇屁股交4| 国产黄色录像片| 欧美激情综合在线| 巨胸大乳www视频免费观看| 成人免费毛片嘿嘿连载视频| 天堂av.com| 激情综合色综合久久综合| 91在线视频观看免费| 久久aⅴ国产紧身牛仔裤| 国产精品无码一区二区在线| 激情久久婷婷| 无码粉嫩虎白一线天在线观看| 91tv官网精品成人亚洲| 亚洲人成人77777线观看| 日韩免费在线| 伊人久久大香线蕉av一区| 精品久久综合| 亚洲国产一区二区在线 | 成人h视频在线观看| 久久免费福利| 97操在线视频| theporn国产在线精品| 成人在线观看av| 成人自拍在线| 国产精品国模大尺度私拍| 一区视频网站| 国产亚洲自拍偷拍| 西野翔中文久久精品国产| 久久免费看av| 欧美日韩激情| 一区二区三区视频| 一本一道久久a久久精品蜜桃| 精品国产三级a∨在线| 亚洲欧美一级二级三级| 亚洲国产精品成人天堂| 成人毛片18女人毛片| 亚洲国产精品ⅴa在线观看| 我不卡一区二区| 自拍偷自拍亚洲精品播放| 久久精品黄色片| 亚洲国产精品一区二区久久| 日本免费观看视| 在线观看国产91| 国产精品伦一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 亚洲欧美国产高清va在线播放| 亚洲国产精品美女| 国产无套粉嫩白浆在线2022年| 日韩在线免费视频观看| 日本片在线观看| 欧美中文在线字幕| 亚洲男人在线| 国产欧美一区二区视频| 国产影视精品一区二区三区| 日本特级黄色大片| 日韩视频一区二区三区在线播放免费观看| 日韩欧美在线播放视频| 久久精品999| 2一3sex性hd| 中文字幕av不卡| 国产真人真事毛片| 欧美在线一二三四区| 99在线观看精品视频| 亚洲男人的天堂在线| 国产黄a三级三级三级av在线看| 亚洲 日韩 国产第一| 成人在线视频免费| 精品无人区一区二区三区竹菊| 成人网18免费网站| 草b视频在线观看| 麻豆91小视频| 在线免费观看污视频| 中文字幕亚洲在| 国产精品久久久久久久久久精爆| 欧美一激情一区二区三区| 激情小说 在线视频| 欧美日韩高清在线观看| 欧美日韩激情电影| 国产欧美一区二区视频| 五月天综合网站| 国产视频一区二区三区在线播放 | 中文字幕一区二区三区久久网站| 无码人妻丰满熟妇区毛片18| 国产一区二区调教| 免费网站在线高清观看| 午夜精品123| 国产不卡精品视频| 中文字幕日韩欧美在线| 多野结衣av一区| www.久久草| 91精品国产91久久久久久密臀 | 大尺度一区二区| 九九热视频在线免费观看| 色狠狠色狠狠综合| 五月婷婷六月色| 久久人人爽人人爽人人片av高清| 久视频在线观看| 亚洲欧美一区二区三区极速播放 | 欧美久久久久免费| 邻居大乳一区二区三区| 91国产在线精品| eeuss国产一区二区三区四区| 特级毛片在线免费观看| 蜜桃视频在线一区| 美女脱光内衣内裤| 欧美性猛交xxxx黑人猛交| 天堂在线资源库| 久久久欧美一区二区| 99国产精品久久一区二区三区| 老汉色影院首页| 国产精品一区二区黑丝| 少妇人妻丰满做爰xxx| 欧美高清视频在线高清观看mv色露露十八| 成人免费在线视频网| 国产精品91久久久| 国产成人高清| 少妇激情一区二区三区| 国产日韩欧美一区二区三区乱码 | 欧美福利一区二区| 成人亚洲综合天堂| 国产精品丝袜久久久久久高清 | 欧美图片激情小说| 夫妻av一区二区| 日韩欧美一区二区一幕| 亚洲国产精品99| 中文字幕这里只有精品| 欧美系列一区| 蜜臀a∨国产成人精品| 在线观看日本黄色| 制服丝袜亚洲色图| 天堂av最新在线| 国产伦精品一区二区| 9色国产精品| 伊人网在线视频观看| 日本高清成人免费播放| 在线观看免费网站黄| 91精品中文在线| 亚洲黄色三级| 少妇真人直播免费视频| 欧美视频在线一区二区三区| 黄色成人影院| 国产精品免费观看高清| 久久国产福利| 羞羞在线观看视频| 日韩欧美国产电影| 在线天堂新版最新版在线8| 欧美凹凸一区二区三区视频| 欧美aⅴ一区二区三区视频| 日韩影院一区二区| 日韩免费一区二区| 国产高清不卡| aaa免费在线观看| 91女神在线视频| 国产精品久久久久久免费| 久久久久亚洲精品| 日韩免费在线| 亚洲图片综合网| 欧美精三区欧美精三区| 91破解版在线观看| 一区二区高清视频| av电影在线观看完整版一区二区| 日本熟妇一区二区三区| 欧美另类xxx| 精品视频免费| 中文字幕第九页| 欧美日韩国产综合一区二区 | 一本一本久久a久久综合精品| 欧美一区2区视频在线观看| 日本亚洲精品| 狼狼综合久久久久综合网| 精品亚洲成a人| www.国产毛片| 久久久久成人网|