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

當(dāng)前位置: 首頁 >綜合 > 正文

一起學(xué) WebGL:紋理對象學(xué)習(xí) 全球速遞

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

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


(資料圖片僅供參考)

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

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

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

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

然后綁定到紋理單元:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

純色紋理

畫個純純的紅色紋理。

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

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

這里選擇使用 gl.RGB 格式,設(shè)置了一個(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);}`;// 創(chuàng)建程序?qū)ο骳reateProgram(gl);// 頂點坐標(biāo),紋理坐標(biāo)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;// 創(chuàng)建緩存對象const verticesTexBuffer = gl.createBuffer();// 綁定緩存對象到上下文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ū)對象分配給 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);/***** 紋理對象 *****/const texture = gl.createTexture(); // 創(chuàng)建紋理對象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 號紋理單元gl.bindTexture(gl.TEXTURE_2D, texture); // 將我們的紋理對象綁定上去// 配置紋理參數(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é)級別  gl.RGB, // 紋理內(nèi)部格式  1,  1,  0,  gl.RGB, // 源圖像數(shù)據(jù)格式  gl.UNSIGNED_BYTE, // 紋素數(shù)據(jù)類型  data // 數(shù)據(jù));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) {  /**** 渲染器生成處理 ****/  // 創(chuàng)建頂點渲染器  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。

多個色塊紋理

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

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, // 紋理目標(biāo)  0, // 細(xì)節(jié)級別  gl.RGBA, // 紋理內(nèi)部格式  2,  2,  0,  gl.RGBA, // 源圖像數(shù)據(jù)格式  gl.UNSIGNED_BYTE, // 紋素數(shù)據(jù)類型  data // 數(shù)據(jù));

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

線上演示 demo:

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

圖片紋理

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

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

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

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

標(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>
    国产精品一区二区小说| 18禁网站免费无遮挡无码中文| 久色视频在线播放| 黄色片网址在线观看| 大西瓜av在线| 欧美成人三级在线视频| 欧美一级欧美一级| 日本精品www| 在线免费观看av的网站| 欧美成人乱码一二三四区免费| 一区二区三区入口| 日本精品一区在线| 欧美另类videosbestsex日本| 国产乱人伦精品一区二区三区| 丁香六月激情网| 不卡av免费在线| 一级黄色大片儿| 成人午夜精品久久久久久久蜜臀| 红桃av在线播放| 亚洲欧美偷拍另类| 欧妇女乱妇女乱视频| 北条麻妃视频在线| 国内外成人激情免费视频| 国内自拍在线观看| www激情五月| 免费 成 人 黄 色| 天堂av.com| 国自产拍偷拍精品啪啪一区二区| 亚洲欧美国产日韩综合| 日本一道在线观看| 国产又大又黄又粗的视频| www.黄色网址.com| aⅴ在线免费观看| 日韩精品一区二区三区电影| 免费男同深夜夜行网站| 久久视频免费在线| 成人黄色一区二区| 黄色三级中文字幕| 久久久久久综合网| 少妇高清精品毛片在线视频| 国产在线观看欧美| 57pao国产成永久免费视频| 国产青青在线视频| 草草草视频在线观看| 久久精品视频在线观看免费| av观看免费在线| 亚洲精品无码国产| 尤物网站在线看| 超碰超碰在线观看| 99久久激情视频| 黄色一级片播放| www.成年人视频| 91精品一区二区三区四区| 一区二区三区免费播放| 黄色片视频在线免费观看| 日本香蕉视频在线观看| 免费在线精品视频| 国产免费色视频| 国产系列第一页| 欧美日韩理论片| 在线观看中文av| 亚洲AV无码成人精品一区| 欧美美女一级片| 在线黄色免费观看| 亚洲va综合va国产va中文| 黄色免费网址大全| 一级做a免费视频| 一起操在线视频| 亚洲视频在线不卡| 免费观看黄色的网站| 51xx午夜影福利| 9色porny| 成年人黄色片视频| 在线观看av网页| 久久精品视频在线观看免费| 日本黄色a视频| 丁香六月激情婷婷| 亚洲熟妇av一区二区三区漫画| 中国丰满人妻videoshd| 成人观看免费完整观看| 日本新janpanese乱熟| 三日本三级少妇三级99| youjizz.com在线观看| 999精品网站| 黄频视频在线观看| 欧美久久久久久久久久久久久| 久久精品视频91| 日韩人妻精品一区二区三区| 欧美一级视频在线播放| 超碰在线人人爱| 人妻激情另类乱人伦人妻| 久久久精品在线视频| 国产免费中文字幕| 国产九九九九九| 久久久久国产一区| 日韩 欧美 视频| 欧美日韩精品区别| 黄色免费视频大全| 中国一级黄色录像| av五月天在线| 日日摸日日碰夜夜爽无码| 日本国产一级片| av免费中文字幕| 国产女主播av| 91精品999| 国产白丝袜美女久久久久| 天天成人综合网| 美女网站视频黄色| 国产午夜大地久久| 男女爱爱视频网站| 日本激情视频在线播放| 国产最新免费视频| avav在线播放| 无颜之月在线看| 做爰高潮hd色即是空| 亚洲天堂网一区| 成年人视频网站免费观看| 国产美女作爱全过程免费视频| 色噜噜狠狠永久免费| 国产a级片免费观看| www.中文字幕在线| 久久综合久久网| 四虎4hu永久免费入口| www.日本久久| 成人黄色一级大片| 国产又粗又长又爽又黄的视频| 亚洲精品一二三四五区| 亚洲色欲综合一区二区三区| 成年女人18级毛片毛片免费| 奇米777四色影视在线看| 99re99热| 成人黄色大片网站| 人人妻人人澡人人爽欧美一区双| 视色,视色影院,视色影库,视色网| 在线播放 亚洲| 热久久最新地址| 成人性免费视频| 99蜜桃臀久久久欧美精品网站| 日韩精品―中文字幕| 人妻熟女一二三区夜夜爱| 国产a视频免费观看| 黄大色黄女片18第一次| 五月激情五月婷婷| 天天干天天曰天天操| 亚洲黄色网址在线观看| 韩日视频在线观看| 波多野结衣家庭教师视频| 国产免费999| 国产日韩欧美久久| 日本福利视频网站| 欧美成人免费高清视频| 欧美激情国内自拍| 成年人网站国产| 精品日韩久久久| www成人免费| www.色就是色| 国产日韩欧美大片| 日韩欧美精品在线观看视频| 天天综合网久久| 日本人妻伦在线中文字幕| 熟妇人妻va精品中文字幕 | 国产一区二区在线免费播放| 色婷婷激情视频| 男人揉女人奶房视频60分| 想看黄色一级片| 日本午夜激情视频| 男女污污视频网站| 国产偷人视频免费| 99精品一区二区三区的区别| 激情综合网俺也去| 亚洲国产一二三精品无码| 日本新janpanese乱熟| 久久99久久久久久| 在线能看的av网站| 男人的天堂99| 大荫蒂性生交片| 色撸撸在线观看| 乱子伦视频在线看| 国产在线xxxx| 国产系列第一页| 狠狠干狠狠操视频| 黄色高清无遮挡| 亚洲熟妇无码一区二区三区| 亚欧精品在线视频| 天天影视综合色| 国产裸体舞一区二区三区| 国产乱人伦精品一区二区三区| 91精品999| 久久这里只精品| 久久久久久久片| av五月天在线| www.日日操| 亚洲欧美另类动漫| 最新中文字幕免费视频| 91看片就是不一样| 女人另类性混交zo| 在线免费观看视频黄| 视频在线观看免费高清| 亚洲一级片免费| 天天干天天曰天天操|