glsl_buffer實(shí)現(xiàn)漸變?nèi)切畏椒ㄔ斀?/h1>
更新時(shí)間:2023年03月31日 16:45:20 作者:mool
這篇文章主要為大家介紹了glsl_buffer實(shí)現(xiàn)漸變?nèi)切畏椒ㄔ斀猓行枰呐笥芽梢越梃b參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
正文
上篇文章我簡(jiǎn)單封裝了一個(gè)glsl的程序類,并簡(jiǎn)單介紹了glsl的一些通信方式。這篇文章我們主要來介紹glsl中buffer的使用,結(jié)合上一篇文章中的attribute和varying來實(shí)現(xiàn)一個(gè)漸變色的三角形~
三角形
我們通過glsl畫一個(gè)三角形需要的是三個(gè)坐標(biāo)系中的點(diǎn),三點(diǎn)成面。而我們?cè)谑褂胓lsl畫一個(gè)動(dòng)態(tài)點(diǎn)用到的是vertexAttrib2f往vertexShader傳遞位置坐標(biāo),通過drawArrays繪制點(diǎn)。繪制一個(gè)三角形也是類似的思想,但是多頂點(diǎn)我們就不能以vertexAttrib2f的形式傳遞參數(shù),這時(shí)我們就要用到buffer,下面通過代碼詳細(xì)介紹buffer~
創(chuàng)建一個(gè)buffer
第一步我們需要?jiǎng)?chuàng)建一個(gè)buffer容器并綁定它
//創(chuàng)建一個(gè)buffer
let buffer = gl.createBuffer();
//綁定buffer
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
傳遞數(shù)據(jù)
通過Float32Array對(duì)象創(chuàng)建一個(gè)點(diǎn)位信息組合,并傳遞到buffer中
let vertices = [
......
];
vertices = new Float32Array(vertices); //創(chuàng)建一個(gè)float對(duì)象
//傳數(shù)據(jù)
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
分析
我們實(shí)現(xiàn)一個(gè)三角形需要的是三個(gè)二維的坐標(biāo)點(diǎn),所以我們需將vertices中的數(shù)據(jù)以倆倆一組的形式呈現(xiàn)。如何實(shí)現(xiàn)漸變呢? 我們不僅要存頂點(diǎn)位置信息也要存顏色rab信息,所以我們?cè)?strong>vertices中需以5個(gè)float為一組傳遞給attribute。下面我們來實(shí)現(xiàn)一下代碼~
三角形buffer數(shù)據(jù)及著色器信息
let vertices = [
-0.5,
0.0,
1.0,
0.0,
0.0, //頂點(diǎn)1
0.0,
0.8,
0.0,
1.0,
0.0, //頂點(diǎn)2
0.5,
0.0,
0.0,
0.0,
1.0, //頂點(diǎn)3
];
//頂點(diǎn)著色器,聲明a_position和a_Color的attribute屬性,v_Color的varying屬性
let vertexShader = `
attribute vec2 a_position;
attribute vec3 a_Color;
varying vec3 v_Color;
void main(){
v_Color = a_Color;
gl_Position = vec4(a_position,0.0,1.0);
}
`;
//片源著色器
let fragmentShader = `
precision mediump float;
varying vec3 v_Color;
void main() {
gl_FragColor = vec4(v_Color,1.0);
}
`;
buffer賦值attribute
這里用到了glsl通信相關(guān)知識(shí),我就不做展開,不了解的可以查看我的第一篇glsl開篇文章中有詳細(xì)介紹~ 這里需要獲取到attribute的內(nèi)存地址,并將buffer中的數(shù)據(jù)傳遞給attribute。這里面有一些注意點(diǎn),由于我們采用5個(gè)float一組的形式,前兩位是位置信息、后三位存儲(chǔ)顏色rgb,所以在傳遞前我們需告知attribute一組有幾位且從第幾位開始拾取~
let FSIZE = vertices.BYTES_PER_ELEMENT; //每一個(gè)值占用多少字節(jié) float32為4字節(jié)
//把buffer賦值給attribute
let a_position = gl.getAttribLocation(webgl.program, "a_position");
let a_Color = gl.getAttribLocation(webgl.program, "a_Color");
gl.vertexAttribPointer(
a_position, //vertexshader里面的變量的地址
2, //size:attribute變量的長(zhǎng)度(幾個(gè)一組)
gl.FLOAT, //數(shù)據(jù)類型 float
false, //歸一化 相當(dāng)于length等于1
FSIZE * 5, //stride:每個(gè)點(diǎn)(組)的信息所占用的字節(jié)BYTES
0 // offset:偏移(從第幾個(gè)開始)
);
gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE * 5, FSIZE * 2);
//確認(rèn)賦值
gl.enableVertexAttribArray(a_position);
gl.enableVertexAttribArray(a_Color);
繪制三角形
完成上方的buffer綁定以及傳遞attribute后,我們只需最后繪制三角形就行了~
//畫三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);
效果

結(jié)語
本系列作為glsl入門系列,本人也才接觸glsl語言,后續(xù)會(huì)根據(jù)學(xué)習(xí)進(jìn)度不斷更新,更多關(guān)于glsl buffer漸變?nèi)切蔚馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
-
Flow之一個(gè)新的Javascript靜態(tài)類型檢查器
今天我們興奮的發(fā)布了 Flow 的嘗鮮版,一個(gè)新的Javascript靜態(tài)類型檢查器。Flow為Javascript添加了靜態(tài)類型檢查,以提高開發(fā)效率和代碼質(zhì)量,本文給大家分享Flow之一個(gè)新的Javascript靜態(tài)類型檢查器,感興趣的朋友一起學(xué)習(xí)吧 2015-12-12
-
javascript中setAttribute兼容性用法分析
這篇文章主要介紹了javascript中setAttribute兼容性用法,結(jié)合實(shí)例形式分析了javascript使用setAttribute進(jìn)行屬性設(shè)置操作的相關(guān)使用技巧,需要的朋友可以參考下 2016-12-12
-
Webpack中css-loader和less-loader的使用教程
這篇文章主要介紹了關(guān)于Webpack中css-loader和less-loader的使用教程,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。 2017-04-04
-
微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件,滾動(dòng)導(dǎo)航效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2018-02-02
-
三種在ES6中將非數(shù)組轉(zhuǎn)換為數(shù)組的方法詳情
這篇文章主要介紹了三種在ES6中將非數(shù)組轉(zhuǎn)換為數(shù)組的方法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下 2022-08-08
-
javascript中window.open在原來的窗口中打開新的窗口(不同名)
本文給大家介紹使用window.open在原來的窗口中打開新的窗口,涉及到win.open新窗口相關(guān)知識(shí),對(duì)本文感興趣的朋友參考下 2015-11-11
-
IE關(guān)閉時(shí)判斷及AJAX注銷案例學(xué)習(xí)
當(dāng)關(guān)閉系統(tǒng)時(shí)會(huì)提示:你確定要退出系統(tǒng)嗎?退出請(qǐng)按'離開此頁'接下來將講解下IE關(guān)閉判斷及AJAX注銷,感興趣的你可不要錯(cuò)過了哈,希望本例對(duì)你學(xué)習(xí)ajax有所幫助 2013-02-02
最新評(píng)論
正文
上篇文章我簡(jiǎn)單封裝了一個(gè)glsl的程序類,并簡(jiǎn)單介紹了glsl的一些通信方式。這篇文章我們主要來介紹glsl中buffer的使用,結(jié)合上一篇文章中的attribute和varying來實(shí)現(xiàn)一個(gè)漸變色的三角形~
三角形
我們通過glsl畫一個(gè)三角形需要的是三個(gè)坐標(biāo)系中的點(diǎn),三點(diǎn)成面。而我們?cè)谑褂胓lsl畫一個(gè)動(dòng)態(tài)點(diǎn)用到的是vertexAttrib2f往vertexShader傳遞位置坐標(biāo),通過drawArrays繪制點(diǎn)。繪制一個(gè)三角形也是類似的思想,但是多頂點(diǎn)我們就不能以vertexAttrib2f的形式傳遞參數(shù),這時(shí)我們就要用到buffer,下面通過代碼詳細(xì)介紹buffer~
創(chuàng)建一個(gè)buffer
第一步我們需要?jiǎng)?chuàng)建一個(gè)buffer容器并綁定它
//創(chuàng)建一個(gè)buffer let buffer = gl.createBuffer(); //綁定buffer gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
傳遞數(shù)據(jù)
通過Float32Array對(duì)象創(chuàng)建一個(gè)點(diǎn)位信息組合,并傳遞到buffer中
let vertices = [ ...... ]; vertices = new Float32Array(vertices); //創(chuàng)建一個(gè)float對(duì)象 //傳數(shù)據(jù) gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
分析
我們實(shí)現(xiàn)一個(gè)三角形需要的是三個(gè)二維的坐標(biāo)點(diǎn),所以我們需將vertices中的數(shù)據(jù)以倆倆一組的形式呈現(xiàn)。如何實(shí)現(xiàn)漸變呢? 我們不僅要存頂點(diǎn)位置信息也要存顏色rab信息,所以我們?cè)?strong>vertices中需以5個(gè)float為一組傳遞給attribute。下面我們來實(shí)現(xiàn)一下代碼~
三角形buffer數(shù)據(jù)及著色器信息
let vertices = [ -0.5, 0.0, 1.0, 0.0, 0.0, //頂點(diǎn)1 0.0, 0.8, 0.0, 1.0, 0.0, //頂點(diǎn)2 0.5, 0.0, 0.0, 0.0, 1.0, //頂點(diǎn)3 ]; //頂點(diǎn)著色器,聲明a_position和a_Color的attribute屬性,v_Color的varying屬性 let vertexShader = ` attribute vec2 a_position; attribute vec3 a_Color; varying vec3 v_Color; void main(){ v_Color = a_Color; gl_Position = vec4(a_position,0.0,1.0); } `; //片源著色器 let fragmentShader = ` precision mediump float; varying vec3 v_Color; void main() { gl_FragColor = vec4(v_Color,1.0); } `;
buffer賦值attribute
這里用到了glsl通信相關(guān)知識(shí),我就不做展開,不了解的可以查看我的第一篇glsl開篇文章中有詳細(xì)介紹~ 這里需要獲取到attribute的內(nèi)存地址,并將buffer中的數(shù)據(jù)傳遞給attribute。這里面有一些注意點(diǎn),由于我們采用5個(gè)float一組的形式,前兩位是位置信息、后三位存儲(chǔ)顏色rgb,所以在傳遞前我們需告知attribute一組有幾位且從第幾位開始拾取~
let FSIZE = vertices.BYTES_PER_ELEMENT; //每一個(gè)值占用多少字節(jié) float32為4字節(jié)
//把buffer賦值給attribute let a_position = gl.getAttribLocation(webgl.program, "a_position"); let a_Color = gl.getAttribLocation(webgl.program, "a_Color"); gl.vertexAttribPointer( a_position, //vertexshader里面的變量的地址 2, //size:attribute變量的長(zhǎng)度(幾個(gè)一組) gl.FLOAT, //數(shù)據(jù)類型 float false, //歸一化 相當(dāng)于length等于1 FSIZE * 5, //stride:每個(gè)點(diǎn)(組)的信息所占用的字節(jié)BYTES 0 // offset:偏移(從第幾個(gè)開始) ); gl.vertexAttribPointer(a_Color, 3, gl.FLOAT, false, FSIZE * 5, FSIZE * 2); //確認(rèn)賦值 gl.enableVertexAttribArray(a_position); gl.enableVertexAttribArray(a_Color);
繪制三角形
完成上方的buffer綁定以及傳遞attribute后,我們只需最后繪制三角形就行了~
//畫三角形 gl.drawArrays(gl.TRIANGLES, 0, 3);
效果
結(jié)語
本系列作為glsl入門系列,本人也才接觸glsl語言,后續(xù)會(huì)根據(jù)學(xué)習(xí)進(jìn)度不斷更新,更多關(guān)于glsl buffer漸變?nèi)切蔚馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flow之一個(gè)新的Javascript靜態(tài)類型檢查器
今天我們興奮的發(fā)布了 Flow 的嘗鮮版,一個(gè)新的Javascript靜態(tài)類型檢查器。Flow為Javascript添加了靜態(tài)類型檢查,以提高開發(fā)效率和代碼質(zhì)量,本文給大家分享Flow之一個(gè)新的Javascript靜態(tài)類型檢查器,感興趣的朋友一起學(xué)習(xí)吧2015-12-12javascript中setAttribute兼容性用法分析
這篇文章主要介紹了javascript中setAttribute兼容性用法,結(jié)合實(shí)例形式分析了javascript使用setAttribute進(jìn)行屬性設(shè)置操作的相關(guān)使用技巧,需要的朋友可以參考下2016-12-12Webpack中css-loader和less-loader的使用教程
這篇文章主要介紹了關(guān)于Webpack中css-loader和less-loader的使用教程,文中通過示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)YDUI的ScrollNav組件,滾動(dòng)導(dǎo)航效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02三種在ES6中將非數(shù)組轉(zhuǎn)換為數(shù)組的方法詳情
這篇文章主要介紹了三種在ES6中將非數(shù)組轉(zhuǎn)換為數(shù)組的方法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08javascript中window.open在原來的窗口中打開新的窗口(不同名)
本文給大家介紹使用window.open在原來的窗口中打開新的窗口,涉及到win.open新窗口相關(guān)知識(shí),對(duì)本文感興趣的朋友參考下2015-11-11IE關(guān)閉時(shí)判斷及AJAX注銷案例學(xué)習(xí)
當(dāng)關(guān)閉系統(tǒng)時(shí)會(huì)提示:你確定要退出系統(tǒng)嗎?退出請(qǐng)按'離開此頁'接下來將講解下IE關(guān)閉判斷及AJAX注銷,感興趣的你可不要錯(cuò)過了哈,希望本例對(duì)你學(xué)習(xí)ajax有所幫助2013-02-02