精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美性xxxxxxxxx| 国产精品自拍毛片| 亚洲最新av在线| 三级a三级三级三级a十八发禁止| 触手亚洲一区二区三区| 精品一区二区三区免费播放| 欧美国产极速在线| 精品人妻互换一区二区三区| 91精品亚洲一区在线观看| 亚洲亚洲精品在线观看| 青青草成人网| 国产精品久久久久久久久久久久久久久久 | 国产欧美一区二区三区视频 | 天堂影院在线| 久久国产人妖系列| 69视频在线播放| 小向美奈子av| 免费视频亚洲| 精品乱人伦小说| 鲁一鲁一鲁一鲁一av| av剧情在线观看| 最新久久zyz资源站| 久久免费99精品久久久久久| 99在线小视频| 日韩av一区二区三区四区| 久久久久久欧美| 欧美三级黄色大片| 加勒比久久综合| 亚洲国产精品yw在线观看 | 国产精品蜜月aⅴ在线| 亚洲v精品v日韩v欧美v专区| www.亚洲一区二区| av电影在线网| 久久你懂得1024| 精品国产综合| 性欧美8khd高清极品| 毛片不卡一区二区| 热re91久久精品国99热蜜臀| 久久午夜无码鲁丝片| 久久久9色精品国产一区二区三区| 精品一区精品二区| 中文字幕第九页| 欧美区一区二区| 欧美嫩在线观看| 黄色永久免费网站| 日本在线精品| 欧美亚洲日本一区| 无码少妇一区二区三区芒果| 午夜影院在线观看国产主播| 亚洲二区在线观看| www.日本在线视频| 香蕉成人app免费看片| 亚洲视频一二三区| www.-级毛片线天内射视视| 在线免费观看黄色av| 亚洲国产成人午夜在线一区| 日韩欧美一区二区视频在线播放 | 亚洲色图av在线| 久久久亚洲av波多野结衣| 欧美交a欧美精品喷水| 亚洲国产精品va在线观看黑人| 亚洲成年人av| 美腿丝袜亚洲图片| 亚洲国产一区自拍| 丰满大乳奶做爰ⅹxx视频| 久久男人av| 日韩精品视频免费在线观看| 老牛影视av老牛影视av| 精品美女久久| 亚洲性69xxxbbb| 18啪啪污污免费网站| 亚洲澳门在线| 欧美激情亚洲另类| 97免费在线观看视频| 国产一区91| 国产精品xxx视频| 亚洲香蕉在线视频| 丰满放荡岳乱妇91ww| 激情视频一区二区| 国产天堂在线| 最近中文字幕一区二区三区| 97在线免费视频观看| av日韩中文| 91福利在线播放| 加勒比av中文字幕| 盗摄系列偷拍视频精品tp| 日韩av一区二区在线| 天堂资源在线视频| 欧美成人tv| 欧美亚洲另类制服自拍| 真实的国产乱xxxx在线91| 国内成人自拍视频| 狠狠久久综合婷婷不卡| 国产51人人成人人人人爽色哟哟| 中文字幕日韩精品一区| 老太脱裤子让老头玩xxxxx| 精品3atv在线视频| 日韩一区二区三区精品视频| 菠萝菠萝蜜网站| 国产精品麻豆久久| 91精品91久久久久久| 亚洲天堂中文网| 成人v精品蜜桃久久一区| 亚洲日本一区二区三区在线不卡| 青草av在线| 在线观看日韩av先锋影音电影院| 欧美一级大片免费看| 激情五月综合网| 欧美极品少妇xxxxⅹ喷水| 国产精品久久久久久久久久精爆| 国产一区二区三区在线观看免费视频| 国产一区二区不卡视频| 麻豆av免费在线观看| 岛国av一区二区三区| 91欧美一区二区三区| 亚洲人成精品久久久 | 日韩欧美精品在线不卡| 神马午夜伦理不卡| 欧美日韩在线三级| 亚洲一区二区三区无码久久| 在线观看国产精品入口| 国产精品久久精品| 天天色综合av| 亚洲一区二区三区国产| 成年网站免费在线观看| 在线日韩一区| 97超级碰碰人国产在线观看| 国产叼嘿视频在线观看| 国产精品午夜在线观看| 97视频在线免费播放| 国产精品网站在线看| 久久99热精品这里久久精品| 一道本无吗一区| 国产偷v国产偷v亚洲高清| 亚洲美免无码中文字幕在线| 亚洲图色一区二区三区| 久久精品国产电影| 在线观看毛片av| 中文字幕精品在线不卡| 老司机午夜av| 国产一区二区三区四区五区| 68精品国产免费久久久久久婷婷| 亚洲第一视频在线| 一区二区三区**美女毛片| 日韩在线一区视频| 日韩精品dvd| 国产精品欧美激情| 91在线网址| 色噜噜狠狠色综合欧洲selulu| 亚洲综合自拍网| 亚洲啪啪91| 国产在线一区二区三区播放| 国产盗摄一区二区| 精品对白一区国产伦| 国产一级免费观看| eeuss国产一区二区三区| 国产精品国产对白熟妇| 欧美a大片欧美片| 97精品一区二区三区| 无码国产精品一区二区免费16| 亚洲午夜私人影院| 天天插天天射天天干| 夜夜嗨一区二区| 欧美精品一区二区三区四区五区| 国精产品一区二区三区有限公司 | 国产福利久久精品| heyzo一区| 日韩成人av网址| 天天爽夜夜爽人人爽| 国产蜜臀97一区二区三区| 中文字幕22页| 欧美精品偷拍| 久久精品国产美女| av成人亚洲| 久久综合五月天| 黄色美女一级片| 色综合天天在线| 国产精品1区2区3区4区| 国产美女精品一区二区三区| 欧美一级片免费播放| 亚洲婷婷丁香| 成人av色在线观看| sqte在线播放| 中文亚洲视频在线| 精品国产av鲁一鲁一区| 大伊人狠狠躁夜夜躁av一区| 91无套直看片红桃在线观看| 国产高清在线观看免费不卡| 日本不卡在线观看视频| 日韩一区二区三区免费播放| 成人91视频| japanese23hdxxxx日韩| 另类天堂视频在线观看| 艳母动漫在线看| 欧美久久久久中文字幕| 日韩精品成人一区| 亚洲天堂网中文字| 泷泽萝拉在线播放| 国产在线播放一区| 国产aaa一级片| 女主播福利一区| 日本黑人久久| 亚洲va欧美va人人爽成人影院| 国产91免费观看| 污污网站在线看| 亚洲色图激情小说| 欧美77777| 欧美高清精品3d| 国产伦精品一区二区三区视频网站| 综合电影一区二区三区| 扒开jk护士狂揉免费| 国产成人精品1024| 天天综合网日韩| 亚洲免费网址| 日韩国产小视频| 99久久www免费| 欧美亚洲丝袜| 精品五月天堂| 97se国产在线视频| 成人在线啊v| 国产精品久久久久久av| 国产高清视频色在线www| 免费不卡欧美自拍视频| av在线免费观看网站| 亚洲精品一二区| 色欲久久久天天天综合网| 欧美一区二区三区视频在线观看| 波多野结衣影片| 日韩欧美在线字幕| 欧美一区二区激情视频| 亚洲一卡二卡三卡四卡| 91精品国产闺蜜国产在线闺蜜| 国产精品视频看| 国内精品卡一卡二卡三| 91麻豆福利精品推荐| 亚洲成年人在线观看| 国产风韵犹存在线视精品| 成人亚洲免费视频| 久久99精品国产.久久久久| 91最新在线观看| 日韩电影一二三区| 欧美精品无码一区二区三区| 视频一区在线播放| 精品人妻一区二区三区四区在线 | a视频免费在线观看| 欧美久久久久久久久中文字幕| 中文字幕av影视| 欧美三级在线视频| 一本到在线视频| 8x福利精品第一导航| 国产又粗又黄又爽视频| 91精品国产免费| 99热这里只有精品1| 日韩精品在线一区二区| 韩国av电影在线观看| 亚洲精品一区二区三区福利| 欧美一级特黄aaaaaa大片在线观看| 亚洲第一精品自拍| 亚洲欧美日韩成人在线| 亚洲欧美国产精品久久久久久久 | 日本亚州欧洲精品不卡| 91久久久一线二线三线品牌| 中文字幕亚洲在线观看| 国产亚洲情侣一区二区无| 中文有码一区| 性欧美精品一区二区三区在线播放| 日韩精品诱惑一区?区三区| 国产又粗又爽又黄的视频| 一区在线视频| 国产女女做受ⅹxx高潮| 人人狠狠综合久久亚洲| 日韩av一卡二卡三卡| 丁香激情综合五月| 色天使在线视频| 国产欧美日韩在线| 亚洲欧美精品aaaaaa片| 亚洲国产色一区| 中文字幕免费高清网站| 欧美一区二区三区免费大片| 日韩一级片免费观看| 亚洲性av网站| 在线看三级电影| 8090成年在线看片午夜| 国产精品99| 国产福利久久| 日本久久黄色| 无码人妻少妇伦在线电影| 老司机午夜精品视频在线观看| 亚洲娇小娇小娇小| 波多野结衣一区二区三区| 女人十八毛片嫩草av| 亚洲一卡二卡三卡四卡五卡| 国产又粗又猛又黄视频| 日韩精品一区二区三区在线播放| 天天影院图片亚洲| 久久久精品999| 黄色成人免费网| 91pron在线| 欧美艳星介绍134位艳星| 男人添女荫道口喷水视频| 日产国产欧美视频一区精品| 久久久久久久久久久影视| 久久久久久一二三区| 欧美三级小视频| 欧美丝袜丝nylons| 天天爱天天干天天操| 久久久999精品| 日本不卡一二三| 国产精品日本一区二区| 欧美成人自拍| 99精品视频播放| 成人深夜福利app| 希岛爱理中文字幕| 91国内精品野花午夜精品 | 欧美视频精品| 精品无人区一区二区三区竹菊| 亚洲欧洲日韩| 一道本视频在线观看| 91在线小视频| 激情四射综合网| 4438x亚洲最大成人网| 成年网站在线| 日韩av电影在线免费播放| 国偷自产av一区二区三区| 潘金莲一级淫片aaaaa免费看| 日韩国产成人精品| 久久精品国产亚洲av麻豆| 亚洲国产精品综合小说图片区| 国产丝袜在线视频| 色婷婷久久一区二区| 日韩网站中文字幕| 日韩精品久久一区二区三区| 国产伦理一区| aaaaa级少妇高潮大片免费看| 精品久久久国产| 爽爽视频在线观看| 欧美性在线视频| 欧美综合精品| 国产免费毛卡片| 97精品超碰一区二区三区| 国产无码精品在线观看| 精品美女一区二区| h片在线观看视频免费免费| 99久久99| 国产精品vip| 国产伦精品一区二区三区88av| 亚洲免费在线播放| 性做久久久久久久久久| 欧美高清在线观看| 超碰成人在线观看| 国产一区二区视频播放| av在线一区二区三区| 日韩伦理在线视频| 日韩精品免费在线视频观看| 免费日韩电影| 视频在线99re| 九九在线精品视频| 欧美大片xxxx| 亚洲精品在线观看网站| 91av久久| 欧美精品一区二区三区在线看午夜 | 九七电影院97理论片久久tvb| 秋霞久久久久久一区二区| 日本中文字幕一区二区有限公司| 国产精品suv一区二区88| 91精品在线观看入口| 特级毛片在线| 狠狠色噜噜狠狠狠狠色吗综合| 久久精选视频| 亚洲激情图片网| 日韩一区国产二区欧美三区| 国产在线拍揄自揄拍视频 | 深夜福利视频在线免费观看| 热久久99这里有精品| 久久精品国产亚洲夜色av网站| 九九热视频免费| 午夜视频久久久久久| 国产精品一区在线看| 91视频国产高清| 亚洲激情视频| 91精品国自产在线| 欧美一区2区视频在线观看| 2021中文字幕在线| 日本成人三级电影网站| 国产一区中文字幕| 中国一级特黄毛片| 色视频www在线播放国产成人 | 免费试看一区| 精品一区二区三区视频在线观看| 免费在线观看av网址| 亚洲天堂av在线免费观看| 成人污污www网站免费丝瓜| 国产精品50p| 亚洲欧美另类小说视频| 香蕉视频网站在线| 成人h视频在线观看播放| 夜夜爽av福利精品导航| 成人免费视频国产免费观看| 精品一区电影国产| aaa国产精品视频|