高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘

當(dāng)前位置: 首頁 >滾動(dòng) > 正文

一起學(xué) WebGL:紋理對(duì)象學(xué)習(xí)|天天速訊

2023-06-28 03:43:44 來源:前端西瓜哥

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


(資料圖片僅供參考)

紋理對(duì)象,是將像素(texels)以數(shù)組方式傳給 GPU 的對(duì)象,常見場(chǎng)景是貼圖,就是將圖片的數(shù)據(jù)應(yīng)用到 3D 物體上。

紋理對(duì)象創(chuàng)建和綁定

先創(chuàng)建紋理對(duì)象:

const texture = gl.createTexture(); // 創(chuàng)建紋理對(duì)象

然后綁定到紋理單元:

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

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

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

這些場(chǎng)景都需要對(duì)應(yīng)設(shè)置不同的策略。

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

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

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

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

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

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

默認(rèn)使用 0 號(hào)紋理單元,可通過下面這一行代碼來切換紋理單元:

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

注意這個(gè)要在將紋理對(duì)象綁定紋理單元之前執(zhí)行。

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

gl.uniform1i(u_Sampler, 0); // 開啟 0 號(hào)紋理對(duì)象

不主動(dòng)調(diào)用這個(gè)方法,默認(rèn)會(huì)使用 0 號(hào)紋理單元。

切換紋理單元是有一定的性能代價(jià)的,不建議你在短時(shí)間內(nèi)不斷地切換紋理單元。簡(jiǎn)單的渲染場(chǎng)景可忽略不計(jì)。

純色紋理

畫個(gè)純純的紅色紋理。

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

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

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

最后我們成功畫出一個(gè)純紅色塊。

完整代碼:

/** @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);}`;// 創(chuàng)建程序?qū)ο骳reateProgram(gl);// 頂點(diǎn)坐標(biāo),紋理坐標(biāo)const verticesTexCoords = new Float32Array([  // 左上點(diǎn)。  // 左邊兩個(gè)是頂點(diǎn);右邊兩個(gè)是紋理  -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;// 創(chuàng)建緩存對(duì)象const verticesTexBuffer = gl.createBuffer();// 綁定緩存對(duì)象到上下文gl.bindBuffer(gl.ARRAY_BUFFER, verticesTexBuffer);// 向緩存區(qū)寫入數(shù)據(jù)gl.bufferData(gl.ARRAY_BUFFER, verticesTexCoords, gl.STATIC_DRAW);// 獲取 a_Position 變量地址const a_Position = gl.getAttribLocation(gl.program, "a_Position");// 將緩沖區(qū)對(duì)象分配給 a_Position 變量gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, FSIZE * 4, 0);// 允許訪問緩存區(qū)gl.enableVertexAttribArray(a_Position);// 傳入紋理坐標(biāo)位置信息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);/***** 紋理對(duì)象 *****/const texture = gl.createTexture(); // 創(chuàng)建紋理對(duì)象const u_Sampler = gl.getUniformLocation(gl.program, "u_Sampler"); // 獲取 u_Sampler 地址// 記載圖片gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1); // 翻轉(zhuǎn)紋路圖像的 y 軸gl.activeTexture(gl.TEXTURE0); // 開啟 0 號(hào)紋理單元gl.bindTexture(gl.TEXTURE_2D, texture); // 將我們的紋理對(duì)象綁定上去// 配置紋理參數(shù)gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);// 【----關(guān)鍵代碼---】配置紋理圖像const data = new Uint8Array([255, 0, 0, 0, 255, 255, 0, 255, 0, 0, 255, 0]);gl.texImage2D(  gl.TEXTURE_2D, // 紋理目標(biāo)  0, // 細(xì)節(jié)級(jí)別  gl.RGB, // 紋理內(nèi)部格式  1,  1,  0,  gl.RGB, // 源圖像數(shù)據(jù)格式  gl.UNSIGNED_BYTE, // 紋素?cái)?shù)據(jù)類型  data // 數(shù)據(jù));gl.uniform1i(u_Sampler, 0); // 開啟 0 號(hào)紋理對(duì)象/****** 繪制 ******/// 清空畫布,并指定顏色gl.clearColor(0, 0, 0, 1);gl.clear(gl.COLOR_BUFFER_BIT);// 繪制矩形,這里提供了 4 個(gè)點(diǎn)gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);/**** 封裝的方法 ****/function createProgram(gl) {  /**** 渲染器生成處理 ****/  // 創(chuàng)建頂點(diǎn)渲染器  const vertexShader = gl.createShader(gl.VERTEX_SHADER);  gl.shaderSource(vertexShader, vertexShaderSrc);  gl.compileShader(vertexShader);  // 創(chuàng)建片元渲染器  const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);  gl.shaderSource(fragmentShader, fragmentShaderSrc);  gl.compileShader(fragmentShader);  // 程序?qū)ο? 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。

多個(gè)色塊紋理

也可以同時(shí)設(shè)置多個(gè)色塊。

const data = new Uint8Array([  255, 0, 0, 255,   // 紅色  255, 255, 0, 255, // 黃色  0, 0, 255, 255,  // 藍(lán)色  0, 255, 0, 255,  // 綠色]);gl.texImage2D(  gl.TEXTURE_2D, // 紋理目標(biāo)  0, // 細(xì)節(jié)級(jí)別  gl.RGBA, // 紋理內(nèi)部格式  2,  2,  0,  gl.RGBA, // 源圖像數(shù)據(jù)格式  gl.UNSIGNED_BYTE, // 紋素?cái)?shù)據(jù)類型  data // 數(shù)據(jù));

創(chuàng)建了 2x2 4個(gè)像素大小的紋理,并制定了這個(gè) 4 個(gè)像素點(diǎn)的顏色,然后被放大繪制到指定區(qū)域上。

線上演示 demo:

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

圖片紋理

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

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

紋理對(duì)象是很常用的一個(gè)對(duì)象,用于指定區(qū)域要填充的像素。

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

標(biāo)簽:

返回頂部
高清视频在线观看免费播放器-伊人日本-色九月综合-18禁止看的免费污网站-免费观看性行为视频的网站-天天碰天天操-久久精品国产欧美日韩99热-中文字幕在线视频不卡-国产偷人妻精品一区二区在线-国内精品久-伊人影院在线看-密臀av一区-久久综合五月丁香久久激情-福利一区福利二区-gg国产精品国内免费观看-国产精品 高清 尿 小便 嘘嘘
  • <cite id="ecweg"><pre id="ecweg"></pre></cite>
    <rt id="ecweg"><acronym id="ecweg"></acronym></rt>
  • <rt id="ecweg"></rt>
    999热精品视频| 国产乱子伦精品无码专区| 大陆极品少妇内射aaaaaa| 91国内在线播放| 三级a在线观看| 九九视频精品在线观看| 国内外成人激情视频| 久色视频在线播放| 国产美女主播在线播放| 日本免费黄视频| 日韩中文字幕组| www.99在线| 欧美视频国产视频| 国产精品中文久久久久久| 国产精品久久久影院| 黄色三级中文字幕| 成人在线免费在线观看| chinese少妇国语对白| 三上悠亚在线一区二区| caoporm在线视频| 黄色激情在线视频| 欧美精品一区二区三区免费播放| 午夜精品久久久内射近拍高清| 国产成人a亚洲精v品无码| 亚洲精品高清无码视频| www.夜夜爽| 精品国偷自产一区二区三区| 欧美日韩一道本| 国产乱码一区二区三区四区| 国产在线无码精品| 日韩av在线综合| 日本高清免费在线视频| 欧美一区二区激情| wwwwxxxx日韩| 精品人妻大屁股白浆无码| 中文字幕一区二区三区四区在线视频| 中文字幕一区久久| 国产超级av在线| 加勒比海盗1在线观看免费国语版| 日韩av一二三四区| 天堂av免费看| 在线观看亚洲色图| 国产精品久久..4399| av在线免费看片| www.xxx亚洲| 男人天堂999| 黄色成人在线免费观看| 成年人三级黄色片| 日韩av在线综合| 欧美 日韩 国产 高清| 国产日产欧美一区二区| 99sesese| 浓精h攵女乱爱av| 黄色av免费在线播放| 国产男女在线观看| 日本免费不卡一区二区| www.一区二区.com| 国产女教师bbwbbwbbw| 99热一区二区三区| 深夜做爰性大片蜜桃| 欧美成人黄色网址| 久久国产这里只有精品| 无码少妇一区二区三区芒果| 激情六月丁香婷婷| 97公开免费视频| 日韩毛片在线免费看| 丰满爆乳一区二区三区| av高清在线免费观看| 欧美日韩成人免费视频| 国产91对白刺激露脸在线观看| heyzo国产| 一级特黄性色生活片| 日韩一级理论片| 亚洲第一成肉网| 国内自拍第二页| 伊人再见免费在线观看高清版 | 久久久久久久高清| 青青草原国产免费| 亚洲五码在线观看视频| 日韩在线视频在线| 亚洲熟女乱色一区二区三区| 99精品视频播放| 国产精品视频分类| 超碰在线超碰在线| www.xxx麻豆| 人妻内射一区二区在线视频| 超碰在线公开97| 色姑娘综合天天| 欧美视频免费看欧美视频| 国产a级片免费观看| 日本中文字幕在线不卡| 男女激情无遮挡| 日本精品一区在线| 奇米影视亚洲色图| 福利在线一区二区三区| 青青草综合视频| 日本三级免费观看| 潘金莲一级淫片aaaaa免费看| 日韩小视频在线播放| 久久久久久久久久久久久久久国产 | 成人3d动漫一区二区三区| 在线观看免费不卡av| 日本aa在线观看| 天堂av在线8| 国产在线青青草| 免费观看国产视频在线| 精品久久久久久中文字幕2017| 性鲍视频在线观看| 国产真人无码作爱视频免费| 国产a级黄色大片| 色婷婷狠狠18| 一本大道熟女人妻中文字幕在线| www.桃色.com| 九九热免费精品视频| 乱人伦xxxx国语对白| 国产免费xxx| 91丝袜超薄交口足| 国产视频手机在线播放| 国产视频一视频二| avav在线播放| 肉大捧一出免费观看网站在线播放| 免费高清在线观看免费| 欧美综合在线播放| 免费人成自慰网站| 警花观音坐莲激情销魂小说| 三日本三级少妇三级99| 超碰在线人人爱| 鲁一鲁一鲁一鲁一av| 欧美视频第三页| 国产xxxxx在线观看| 99色精品视频| 国产精品wwwww| 欧美日韩精品在线一区二区| 黄色激情在线视频| 99久久99久久精品| 亚洲国产精品久久久久婷蜜芽| 国产999免费视频| 国产精品av免费| 亚洲黄色片免费看| 亚洲国产精品三区| 亚洲成人天堂网| 国产日韩欧美精品在线观看| 亚洲精品视频导航| 欧美午夜性视频| 中文字幕在线乱| 九九热精品在线播放| 国产成人无码a区在线观看视频| 日韩av加勒比| 亚洲第一中文av| 黄在线观看网站| av之家在线观看| 免费人成自慰网站| 咪咪色在线视频| 久热在线视频观看| 成年人在线观看视频免费| 成年人看的毛片| 欧妇女乱妇女乱视频| 少妇熟女一区二区| 九九热视频免费| 亚洲一区日韩精品| 91n.com在线观看| 成人免费在线小视频| 日本丰满少妇xxxx| 久久久久久久中文| 久久亚洲中文字幕无码| 成人免费在线网| 久久国产精品网| 国产真人做爰毛片视频直播| 亚洲国产一二三精品无码| 黄色一级片网址| 四虎4hu永久免费入口| 永久免费在线看片视频| 无码人妻精品一区二区三区99v| 国产xxxxhd| 蜜臀精品一区二区| 欧美 国产 综合| 免费黄色特级片| 污片在线免费看| 手机在线国产视频| 久久国产精品免费观看| www.亚洲成人网| www国产黄色| 538在线视频观看| 吴梦梦av在线| 欧美一区二区视频在线播放| 国产a级片网站| 爱情岛论坛vip永久入口| 182午夜在线观看| 黄色片免费在线观看视频| 国产一级爱c视频| 男人添女人下面免费视频| 国内精品国产三级国产aⅴ久| av在线免费观看国产| 免费观看成人网| 手机av在线网站| 欧美不卡在线播放| caopor在线视频| 欧美视频在线第一页| 精品视频无码一区二区三区| 日韩av自拍偷拍|