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

內卷年代,是該學學 WebGL 了

開發 前端
通過簡單的webgl入門,已經有了初步的認知,大致的流程為:著色器初始化 -> 著色器程序對象 -> 控制變量 -> 繪制,為了更好的性能,后面會使用緩沖區來解決重復渲染的問題,這樣我們的頂點不會一個一個設置而直接會被緩存,包括后面一些動態效果會涉及到矩陣的轉換,如平移、縮放、旋轉、復合矩陣。

?前言

大部分公司的都會有可視化的需求,但是用echarts,antv等圖表庫,雖然能快速產出成果,但是還是要知道他們底層其實用canvas或svg來做渲染,canvas瀏覽器原生支持,h5天然支持的接口,而svg相比矢量化,但是對大體量的點的處理沒有canvas好,但是可以操作dom等優勢。canvas和svg我們一般只能做2d操作,當canvas.getContext('webgl')我們就能獲取webgl的3d上下文,通過glsl語言操作gpu然后渲染了。理解webgl,可以明白h5的很多三維的api底層其實都是webgl實現,包括對canvas和svg也會有新的認知。

canvas和webgl的區別

canvas和webgl都可以做二維三維圖形的繪制。底層都會有對應的接口獲取。cancvas一般用于二維canvas.getContext("2d")?,三維一般可以通過canvas.getContext('webgl')

窺探WebGL

理解建模

如果你有建模軟件基礎的話,相信3dmax、maya、su等軟件你一定不會陌生,本質其實就是點、線、面來組成千變萬化的事物。打個比方球體就是無數個點連成線然后每三根線形成面,當然有常見的四邊形,其實也是兩個三邊形組成,為什么不用四邊形,因為三邊形更穩定、重心可計算、數據更容易測算。

所以核心也就是點、線、三角面

了解WebGL

WebGL可以簡單理解為是openGL的拓展,讓web端通過js可以有強大的圖形處理能力。當然為了與顯卡做交互你必須得會glsl語言。

GLSL

glsl著色器語言最重要的就是頂點著色器和片元著色器。簡單理解為一個定位置一個添顏色。

簡單繪制一個點

webgl會有大量的重復性前置工作,也就是創建著色器 -> 傳入著色器源碼 -> 編譯著色器 -> 創建著色器程序 -> 綁定、連接、啟用著色器 -> 可以繪制了!

一般而言我們是不會重復寫這個東西,封裝好了直接調用就行。

function initShader (gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE) {
const vertexShader = gl.createShader(gl.VERTEX_SHADER);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);

gl.shaderSource(vertexShader, VERTEX_SHADER_SOURCE);
gl.shaderSource(fragmentShader, FRAGMENT_SHADER_SOURCE);

//編譯著色器
gl.compileShader(vertexShader);
gl.compileShader(fragmentShader);

//創建程序對象
const program = gl.createProgram();

gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

gl.linkProgram(program);
gl.useProgram(program);

return program;
}
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./initShader.js"></script>
</head>

<body>
<canvas id="canvas" width="300" height="400">
不支持canvas
</canvas>
</body>

<script>
const ctx = document.getElementById('canvas')
const gl = ctx.getContext('webgl')

//著色器: 通過程序用固定的渲染管線,來處理圖像的渲染,著色器分為兩種,頂點著色器:頂點理解為坐標,片元著色器:像素

//頂點著色器源碼
const VERTEX_SHADER_SOURCE = `
void main() {
gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
gl_PointSize = 10.0;
}
`
//片元著色器源碼
const FRAGMENT_SHADER_SOURCE = `
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`
//創建著色器
const program = initShader(gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE)

//執行繪制
gl.drawArrays(gl.POINTS, 0, 1)
//gl.drawArrays(gl.LINES, 0, 1)
//gl.drawArrays(gl.TRIANGLES, 0, 1)

</script>

</html>

繪制效果如下:

圖片

相信看了上面有段代碼會有疑惑

圖片

gl_position代表坐標,vec4就一個存放個4個float的浮點數的容量,定義坐標, 分別對應x、y、z、w,也就是三維坐標,但是w就等于比例縮放xyz而已,一般在開發中,我們的瀏覽器的坐標要跟這個做個轉換對應上,gl_POintSize是點的大小,注意是浮點數

圖片

gl_flagColor渲染的像素是紅色,是因為這類似于比例尺的關系需要做個轉換, (R值/255,G值/255,B值/255,A值/1) ->(1.0, 0.0, 0.0, 1.0)

繪制動態點

<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./initShader.js"></script>
</head>

<body>
<canvas id="canvas" width="300" height="400">
不支持canvas
</canvas>
</body>

<script>
const canvas = document.getElementById('canvas')
const gl = canvas.getContext('webgl')

const VERTEX_SHADER_SOURCE = `
precision mediump float;
attribute vec2 a_Position;
attribute vec2 a_Screen_Size;
void main(){
vec2 position = (a_Position / a_Screen_Size) * 2.0 - 1.0;
position = position * vec2(1.0, -1.0);
gl_Position = vec4(position, 0, 1);
gl_PointSize = 10.0;
}
`
const FRAGMENT_SHADER_SOURCE = `
precision mediump float;
uniform vec4 u_Color;
void main() {
vec4 color = u_Color / vec4(255, 255, 255, 1);
gl_FragColor = color;
}
`
//前置工作,著色器可以渲染了!
const program = initShader(gl, VERTEX_SHADER_SOURCE, FRAGMENT_SHADER_SOURCE)

//獲取glsl的變量對應的屬性做修改
var a_Position = gl.getAttribLocation(program, 'a_Position');
var a_Screen_Size = gl.getAttribLocation(program, 'a_Screen_Size');
var u_Color = gl.getUniformLocation(program, 'u_Color');
gl.vertexAttrib2f(a_Screen_Size, canvas.width, canvas.height); //給glsl的屬性賦值兩個浮點數

//給個默認背景顏色
gl.clearColor(0, 0, 0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

//存儲點擊位置的數組。
var points = [];
canvas.addEventListener('click', e => {
var x = e.pageX;
var y = e.pageY;
var color = { r: Math.floor(Math.random() * 256), g: Math.floor(Math.random() * 256), b: Math.floor(Math.random() * 256), a: 1 };
points.push({ x: x, y: y, color: color })

gl.clearColor(0, 0, 0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

for (let i = 0; i < points.length; i++) {
var color = points[i].color;
gl.uniform4f(u_Color, color.r, color.g, color.b, color.a);
gl.vertexAttrib2f(a_Position, points[i].x, points[i].y);
gl.drawArrays(gl.POINTS, 0, 1);
}
})
</script>

</html>

vec2 position = (a_Position / a_Screen_Size) * 2.0 - 1.0; 注意這里的坐標轉換,從canvas轉為ndc坐標,其實就是看范圍就行,[0, 1] -> [0, 2] -> [-1, 1]。上面總體的流程總結下就是,定義著色器,定義glsl著色器源碼 -> 通過api獲取canvas的信息轉換坐標系 -> 監聽點擊事件傳遞變量到glsl中 -> 通過pointer緩存 -> drawArrays繪制。但是這種方法,很明顯有大量的重復渲染,每次遍歷都要把之前渲染的重復執行。

大致效果

圖片

總結

通過簡單的webgl入門,已經有了初步的認知,大致的流程為:著色器初始化 -> 著色器程序對象 -> 控制變量 -> 繪制,為了更好的性能,后面會使用緩沖區來解決重復渲染的問題,這樣我們的頂點不會一個一個設置而直接會被緩存,包括后面一些動態效果會涉及到矩陣的轉換,如平移、縮放、旋轉、復合矩陣。

責任編輯:武曉燕 來源: 前端YUE
相關推薦

2012-12-13 09:37:46

編程程序員

2022-06-07 14:25:23

數據團隊數據倉庫

2024-04-11 09:17:51

ArraysJava安全

2020-08-26 10:23:24

物聯網數據IOT

2021-09-27 22:40:13

比特幣虛擬貨幣金融

2013-07-22 13:23:45

2016-10-11 13:48:41

WebGLJavascriptWeb

2021-05-09 23:37:56

IDEAJava 開發者

2015-06-01 15:06:45

攜程數據庫災備

2020-08-17 09:30:34

代碼焦點程序員

2022-07-13 08:00:45

系統穩定性高可用

2024-03-07 12:45:27

PyTorch

2021-06-07 08:26:35

P8員工公司

2023-12-13 16:28:02

2020-11-26 06:38:14

分布式系統

2025-09-29 02:00:00

RAGAgentAI

2017-02-07 09:37:46

2011-04-11 16:04:29

DBA

2021-12-28 10:29:34

Web應用攻擊網絡攻擊數據泄露

2010-07-15 10:15:29

唐駿
點贊
收藏

51CTO技術棧公眾號

欧美日韩www| 欧美国产激情一区二区三区蜜月| 欧美激情精品久久久久久大尺度| 稀缺小u女呦精品呦| 午夜精品成人av| 一区二区三区四区激情| 青青草原成人| 丰满少妇在线观看bd| 日本美女视频一区二区| 欧美黄色www| 精品熟妇无码av免费久久| 一本色道69色精品综合久久| 91福利在线观看| 国产免费一区二区视频| 91网页在线观看| 91在线免费视频观看| 成人午夜激情网| 东京热一区二区三区四区| 欧美激情1区2区3区| 亚洲欧美另类人妖| 95视频在线观看| 国产在线不卡一区二区三区| 日本精品视频一区二区三区| 国产精品入口芒果| 黄网站视频在线观看| 久久精品夜夜夜夜久久| 韩国成人一区| 午夜久久久久久久久久| 久久国产成人午夜av影院| 欧美最猛性xxxx| 久久精品久久国产| 午夜av一区| 中文字幕亚洲一区| 白白色免费视频| 偷窥自拍亚洲色图精选| 亚洲成人免费网站| 91视频免费入口| 国产精品免费精品自在线观看| 欧美伊人精品成人久久综合97| 成年人网站免费视频| 欧美性受ⅹ╳╳╳黑人a性爽| 国产精品久久久久久久久晋中| 欧美成熟毛茸茸复古| 日本wwwxxxx| 成人晚上爱看视频| 成人蜜桃视频| 嫩草影院一区二区| 国产suv精品一区二区6| 亚洲一区二区日本| 99热这里只有精品99| 蜜臀99久久精品久久久久久软件| 国产极品精品在线观看| 国产免费a视频| 日韩电影在线看| 国产精品96久久久久久又黄又硬| 中文字幕xxxx| 美女视频黄免费的久久 | 欧美日韩在线免费观看视频| 日本美女在线中文版| 自拍偷拍欧美激情| 蜜臀在线免费观看| 搞黄网站在线看| 亚洲成av人影院在线观看网| 欧美色图色综合| 欧美大胆性生话| 欧美视频一二三区| 欧美视频亚洲图片| 成人看片爽爽爽| 亚洲精品久久久久| 精品成人av一区二区三区| 国产成人三级| www.xxxx精品| 疯狂试爱三2浴室激情视频| 欧美先锋影音| 茄子视频成人在线| 中文字幕视频一区二区| 国产美女精品在线| 国精产品一区二区| 在线观看完整版免费| 亚洲精品国产a| 成人毛片视频网站| 日韩不卡在线| 欧美一区二区三区影视| 日本少妇毛茸茸| 成人羞羞动漫| 欧美激情在线观看| 日韩黄色片网站| 国产精品一区不卡| 欧美极品色图| 在线视频中文字幕第一页| 午夜视频在线观看一区| 欧美一级特黄a| 福利片一区二区| 在线视频国产日韩| 久久综合亚洲色hezyo国产| 久久综合伊人| 99九九电视剧免费观看| 国产高清在线| 亚洲九九爱视频| 欧美黄色一级片视频| 日韩中文字幕视频网| 亚洲女同性videos| 五月天婷婷丁香| 极品少妇一区二区| 欧美日韩大片一区二区三区| av在线免费观看网址| 91成人免费在线视频| 无码人妻丰满熟妇区毛片蜜桃精品| 女人av一区| 久久久久久国产精品美女| 伊人亚洲综合网| 99久久国产免费看| av久久久久久| 国产一区二区三区四区五区3d | 91精品久久久久久久久久另类| 日日躁夜夜躁白天躁晚上躁91| 国产精品剧情在线亚洲| 久久久久久久久久久视频| 日韩精品一区二区三区中文在线| 国产亚洲福利一区| 久久中文字幕免费| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 久久视频在线视频| 性高潮视频在线观看| 99国产精品国产精品毛片| 女女同性女同一区二区三区按摩| 99亚洲伊人久久精品影院| 日韩精品在线观看一区| 日本少妇bbwbbw精品| 国产伦精品一区二区三区在线观看| 亚洲不卡中文字幕| 桃花岛tv亚洲品质| 日韩精品中文字幕在线播放| 日韩av电影网址| 成人美女视频在线看| 免费观看亚洲视频| 日韩欧美中文在线观看| 久久国产加勒比精品无码| 中文字幕在线2018| 国产精品色哟哟| www.天天射.com| av在线不卡顿| 国产九九精品视频| 麻豆传媒在线免费| 欧美一区二区三区影视| 国产精品白嫩白嫩大学美女| 国产乱码精品一品二品| 国产一级片91| 91精品丝袜国产高跟在线| 欧美日韩国产成人| 囯产精品久久久久久| 亚洲一区二区欧美日韩| 性久久久久久久久久久| 亚洲少妇诱惑| 日韩欧美在线一区二区| 91在线亚洲| 日韩视频精品在线| 亚洲第一页视频| 午夜电影一区二区| 麻豆av免费观看| 视频在线观看91| 亚洲蜜桃在线| 日本一区二区乱| 亚州精品天堂中文字幕| 日本福利片高清在线观看| 在线观看免费视频综合| 亚洲女人久久久| 国产v日产∨综合v精品视频| 69堂免费视频| 色综合狠狠操| 91麻豆精品秘密入口| 欧美裸体视频| 伊人伊成久久人综合网站| 国产精品国产一区二区三区四区 | 欧美日韩一区二区三区不卡视频| 欧美一级淫片videoshd| 2017亚洲天堂1024| 精品少妇一区二区三区日产乱码 | 欧美精品久久久久久久久46p| 国产成人免费av在线| 美女日批免费视频| 成人激情免费视频| 97在线资源站| 欧美影视资讯| 欧美激情视频在线免费观看 欧美视频免费一| 神马午夜精品95| 欧美色男人天堂| 日本在线观看中文字幕| 欧美国产欧美综合| 亚洲黄色小说在线观看| 日韩精品亚洲一区| 国产免费裸体视频| 日产精品一区二区| 韩国成人一区| 日本精品在线观看| 国产成人在线精品| 黑人精品视频| 色综合伊人色综合网| 香蕉av一区二区三区| 欧美老年两性高潮| 波多野结衣啪啪| 亚洲综合一区在线| 极品久久久久久久| youjizz久久| 亚洲国产欧美91| 日韩在线一区二区三区| 免费高清一区二区三区| 国产精品毛片久久| 日本不卡一区| 欧美综合精品| 成人自拍视频网站| 国产综合色区在线观看| 97视频com| 欧美黑人猛交的在线视频| 主播福利视频一区| 高清在线观看av| 国产视频久久网| 神马午夜精品95| 日韩精品一区二区在线| 在线免费看91| 在线视频国产一区| 中国一级免费毛片| 亚洲综合一二三区| 男女性高潮免费网站| 国产精品美女久久福利网站| 91网站免费入口| 99re成人在线| 2一3sex性hd| 成人18视频在线播放| 国偷自产av一区二区三区麻豆| 狠狠网亚洲精品| 日本一二区免费| 日本欧美一区二区三区乱码| 日韩在线xxx| 久久久999| 97在线免费公开视频| 欧美一级播放| 精品久久久久久久免费人妻| 野花国产精品入口| 日本a视频在线观看| 亚洲欧洲综合| 日本韩国欧美在线观看| 亚洲每日在线| www.com毛片| 久久久久久黄| 91在线视频观看免费| 蜜臀久久99精品久久久画质超高清| 少妇性l交大片| 麻豆国产精品一区二区三区 | 久久精品99久久香蕉国产色戒| 午夜小视频在线| 日韩中文字在线| 伊人在我在线看导航| 久久99精品久久久久久青青91 | 欧美日韩激情视频| 中文字幕激情小说| 在线亚洲人成电影网站色www| 91麻豆精品在线| 欧美精品日韩一区| 亚洲av无码一区二区三区dv | jizz在线观看视频| 久久精品国产一区二区电影| 成人在线app| 97久久精品视频| 小黄鸭精品aⅴ导航网站入口| 国产精品爽黄69| 美女久久精品| 久久riav二区三区| 欧美精品一区二区久久| 一区二区在线高清视频| 国产一区亚洲| 国产精品69页| 国产一区二区三区高清播放| 韩国av中国字幕| 久久久精品国产免大香伊| 污污视频网站在线免费观看| 夜夜嗨av一区二区三区网页| www.com亚洲| 欧美一级国产精品| 青青青草原在线| 久久久www成人免费精品| sm久久捆绑调教精品一区| 国产精品久久久久久久久久| 香蕉免费一区二区三区在线观看 | 国产原创剧情av| 久久久久99精品国产片| 看片网站在线观看| 在线免费观看日本一区| www五月婷婷| 中文字幕亚洲图片| 成年人黄色大片在线| 国产精品揄拍500视频| 成人在线视频中文字幕| 日韩欧美激情一区二区| 欧美日韩免费| 熟妇人妻va精品中文字幕| 精品写真视频在线观看| 亚洲永久无码7777kkk| 亚洲免费观看高清| 少妇高潮av久久久久久| 亚洲大尺度美女在线| 天堂资源在线中文| 日本午夜人人精品| 波多野结衣在线一区二区| 天堂√在线观看一区二区| 亚洲承认在线| 成人免费播放视频| 国产喂奶挤奶一区二区三区| 精品无码免费视频| 在线电影院国产精品| 青梅竹马是消防员在线| 性欧美办公室18xxxxhd| 高清久久一区| 午夜精品短视频| 久久国产欧美| 水蜜桃av无码| 亚洲一区中文日韩| 国产精品自产拍| 中文日韩在线视频| 免费看av不卡| 久久久精品动漫| 精品69视频一区二区三区Q| 91插插插影院| 最新不卡av在线| 一级做a爱片久久毛片| 国产亚洲欧洲高清| 日韩av超清在线观看| 久久久久久久久久久久久9999| 激情婷婷亚洲| 精品久久久久久无码人妻| 亚洲免费色视频| 国产麻豆精品一区| 日韩视频第一页| 爱情电影网av一区二区| 亚洲欧洲日韩精品| 美女一区二区视频| 99精品中文字幕| 91精品午夜视频| 久久久久久国产精品免费无遮挡| 国产欧美一区二区白浆黑人| 欧美电影免费观看高清| 成人免费在线观看视频网站| 中文字幕中文字幕在线一区| 最新中文字幕免费| 日韩一区在线视频| www.欧美视频| www.好吊操| 91网上在线视频| 五月婷婷激情视频| 亚洲一级片在线看| 国产欧美自拍| 欧美少妇在线观看| 国产成人精品网址| 日本少妇全体裸体洗澡| 国产视频精品自拍| 69堂免费精品视频在线播放| 亚洲区一区二区三区| 久久99国产精品免费| 日本中文在线视频| 欧美精品一区二区三区视频| 亚洲风情在线资源| 天堂一区二区三区| 国内久久婷婷综合| 国产小视频在线观看免费| 日韩不卡中文字幕| 992tv国产精品成人影院| 最近中文字幕免费mv| 国产91精品精华液一区二区三区 | 国产原创精品| 久久久久久久欧美精品| 国产又粗又长又黄的视频| 欧美第一区第二区| 中文字幕这里只有精品| 亚洲春色在线视频| 国产精品99久久久久久久女警| 18精品爽视频在线观看| 亚洲久久久久久久久久久| 九九久久国产| 男人添女荫道口女人有什么感觉| 久久亚洲精品小早川怜子| 97在线播放免费观看| 97精品久久久中文字幕免费| 日本不卡高清| 涩视频在线观看| 精品视频1区2区| www.youjizz.com在线| 亚洲乱码国产乱码精品天美传媒| 风间由美性色一区二区三区 | 亚洲国产成人久久| 久久69成人| 香港三级韩国三级日本三级| 国产精品每日更新| 色视频在线观看| 亚洲伊人久久大香线蕉av| 性欧美长视频| 免费在线观看亚洲| 在线欧美激情| 日韩精品在在线一区二区中文| 国产精品18久久久| 五月婷婷丁香在线|