我欲封天 耳根 小说零,穿越小说排行榜,有声读物
http://m.shuleng.cn/
zh-hans
-
虛擬展廳技術:WebGL完整工作流程以及 Three.js 原理
http://m.shuleng.cn/news/512
<span>虛擬展廳技術:WebGL完整工作流程以及 Three.js 原理</span>
<span><span lang="" about="http://m.shuleng.cn/user/1" typeof="schema:Person" property="schema:name" datatype="" xml:lang="">Jyadmin</span></span>
<span>周五, 02/19/2021 - 16:42</span>
<div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>?</p>
<h4><strong>虛擬展廳技術:WebGL的完整工作流程</strong></h4>
<p>1、準備數據階段</p>
<p>在這個階段,我們需要提供頂點坐標、索引(三角形繪制順序)、uv(決定貼圖坐標)、法線(決定光照效果),以及各種矩陣(比如投影矩陣)。</p>
<p>其中頂點數據存儲在緩存區(因為數量巨大),以修飾符attribute傳遞給頂點著色器;</p>
<p>矩陣則以修飾符uniform傳遞給頂點著色器。</p>
<p>2、生成頂點著色器</p>
<p>根據我們需要,由Javascript定義一段頂點著色器(opengl es)程序的字符串,生成并且編譯成一段著色器程序傳遞給GPU。</p>
<p>3、圖元裝配</p>
<p>GPU根據頂點數量,挨個執行頂點著色器程序,生成頂點最終的坐標,完成坐標轉換。</p>
<p>4、生成片元著色器</p>
<p>模型是什么顏色,看起來是什么質地,光照效果,陰影(流程較復雜,需要先渲染到紋理,可以先不關注),都在這個階段處理。</p>
<p>5、光柵化</p>
<p>能過片元著色器,我們確定好了每個片元的顏色,以及根據深度緩存區判斷哪些片元被擋住了,不需要渲染,最終將片元信息存儲到顏色緩存區,最終完成整個渲染。</p>
<p><img alt="光柵化" data-entity-type="file" data-entity-uuid="eeccf534-ffd3-49d4-a7b6-2aef854c7a42" src="http://m.shuleng.cn/sites/default/files/inline-images/%E5%85%89%E6%A0%85%E5%8C%96.jpg" width="727" height="299" loading="lazy" /></p>
<h4><strong>虛擬展廳技術:Three.js 原理</strong></h4>
<p>three.js參與的流程:</p>
<p><img alt="three.js參與的流程" data-entity-type="file" data-entity-uuid="aa6f5fa7-e71a-4133-87be-57e71d88cd3c" src="http://m.shuleng.cn/sites/default/files/inline-images/three.js%E5%8F%82%E4%B8%8E%E7%9A%84%E6%B5%81%E7%A8%8B.jpg" width="712" height="244" loading="lazy" /></p>
<p>黃色和綠色部分,都是three.js參與的部分,其中黃色是javascript部分,綠色是opengl es部分。</p>
<p>three.js可以實現:</p>
<ul><li>
<p>輔助我們導出了模型數據;</p>
</li>
<li>
<p>自動生成了各種矩陣;</p>
</li>
<li>
<p>生成了頂點著色器;</p>
</li>
<li>
<p>輔助我們生成材質,配置燈光;</p>
</li>
<li>
<p>根據我們設置的材質生成了片元著色器。</p>
</li>
<li>
<p>而且將webGL基于光柵化的2D API,封裝成了我們人類能看懂的 3D API。</p>
</li>
</ul><h5><strong>?Three.js頂點處理流程</strong></h5>
<p>從WebGL工作原理的章節中,我們已經知道了頂點著色器會將三維世界坐標轉換成屏幕坐標,但實際上,坐標轉換不限于投影矩陣。</p>
<p>如下圖:</p>
<p><img alt="Three.js頂點處理流程" data-entity-type="file" data-entity-uuid="f4315902-b88b-415c-8782-0aba132ccc34" src="http://m.shuleng.cn/sites/default/files/inline-images/Three.js%E9%A1%B6%E7%82%B9%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B.jpg" width="709" height="202" loading="lazy" /></p>
<p>之前WebGL在圖元裝配之后的結果,由于我們認為模型是固定在坐標原點,并且相機在x軸和y軸坐標都是0,其實正常的結果是這樣的:</p>
<p><img alt="WebGL在圖元裝配之后的結果" data-entity-type="file" data-entity-uuid="c4615c8b-2c34-494c-b971-7bd12ae60dd4" src="http://m.shuleng.cn/sites/default/files/inline-images/WebGL%E5%9C%A8%E5%9B%BE%E5%85%83%E8%A3%85%E9%85%8D%E4%B9%8B%E5%90%8E%E7%9A%84%E7%BB%93%E6%9E%9C.jpg" width="676" height="181" loading="lazy" /></p>
<h5><strong>模型矩陣</strong></h5>
<p><strong><img alt="模型矩陣" data-entity-type="file" data-entity-uuid="0bc27d25-073f-4b55-86aa-7308e0fc225f" src="http://m.shuleng.cn/sites/default/files/inline-images/%E6%A8%A1%E5%9E%8B%E7%9F%A9%E9%98%B5.jpg" width="639" height="183" loading="lazy" /></strong></p>
<p>現在,將模型順時針旋轉Math.PI/6,所有頂點位置肯定都變化了。</p>
<blockquote>
<p>box.rotation.y = Math.PI/6;</p>
</blockquote>
<p>?但是,如果我們直接將頂點位置用javascript計算出來,那性能會很低(頂點通常成千上萬),而且,這些數據也非常不利于維護。</p>
<h5><strong>視圖矩陣</strong></h5>
<p><strong><img alt="視圖矩陣" data-entity-type="file" data-entity-uuid="ca7509e5-3ab0-484b-b4fb-aa6c59437b4c" src="http://m.shuleng.cn/sites/default/files/inline-images/%E8%A7%86%E5%9B%BE%E7%9F%A9%E9%98%B5.jpg" width="677" height="230" loading="lazy" /></strong></p>
<p>將相機往上偏移30。</p>
<blockquote>
<blockquote>
<p>camera.position.y = 30;</p>
</blockquote>
</blockquote>
<p>?同理,我們用矩陣viewMatrix將移動信息記錄下來。</p>
<h5><strong>投影矩陣</strong></h5>
<p><strong><img alt="投影矩陣" data-entity-type="file" data-entity-uuid="abd24d16-b371-4ac1-807b-1136ed4a67d1" src="http://m.shuleng.cn/sites/default/files/inline-images/%E6%8A%95%E5%BD%B1%E7%9F%A9%E9%98%B5.jpg" width="677" height="218" loading="lazy" /></strong></p>
<p>用projectMatrix記錄。</p>
<h5><strong>應用矩陣</strong></h5>
<p>編寫頂點著色器:</p>
<blockquote>
<p>gl_Position = position * modelMatrix * viewMatrix * projectionMatrix;</p>
</blockquote>
<p>?</p>
<p>這樣,我們就在GPU中,將最終頂點位置計算出來了。</p>
<p>實際上,上面所有步驟,three.js都幫我們完成了。</p>
<p><img alt="應用矩陣" data-entity-type="file" data-entity-uuid="1c71ec1e-e9a0-4462-9d7f-8fbd81903665" src="http://m.shuleng.cn/sites/default/files/inline-images/%E5%BA%94%E7%94%A8%E7%9F%A9%E9%98%B5.jpg" width="723" height="361" loading="lazy" /></p>
<h4><strong>片元著色器處理流程</strong></h4>
<p>片元著色器負責處理材質、燈光等信息,但具體是怎么處理呢?</p>
<p>如下圖:</p>
<p><img alt="片元著色器處理流程" data-entity-type="file" data-entity-uuid="94f1bd98-fb5f-46d5-933a-2ced20baea40" src="http://m.shuleng.cn/sites/default/files/inline-images/%E7%89%87%E5%85%83%E7%9D%80%E8%89%B2%E5%99%A8%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B.jpg" width="712" height="334" loading="lazy" /></p>
<h4><strong>three.js完整運行流程</strong></h4>
<p><img alt="three.js完整運行流程" data-entity-type="file" data-entity-uuid="90ade1ce-0dc6-42e4-9152-732bfa431a5f" src="http://m.shuleng.cn/sites/default/files/inline-images/three.js%E5%AE%8C%E6%95%B4%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B.jpg" width="711" height="272" loading="lazy" /></p>
<p>當選擇材質后,three.js會根據所選的材質,選擇對應的頂點著色器和片元著色器。</p>
<p>three.js中已經內置了我們常用著色器。</p>
<p>?</p>
<p>?</p>
</div>
<div class="field field--name-field-tags field--type-entity-reference field--label-above">
<div class="field--label">標簽</div>
<div class="field--items">
<div class="field--item"><a href="http://m.shuleng.cn/taxonomy/term/21" hreflang="zh-hans">虛擬展廳,WebGL,Three.js</a></div>
</div>
</div>
Fri, 19 Feb 2021 08:42:37 +0000
Jyadmin
512 at http://m.shuleng.cn
主站蜘蛛池模板:
91女神在线观看
|
十六一下岁女子毛片免费
|
永久免费aavv视频播放
|
国产三级全黄
|
午夜激情视频在线观看
|
一级毛片免费观看
|
日本高清在线一区二区三区
|
免费无遮挡十八污污网站
|
久久国产视频在线观看
|
一区二区精品在线观看
|
免费一级毛片正在播放
|
久久久久免费精品视频
|
日本久久中文字幕精品
|
中文字幕日产乱码偷在线
|
成人深夜视频
|
黄色网址国产
|
国产精品久久久天天影视香蕉
|
国产在线一区二区三区在线
|
精品国产成人a在线观看
|
欧美日韩色视频在线观看
|
天天影视欲香欲色成人网
|
日本免费va毛片在线
|
亚洲六区
|
欧美在线一区二区三区欧美
|
国产欧美视频在线
|
狠狠色丁香久久综合五月
|
国自产拍在线视频天天更新
|
24小时中文乱码字幕在线观看
|
欧美日韩在线视频观看
|
色一情一乱一伦一区二区三区
|
久久久久99精品成人片三人毛片
|
一级片黄色免费
|
五月天婷婷网亚洲综合在线
|
久久久久亚洲香蕉网
|
亚洲国产欧美日韩一区二区三区
|
一级毛片一级毛片免费毛片
|
久久91亚洲精品久久91综合
|
欧美国产综合日韩一区二区
|
91精品国产闺蜜国产在线
|
成年免费大片黄在线观看岛国
|
黄色在线播
|