pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5之WebGL 3D概述(上)―WebGL原生開(kāi)發(fā)開(kāi)啟網(wǎng)頁(yè)3D渲

HTML5之WebGL 3D概述(上)―WebGL原生開(kāi)發(fā)開(kāi)啟網(wǎng)頁(yè)3D渲染新時(shí)代_html5教程技巧HTML5中文學(xué)習(xí)網(wǎng),是中國(guó)最大的HTML5中文門(mén)戶,為廣大HTML5愛(ài)好者提供各種HTML5資料,包括HTML5網(wǎng)站、HTML5資訊、HTM
點(diǎn)評(píng):WebGL開(kāi)啟了網(wǎng)頁(yè)3D渲染的新時(shí)代,它允許在canvas中直接渲染3D的內(nèi)容,而不借助任何插件,看到此處是不是感覺(jué)特別驚訝啊,WebGL有一個(gè)很好的中文教程,就是下面使用參考中的第一個(gè)鏈接,所以這里不再班門(mén)弄斧,后面的內(nèi)容只是簡(jiǎn)單的總結(jié)一下學(xué)習(xí)的內(nèi)容,感興趣的朋友可以了

WebGL開(kāi)啟了網(wǎng)頁(yè)3D渲染的新時(shí)代,它允許在canvas中直接渲染3D的內(nèi)容,而不借助任何插件。WebGL同canvas 2D的API一樣,都是通過(guò)腳本操縱對(duì)象,所以步驟也是基本相似:準(zhǔn)備工作上下文,準(zhǔn)備數(shù)據(jù),在canvas中繪制對(duì)象并渲染。與2D不同的就是3D涉及的知識(shí)更多了,例如世界、光線、紋理、相機(jī)、矩陣等專業(yè)知識(shí)。WebGL有一個(gè)很好的中文教程,就是下面使用參考中的第一個(gè)鏈接,所以這里不再班門(mén)弄斧,后面的內(nèi)容只是簡(jiǎn)單的總結(jié)一下學(xué)習(xí)的內(nèi)容。

瀏覽器的支持
由于微軟有自己的圖形發(fā)展計(jì)劃,一直不支持WebGL,所以IE目前除了安裝插件外,是無(wú)法運(yùn)行WebGL的。其他的主流瀏覽器如Chrome、FireFox、Safari、Opera等,都裝上最新的版本就可以了。除了瀏覽器要裝最新的外,還要保證顯卡的驅(qū)動(dòng)也是最新的。
裝上這些以后,可以打開(kāi)瀏覽器,輸入下面的網(wǎng)址驗(yàn)證一下瀏覽器對(duì)WebGL的支持情況:http://webglreport.sourceforge.net/。

在正常安裝以上瀏覽器之后還是不能運(yùn)行WebGL,那你可以強(qiáng)制開(kāi)啟WebGL支持試一試。開(kāi)啟方法如下:
Chrome瀏覽器
我們需要為Chrome加入一些啟動(dòng)參數(shù),以下具體操作步驟以Windows操作系統(tǒng)為例:找到Chrome瀏覽器的快捷方式,右鍵點(diǎn)擊快捷方式,選擇屬性;在目標(biāo)框內(nèi),chrome.exe后面的引號(hào)后面,加入以下內(nèi)容:

--enable-webgl--ignore-gpu-blacklist--allow-file-access-from-files

點(diǎn)擊確定后關(guān)閉Chrome,然后用此快捷方式啟動(dòng)Chrome瀏覽器。
幾個(gè)參數(shù)的含義如下:
--enable-webgl的意思是開(kāi)啟WebGL支持;
--ignore-gpu-blacklist的意思是忽略GPU黑名單,也就是說(shuō)有一些顯卡GPU因?yàn)檫^(guò)于陳舊等原因,不建議運(yùn)行WebGL,這個(gè)參數(shù)可以讓瀏覽器忽略這個(gè)黑名單,強(qiáng)制運(yùn)行WebGL;
--allow-file-access-from-files的意思是允許從本地載入資源,如果你不是WebGL的開(kāi)發(fā)者,不需要開(kāi)發(fā)調(diào)試WebGL,只是想要看一下WebGL的Demo,那你可以不添加這個(gè)參數(shù)。

Firefox瀏覽器
Firefox的用戶請(qǐng)?jiān)跒g覽器的地址欄輸入“about:config”,回車,然后在過(guò)濾器(filter)中搜索“webgl”,將webgl.force-enabled設(shè)置為true;將webgl.disabled設(shè)置為false;在過(guò)濾器(filter)中搜索“security.fileuri.strict_origin_policy”,將security.fileuri.strict_origin_policy設(shè)置為false;然后關(guān)閉目前開(kāi)啟的所有Firefox窗口,重新啟動(dòng)Firefox。
前兩個(gè)設(shè)置是強(qiáng)制開(kāi)啟WebGL支持,最后一個(gè)security.fileuri.strict_origin_policy的設(shè)置是允許從本地載入資源,如果你不是WebGL的開(kāi)發(fā)者,不需要開(kāi)發(fā)調(diào)試WebGL,只是想要看一下WebGL的Demo,那你可以不設(shè)置此項(xiàng)。

Safari瀏覽器
在菜單中找到“屬性”→“高級(jí)”,選中“顯示開(kāi)發(fā)菜單”,然后到“開(kāi)發(fā)”菜單,選中“開(kāi)啟WebGL”。

開(kāi)發(fā)步驟

下面的代碼只是簡(jiǎn)單總結(jié)一下相關(guān)的概念,它來(lái)源于參考中的中文教程,涉及較多的3D方面的知識(shí)。感興趣的同學(xué)直接可以跳到實(shí)用參考中的中文教程中學(xué)習(xí),比我這里講解的要詳細(xì)和準(zhǔn)確的多。湊熱鬧的同學(xué)簡(jiǎn)單看看就可以了,不用深究每一行代碼的含義。


準(zhǔn)備工作
這個(gè)不用說(shuō)了,就是在頁(yè)面上添加一個(gè)canvas元素作為渲染的容器。例如:

復(fù)制代碼
代碼如下:

<bodyonload="start()">
<canvasid="glcanvas"width="640"height="480">
Yourbrowserdoesn'tappeartosupporttheHTML5canvaselement.
</canvas>
</body>

下面就是正式開(kāi)始寫(xiě)腳本的時(shí)候了,首先看一下程序入口以及整體結(jié)構(gòu):

復(fù)制代碼
代碼如下:

functionstart(){
varcanvas=document.getElementById("glcanvas");
initGL(canvas);
initShaders();
initBuffers();
gl.clearColor(0.0,0.0,0.0,1.0);
gl.enable(gl.DEPTH_TEST);
drawScene();
}

這里的幾個(gè)方法代表了典型的WebGL的繪制步驟:

步驟一:初始化WebGL工作環(huán)境 - initGL
這個(gè)方法的代碼如下:

復(fù)制代碼
代碼如下:

vargl;
functioninitGL(canvas){
gl=null;
try{
//Trytograbthestandardcontext.Ifitfails,fallbacktoexperimental.
gl=canvas.getContext("webgl")||canvas.getContext("experimental-webgl");
}
catch(e){} //Ifwedon'thaveaGLcontext,giveupnow
if(!gl){
alert("UnabletoinitializeWebGL.Yourbrowsermaynotsupportit.");
}
}

這個(gè)方法很簡(jiǎn)單,就是獲取WebGL的繪制環(huán)境,需要把參數(shù)"webgl"傳給canvas.getContext方法就行了,但是由于目前WebGL的標(biāo)準(zhǔn)沒(méi)有最終定型,所以實(shí)驗(yàn)階段用的參數(shù)都是"experimental-webgl"。當(dāng)然你直接去調(diào)用canvas.getContext("experimental-webgl")也是可以的,等標(biāo)準(zhǔn)定下以后,你再修改一個(gè)代碼。

步驟二:初始化著色器Shaders - initShaders
著色器Shader概念比較簡(jiǎn)單,說(shuō)白了就是顯卡運(yùn)算指令。構(gòu)造3D場(chǎng)景需要進(jìn)行大量的顏色、位置等等信息的計(jì)算,如果這些計(jì)算由軟件執(zhí)行的話,速度會(huì)很慢。所以把這些運(yùn)算讓顯卡去計(jì)算,速度就很快;如何去執(zhí)行這些計(jì)算,就是由著色器指定的。著色器代碼是用一種叫做GLSL的著色器語(yǔ)言編寫(xiě)的,這個(gè)我們不去講述這個(gè)語(yǔ)言了。
著色器可以在html中定義,在代碼中使用。當(dāng)然了你在程序中用一個(gè)字符串去定義著色器也是一樣的。
下面先看定義的部分:

復(fù)制代碼
代碼如下:

<scriptid="shader-fs"type="x-shader/x-fragment">
precisionmediumpfloat;
varyingvec4vColor;
voidmain(void){
gl_FragColor=vColor;
}
</script>
<scriptid="shader-vs"type="x-shader/x-vertex">
attributevec3aVertexPosition;
attributevec4aVertexColor;
uniformmat4uMVMatrix;
uniformmat4uPMatrix;
varyingvec4vColor;
voidmain(void){
gl_Position=uPMatrix*uMVMatrix*vec4(aVertexPosition,1.0);
vColor=aVertexColor;
}
</script>

這里有兩個(gè)著色器:面著色器和頂點(diǎn)著色器。
關(guān)于這兩個(gè)著色器,這里有必要說(shuō)明一下,計(jì)算機(jī)中的3D模型基本都是由點(diǎn)結(jié)合三角面片去描述的,頂點(diǎn)著色器就是去處理這些點(diǎn)的數(shù)據(jù),而面著色器就是通過(guò)插值的方式,去處理三角面片上點(diǎn)的數(shù)據(jù)。
上面定義的頂點(diǎn)著色器就定義了頂點(diǎn)的位置和顏色計(jì)算方式;而面著色器定義了插值點(diǎn)的顏色計(jì)算方式。實(shí)際的應(yīng)用場(chǎng)景中,還會(huì)涉及到在著色器中處理光線等效果。
定義了著色器,在程序中就可以查找到它們并可以去使用:

復(fù)制代碼
代碼如下:

varshaderProgram;
functioninitShaders(){
varfragmentShader=getShader(gl,"shader-fs");
varvertexShader=getShader(gl,"shader-vs");
shaderProgram=gl.createProgram();
gl.attachShader(shaderProgram,vertexShader);
gl.attachShader(shaderProgram,fragmentShader);
gl.linkProgram(shaderProgram);
if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){
alert("Couldnotinitialiseshaders");
}
gl.useProgram(shaderProgram);
shaderProgram.vertexPositionAttribute=gl.getAttribLocation(shaderProgram,"aVertexPosition");
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);
shaderProgram.vertexColorAttribute=gl.getAttribLocation(shaderProgram,"aVertexColor");
gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);
shaderProgram.pMatrixUniform=gl.getUniformLocation(shaderProgram,"uPMatrix");
shaderProgram.mvMatrixUniform=gl.getUniformLocation(shaderProgram,"uMVMatrix");
}

著色器是有了,但是怎么讓顯卡去執(zhí)行,Program就是這種橋梁,它是WebGL原生的二進(jìn)制碼,它的作用基本上就是讓顯卡運(yùn)行著色器代碼去渲染指定的模型數(shù)據(jù)。
這里還用到一個(gè)輔助方法getShader,這個(gè)方法就是遍歷html文檔,查找著色器的定義,拿到定義后創(chuàng)建著色器,這里就不細(xì)說(shuō)了:

復(fù)制代碼
代碼如下:

functiongetShader(gl,id){
varshaderScript,theSource,currentChild,shader;
shaderScript=document.getElementById(id);
if(!shaderScript){
returnnull;
}
theSource="";
currentChild=shaderScript.firstChild;
while(currentChild){
if(currentChild.nodeType==currentChild.TEXT_NODE){
theSource+=currentChild.textContent;
}
currentChild=currentChild.nextSibling;
}
if(shaderScript.type=="x-shader/x-fragment"){
shader=gl.createShader(gl.FRAGMENT_SHADER);
}elseif(shaderScript.type=="x-shader/x-vertex"){
shader=gl.createShader(gl.VERTEX_SHADER);
}else{
//Unknownshadertype
returnnull;
}
gl.shaderSource(shader,theSource);
//Compiletheshaderprogram
gl.compileShader(shader);
//Seeifitcompiledsuccessfully
if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){
alert("Anerroroccurredcompilingtheshaders:"+gl.getShaderInfoLog(shader));
returnnull;
}
returnshader;
}

步驟三:創(chuàng)建/加載模型數(shù)據(jù) - initBuffers
這些小例子中,模型數(shù)據(jù)基本都是直接生成的,實(shí)際的程序中,這些數(shù)據(jù)應(yīng)該都是從模型加載得到的:

復(fù)制代碼
代碼如下:

vartriangleVertexPositionBuffer;
vartriangleVertexColorBuffer;
functioninitBuffers(){
triangleVertexPositionBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,triangleVertexPositionBuffer);
varvertices=[
0.0,1.0,0.0,
-1.0,-1.0,0.0,
1.0,-1.0,0.0
];
gl.bufferData(gl.ARRAY_BUFFER,newFloat32Array(vertices),gl.STATIC_DRAW);
triangleVertexPositionBuffer.itemSize=3;
triangleVertexPositionBuffer.numItems=3;
triangleVertexColorBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,triangleVertexColorBuffer);
varcolors=[
1.0,0.0,0.0,1.0,
0.0,1.0,0.0,1.0,
0.0,0.0,1.0,1.0
];
gl.bufferData(gl.ARRAY_BUFFER,newFloat32Array(colors),gl.STATIC_DRAW);
triangleVertexColorBuffer.itemSize=4;
triangleVertexColorBuffer.numItems=3;
}

上面這段代碼創(chuàng)建了三角形的頂點(diǎn)和頂點(diǎn)的顏色數(shù)據(jù)并放在緩沖區(qū)中。

步驟四:渲染 - drawScene
準(zhǔn)備好了數(shù)據(jù)以后,交給WebGL去渲染就好了,這里調(diào)用的是gl.drawArrays方法。看代碼:

復(fù)制代碼
代碼如下:

functiondrawScene(){
gl.viewport(0,0,gl.viewportWidth,gl.viewportHeight);
gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);
pMatrix=okMat4Proj(45.0,gl.viewportWidth/gl.viewportHeight,0.1,100.0);
mvMatrix=okMat4Trans(-1.5,0.0,-7.0);
gl.bindBuffer(gl.ARRAY_BUFFER,triangleVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,triangleVertexPositionBuffer.itemSize,gl.FLOAT,false,0,0);
gl.bindBuffer(gl.ARRAY_BUFFER,triangleVertexColorBuffer);
gl.vertexAttribPointer(shaderProgram.vertexColorAttribute,triangleVertexColorBuffer.itemSize,gl.FLOAT,false,0,0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLES,0,triangleVertexPositionBuffer.numItems);
}

這個(gè)函數(shù)首先設(shè)置了3D世界的背景為黑色,然后設(shè)置投影矩陣,設(shè)置待繪制對(duì)象的位置,然后根據(jù)緩沖中的頂點(diǎn)和顏色數(shù)據(jù),繪制對(duì)象。這里還有一些生成投影矩陣和模型視圖矩形的輔助方法(使用了Oak3D圖形庫(kù)中的矩陣輔助方法)與主題關(guān)系不大,這里就不詳細(xì)解釋了。
基本上流程就是這么多了,更復(fù)雜的紋理,光線等都是在這些基礎(chǔ)上加入一些WegGL的特性實(shí)現(xiàn)的,這個(gè)請(qǐng)參看后面的中文教程,里面有詳細(xì)的例子。

怎么樣?使用原生的WebGL開(kāi)發(fā)是一種什么感受?不僅需要有深厚的3D知識(shí),還需要知道各種實(shí)現(xiàn)細(xì)節(jié)。WebGL這樣做是為了靈活的適應(yīng)各種應(yīng)用場(chǎng)景,但是對(duì)于大多數(shù)像我這樣非專業(yè)人士來(lái)說(shuō),很多細(xì)節(jié)是不需要知道的。這樣就催生了各種輔助開(kāi)發(fā)的類庫(kù),例如這節(jié)用到的Oak3D庫(kù)(為了演示W(wǎng)ebGL開(kāi)發(fā),例子中只用到了矩陣輔助方法)。下一節(jié)會(huì)介紹一個(gè)用的比較多的Three.js圖形庫(kù)。

實(shí)用參考:
中文教程:http://www.hiwebgl.com/?p=42

開(kāi)發(fā)中心:https://developer.mozilla.org/en/WebGL


【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過(guò)測(cè)試外,其他素材未做測(cè)試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

HTML5之WebGL 3D概述(下)―借助類庫(kù)開(kāi)發(fā)及框架介紹_html5教程技巧HTML5中文學(xué)習(xí)網(wǎng),是中國(guó)最大的HTML5中文門(mén)戶,為廣大HTML5愛(ài)好者提供各種HTML5資料,包括HTML5網(wǎng)站、HTML5資訊、HTML5應(yīng)用、HT
主站蜘蛛池模板: pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 奥运星-汽车性能网评-提供个性化汽车资讯 | 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 执业药师报名时间,报考条件,考试时间-首页入口 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 湖南自考_湖南自学考试网| 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 并离网逆变器_高频UPS电源定制_户用储能光伏逆变器厂家-深圳市索克新能源 | 手机游戏_热门软件app下载_好玩的安卓游戏下载基地-吾爱下载站 | 网站制作优化_网站SEO推广解决方案-无锡首宸信息科技公司 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 东莞喷砂机-喷砂机-喷砂机配件-喷砂器材-喷砂加工-东莞市协帆喷砂机械设备有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 手持气象站_便携式气象站_农业气象站_负氧离子监测站-山东万象环境 | 脉冲除尘器,除尘器厂家-淄博机械| 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 |