久久久精品视频在线_免费在线a视频_在线看的黄色网址_懂色av粉嫩av浪潮av_艳妇乳肉豪妇荡乳av_国产午夜大地久久_国产在线观看免费播放_天堂视频免费看_久久精品女同亚洲女同13_各处沟厕大尺度偷拍女厕嘘嘘

當前位置: 首頁 >綜合 > 正文

一起學 WebGL:紋理對象學習 全球速遞

2023-06-27 07:51:44 來源:前端西瓜哥

大家好,我是前端西瓜哥,今天我們來了解 WebGL 的紋理對象(Texture)


(資料圖片僅供參考)

紋理對象,是將像素(texels)以數組方式傳給 GPU 的對象,常見場景是貼圖,就是將圖片的數據應用到 3D 物體上。

紋理對象創建和綁定

先創建紋理對象:

const texture = gl.createTexture(); // 創建紋理對象

然后綁定到紋理單元:

gl.bindTexture(gl.TEXTURE_2D, texture); // 將紋理對象綁定上去
填充方式

紋理是要貼到畫布的某個區域上的,并不一定剛好設置一下填充方式。

紋理比繪制區域大,就要做縮放;紋理比繪制區域小,就要做放大;紋理沒能完全填充繪制區域,就要在水平和垂直方向進行填充。

這些場景都需要對應設置不同的策略。

// 縮小和放大都都使用 “最近點采樣”gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
紋理單元

WebGL 支持設置多個紋理單元(Texture Unit),即我們可以將多個圖片放到多個單元中,然后進行切換。

就好像手里拿著不同的蓋章,想印哪種圖案就掏出哪個蓋上去。

紋理單元是有上限的,至少要支持 8 個,主流瀏覽器一般支持 16 個。

具體支持幾個,可通過下面代碼獲得。

gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) // 通常是 16

默認使用 0 號紋理單元,可通過下面這一行代碼來切換紋理單元:

gl.activeTexture(gl.TEXTURE1); // 開啟 1 號紋理單元

注意這個要在將紋理對象綁定紋理單元之前執行。

最后我們需要設置一下我們的紋理采樣器選擇使用哪個紋理單元:

gl.uniform1i(u_Sampler, 0); // 開啟 0 號紋理對象

不主動調用這個方法,默認會使用 0 號紋理單元。

切換紋理單元是有一定的性能代價的,不建議你在短時間內不斷地切換紋理單元。簡單的渲染場景可忽略不計。

純色紋理

畫個純純的紅色紋理。

// 紅色const data = new Uint8Array([  255, 0, 0]);gl.texImage2D(  gl.TEXTURE_2D, // 紋理目標,這里是二維紋理  0, // 細節級別,0 表示最高級別  gl.RGB, // 紋理內部格式,還支持其他的比如 gl.RGBA、LUMINANCE(流明)  1, // 寬(寬高的單位為像素,且為 2 的 n 次冪)  1, // 高  0, // 是否描邊。必須為 0(但 opengl 支持)  gl.RGB, // 源圖像數據格式  gl.UNSIGNED_BYTE, // 紋素(單個像素)數據類型  data // 數據數組,一個個像素點);

主要注意的是,gl.texImage2D()方法支持函數重載,有多種傳入的參數的方式,注意分辨。具體看 官方文檔。

這里選擇使用 gl.RGB 格式,設置了一個(255, 0, 0)的紅色顏色值。

最后我們成功畫出一個純紅色塊。

完整代碼:

/** @type {HTMLCanvasElement} */const canvas = document.querySelector("canvas");const gl = canvas.getContext("webgl");const vertexShaderSrc = `attribute vec4 a_Position;attribute vec2 a_TexCoord;varying vec2 v_TexCoord;void main() { gl_Position = a_Position; v_TexCoord = a_TexCoord;}`;const fragmentShaderSrc = `precision highp float;uniform sampler2D u_Sampler;varying vec2 v_TexCoord;void main() {  gl_FragColor = texture2D(u_Sampler, v_TexCoord);}`;// 創建程序對象createProgram(gl);// 頂點坐標,紋理坐標const verticesTexCoords = new Float32Array([  // 左上點。  // 左邊兩個是頂點;右邊兩個是紋理  -0.5, 0.5, 0.0, 1,  // 左下  -0.5, -0.5, 0.0, 0.0,  // 右上  0.5, 0.5, 1, 1,  // 右下  0.5, -0.5, 1, 0.0,]);const FSIZE = verticesTexCoords.BYTES_PER_ELEMENT;// 創建緩存對象const verticesTexBuffer = gl.createBuffer();// 綁定緩存對象到上下文gl.bindBuffer(gl.ARRAY_BUFFER, verticesTexBuffer);// 向緩存區寫入數據gl.bufferData(gl.ARRAY_BUFFER, verticesTexCoords, gl.STATIC_DRAW);// 獲取 a_Position 變量地址const a_Position = gl.getAttribLocation(gl.program, "a_Position");// 將緩沖區對象分配給 a_Position 變量gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE * 4, 0);// 允許訪問緩存區gl.enableVertexAttribArray(a_Position);// 傳入紋理坐標位置信息const a_TexCoord = gl.getAttribLocation(gl.program, "a_TexCoord");gl.vertexAttribPointer(a_TexCoord, 2, gl.FLOAT, false, FSIZE * 4, FSIZE * 2);gl.enableVertexAttribArray(a_TexCoord);/***** 紋理對象 *****/const texture = gl.createTexture(); // 創建紋理對象const u_Sampler = gl.getUniformLocation(gl.program, "u_Sampler"); // 獲取 u_Sampler 地址// 記載圖片gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1); // 翻轉紋路圖像的 y 軸gl.activeTexture(gl.TEXTURE0); // 開啟 0 號紋理單元gl.bindTexture(gl.TEXTURE_2D, texture); // 將我們的紋理對象綁定上去// 配置紋理參數gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);// 【----關鍵代碼---】配置紋理圖像const data = new Uint8Array([255, 0, 0, 0, 255, 255, 0, 255, 0, 0, 255, 0]);gl.texImage2D(  gl.TEXTURE_2D, // 紋理目標  0, // 細節級別  gl.RGB, // 紋理內部格式  1,  1,  0,  gl.RGB, // 源圖像數據格式  gl.UNSIGNED_BYTE, // 紋素數據類型  data // 數據);gl.uniform1i(u_Sampler, 0); // 開啟 0 號紋理對象/****** 繪制 ******/// 清空畫布,并指定顏色gl.clearColor(0, 0, 0, 1);gl.clear(gl.COLOR_BUFFER_BIT);// 繪制矩形,這里提供了 4 個點gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);/**** 封裝的方法 ****/function createProgram(gl) {  /**** 渲染器生成處理 ****/  // 創建頂點渲染器  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;}

線上 demo:

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

多個色塊紋理

也可以同時設置多個色塊。

const data = new Uint8Array([  255, 0, 0, 255,   // 紅色  255, 255, 0, 255, // 黃色  0, 0, 255, 255,  // 藍色  0, 255, 0, 255,  // 綠色]);gl.texImage2D(  gl.TEXTURE_2D, // 紋理目標  0, // 細節級別  gl.RGBA, // 紋理內部格式  2,  2,  0,  gl.RGBA, // 源圖像數據格式  gl.UNSIGNED_BYTE, // 紋素數據類型  data // 數據);

創建了 2x2 4個像素大小的紋理,并制定了這個 4 個像素點的顏色,然后被放大繪制到指定區域上。

線上演示 demo:

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

圖片紋理

圖片紋理,需要加載玩圖片,將圖片對象綁定到紋理對象上。

// 將紋理圖像分配給紋理對象gl.texImage2D(  gl.TEXTURE_2D,  0, // 細節級別  gl.RGB,  gl.RGB,  gl.UNSIGNED_BYTE,  img // Image 實例);
結尾

紋理對象是很常用的一個對象,用于指定區域要填充的像素。

常見的是加載圖片,把圖片貼到三維的一個面上。也可以自己指定像素值。

標簽:

返回頂部
久草视频免费播放| a级一a一级在线观看| 国产强被迫伦姧在线观看无码| 波多野结衣不卡| 欧美成人精品网站| 国产精品永久久久久久久久久| 凹凸精品一区二区三区| 中文字幕 日韩有码| 国产一区二区小视频| 国产黄色一区二区| 天天射天天操天天干| 天堂中文在线官网| 国产精品久久不卡| 久久久久久久久久97| 久久av秘一区二区三区| 男人和女人啪啪网站| 国产自偷自偷免费一区| 久草国产在线观看| 天码人妻一区二区三区在线看| 亚洲字幕av一区二区三区四区| 超碰caoprom| 日本中文字幕在线观看视频| 日本美女高潮视频| 亚洲午夜精品久久久久久人妖| 天天做天天爱天天高潮| 日韩最新中文字幕| 久久精品无码一区| 日本加勒比一区| 一区二区三区免费观看视频| 99精品在线视频观看| 在线免费观看av片| 欧美 日韩 国产 成人 在线 91| 日日夜夜精品免费| 国产高潮呻吟久久| 亚洲av无码一区二区三区在线| 国产av熟女一区二区三区| 国产成人黄色片| 日韩精品在线免费看| 91欧美日韩麻豆精品| 扒开伸进免费视频| 老湿机69福利| 三级视频中文字幕| 日本黄色一级视频| 亚洲熟女一区二区三区| 91高清免费看| 成年网站在线播放| 中文字幕一区2区3区| 337p日本欧洲亚洲大胆张筱雨| 特黄一区二区三区| 欧美少妇性生活视频| 国产精品suv一区| 亚洲av午夜精品一区二区三区| 黄色一级大片在线免费观看| 欧美三级午夜理伦三级| 69av视频在线观看| 人妻无码一区二区三区| 国产极品尤物在线| www.av88| 91视频免费看片| 日本美女高潮视频| 国产不卡av在线播放| 日韩av片在线免费观看| 91av视频免费观看| 黄色av小说在线观看| 国产av不卡一区二区| 五月天综合在线| 波多野结衣加勒比| 国产真实乱子伦| 99久久国产热无码精品免费| 午夜成人亚洲理伦片在线观看| 亚洲福利精品视频| 免费国产精品视频| 69sex久久精品国产麻豆| 国产精品午夜一区二区| 日韩欧美视频免费观看| 人妻少妇偷人精品久久久任期| 一本大道东京热无码aⅴ| 久久99久久久| 成熟妇人a片免费看网站| 国产免费一区二区三区视频| 国产又粗又大又黄| 欧美一区免费观看| 欧美bbbbbbbbbbbb精品| 99re久久精品国产| 色男人天堂av| 亚洲午夜久久久久久久久红桃| 青青青国产在线观看| 国产精品伦一区二区三区| 一区二区视频网| 97人妻精品一区二区三区软件| 日本黄xxxxxxxxx100| 波多野结衣免费观看| 伊人免费在线观看| 青青草视频成人| 嫩草av久久伊人妇女超级a| 亚洲av无码乱码国产精品| 伊人网综合视频| 911av视频| 免费黄色在线视频| 日本网站在线免费观看| 少妇高潮惨叫久久久久| 日本黄色一级视频| avove在线观看| 亚洲女同志亚洲女同女播放| 欧美牲交a欧美牲交aⅴ免费真| 特种兵之深入敌后| 一级 黄 色 片一| av女人的天堂| 中文无码精品一区二区三区| 麻豆传媒网站在线观看| 欧美极品视频在线观看| 永久av免费网站| 99精品在线视频观看| 国产精品入口免费软件| 性欧美13一14内谢| 成人免费一区二区三区| 欧美成人黑人猛交| 亚洲一区二区自偷自拍| 精品不卡一区二区| 波多野结衣综合网| 男人女人拔萝卜视频| 午夜啪啪小视频| 日本伦理一区二区三区| 亚洲a视频在线| 97免费在线观看视频| 老子影院午夜伦不卡大全| 国产精品福利导航| 国产一区二区小视频| 99日在线视频| 欧美a级黄色大片| 欧美成人午夜精品免费| 国产偷人妻精品一区二区在线| 亚洲欧美天堂在线| 日韩精品在线视频免费观看| 国产jk精品白丝av在线观看 | 欧美综合在线播放| 最新中文字幕av| 69久久精品无码一区二区| 波多野结衣 久久| 色婷婷激情视频| 成人黄色片视频| 超碰成人在线免费观看| 性折磨bdsm欧美激情另类| 亚洲乱码国产乱码精品| 久久国产在线观看| 人人妻人人做人人爽| 欧美大片xxxx| 人妻无码一区二区三区| 性色av浪潮av| 高清一区二区三区四区| 手机av免费观看| 日本熟妇一区二区| 欧美久久久久久久久久久久| 国产福利一区视频| 日韩精品一区二区三区电影| 国产成人精品无码免费看夜聊软件| 婷婷色在线视频| 亚洲美女综合网| 成人av网站在线播放| 国产主播av在线| 女尊高h男高潮呻吟| 欧产日产国产精品98| 日本视频网站在线观看| jizzzz日本| 中文字幕一区二区三区四区五区人 | 国产毛片视频网站| 懂色av粉嫩av浪潮av| 在线观看国产三级| 亚洲 小说区 图片区 都市| 免费av一级片| 日本精品一二三区| 日韩一级性生活片| www.黄色网址.com| 性欧美大战久久久久久久| 成年人网站免费视频| 欧美日韩在线成人| 午夜一区二区视频| 久久久久久国产精品免费播放| 久久免费播放视频| 中文av字幕在线观看| 亚洲国产高清av| 久久成人国产精品入口| 在线免费黄色av| 国产精品一级视频| 精产国品一区二区三区| www.色天使| 午夜久久久久久久久久久| 国产真人做爰毛片视频直播| 69久久久久久| 国产手机在线视频| 亚洲爱情岛论坛永久| 超碰caoprom| 欧美一级爱爱视频| 51精品免费网站| 国产精品8888| 隔壁人妻偷人bd中字| 青青草视频在线免费播放| 国产传媒免费观看| 一级片免费网站| 污视频软件在线观看| 中文字幕91视频| 日本精品www| 日批视频免费在线观看| 无码人妻丰满熟妇区毛片蜜桃精品 | 成人精品在线播放| 美国精品一区二区| 国产日韩成人内射视频| 一二三av在线| 亚洲精品久久久久久动漫器材一区 | 自拍视频一区二区| 老太脱裤子让老头玩xxxxx| 麻豆视频在线观看| 香港三日本三级少妇66| 国产盗摄x88av| 国产一级免费观看| 在线观看欧美一区二区| 欧妇女乱妇女乱视频| 69成人免费视频| 亚洲精品乱码久久| 欧美性猛交久久久乱大交小说| 夜夜爽妓女8888视频免费观看| 精品国产人妻一区二区三区| 色欲av无码一区二区人妻| www.欧美色| 超碰人人人人人人人| 久久成人国产精品入口| av av在线| 天天干天天av| 在线观看你懂的视频| www.黄色网址.com| 销魂美女一区二区| 亚洲xxxx3d动漫| 91午夜精品亚洲一区二区三区| 人妻无码一区二区三区久久99| 天天干视频在线观看| 一本一本久久a久久| 国产成人免费观看视频| 林心如三级全黄裸体| 日本少妇毛茸茸高潮| 天堂中文在线观看视频| 欧美精品aaaa| 日韩少妇一区二区| 伊人影院综合在线| 手机在线看片日韩| 亚洲欧美日韩综合网| 亚洲成人日韩在线| 一级网站在线观看| 国产美女免费无遮挡| www.中文字幕在线观看| 国内偷拍精品视频| 无码人妻精品一区二区蜜桃色欲| 欧美做爰爽爽爽爽爽爽| 亚洲av无码不卡| 18禁男女爽爽爽午夜网站免费| 亚洲丝袜在线观看| 日本免费观看视| 成人在线视频一区二区三区| 久久精品视频在线观看免费| 摸摸摸bbb毛毛毛片| 欧美日韩在线视频播放| 狠狠干 狠狠操| 91精彩刺激对白露脸偷拍| 在线观看国产亚洲| 欧美啪啪免费视频| 成人网站免费观看| 一卡二卡三卡在线| 九九九九九国产| 成人性做爰片免费视频| 成人三级做爰av| 依依成人在线视频| 91视频这里只有精品| 一本—道久久a久久精品蜜桃| 激情视频网站在线观看| 免费看黄在线看| 国产三级在线观看完整版| 成人黄色免费视频| 国产无套在线观看| 国产在线青青草| 舐め犯し波多野结衣在线观看| 亚洲中文一区二区三区| 免费一级片在线观看| 奇米影视亚洲色图| 免费成人深夜蜜桃视频| 熟妇无码乱子成人精品| 亚洲熟妇av乱码在线观看| 99九九精品视频| 日本一区二区黄色| 希岛爱理中文字幕| 国产在线a视频| 91影院在线播放| 午夜精品久久久久久久久久久久久蜜桃| 国产91对白刺激露脸在线观看| 国产大学生自拍| 快灬快灬一下爽蜜桃在线观看| 亚洲天堂av网站| 亚洲av电影一区| 午夜精品一二三区| 一二三四区在线| 亚洲中文字幕一区二区| 精国产品一区二区三区a片| 尤蜜粉嫩av国产一区二区三区| 欧美一级视频免费看| 日本毛片在线免费观看| 免费看的黄色录像| 成人毛片视频免费看| 麻豆影视在线播放| 精品这里只有精品| 日本一级特级毛片视频| 丰满人妻av一区二区三区| 嫩草影院国产精品| 久久夜靖品2区| 亚洲AV无码精品国产| 伊人成年综合网| 污视频网站免费观看| 一区二区三区免费在线| 影音先锋亚洲天堂| 国产免费黄色片| 美女久久久久久久久久| 中文字幕求饶的少妇| 3d动漫一区二区三区| 九九热视频精品| 国产99999| 99久久久无码国产精品性 | 超碰影院在线观看| 亚洲视频一区二区三区四区| www.美色吧.com| 精品视频在线观看一区二区| 亚洲免费av一区| 亚洲一区二区三区高清视频| 一区二区三区少妇| 97在线观看免费高| 四季av综合网站| 亚洲国产精品一区二区久久hs| 国产一区二区三区乱码| 无码人妻黑人中文字幕| 国产原创剧情av| 极品美女扒开粉嫩小泬| 男人天堂2024| 日本少妇毛茸茸| caoporn超碰97| 亚洲精品喷潮一区二区三区| 一级黄色录像视频| 一二三av在线| 久久人人爽人人爽人人片| 欧美日韩一区二区在线免费观看| 亚洲字幕av一区二区三区四区| 男人的天堂官网| 看看黄色一级片| 日本69式三人交| 特级丰满少妇一级| 亚洲欧美日韩中文字幕在线观看| 蜜臀av无码一区二区三区| 国产成人免费看一级大黄| 日本精品福利视频| 中文字幕一二区| 麻豆映画在线观看| 亚洲精品一区二三区| 少妇高潮大叫好爽喷水| 久草视频在线免费| 欧美h视频在线观看| 一女二男一黄一片| 亚洲天堂第一区| 无码精品视频一区二区三区| www.com毛片| 午夜影院福利社| 亚洲制服中文字幕| 神马久久久久久久久久久| 日韩福利片在线观看| 啪啪一区二区三区| 99成人精品视频| 97国产精东麻豆人妻电影| 91精品人妻一区二区三区蜜桃2| 亚洲欧美自偷自拍另类| 狠狠人妻久久久久久综合蜜桃| 国产精品久久久久久久99| 天海翼在线视频| 精品国产区一区二| 欧美一级特黄a| 亚欧精品视频一区二区三区| 一级黄色a视频| 日本va中文字幕| 一区二区伦理片| 91麻豆成人精品国产| 亚洲美女爱爱视频| 日本黄色录像视频| www.xxx国产| 精品少妇爆乳无码av无码专区| 亚洲熟女www一区二区三区| 黄色av小说在线观看| 妺妺窝人体色www婷婷| 久久久久99精品成人片试看| 一级做a爱片久久毛片| 尤物国产在线观看| 日韩欧美123区| 91亚洲一线产区二线产区| 国产亚洲精品成人| 久久久久久久久久久久久国产精品| 日韩免费高清一区二区| 亚洲综合视频在线播放| 色一情一乱一伦一区二区三区日本|