首頁 web前端 js教程 THREE.JS入門教學(2)著色器-上_基礎知識

THREE.JS入門教學(2)著色器-上_基礎知識

May 16, 2016 pm 05:43 PM

譯序
Three.js是一個很棒的開源WebGL函式庫,WebGL允許JavaScript操作GPU,在瀏覽器端實現真正意義的3D。但目前這項技術還在發展階段,資料極為匱乏,愛好者學習基本上要透過Demo源碼和Three.js本身的源碼來學習。

0.簡介
之前我已經給了一篇《開始使用Three.js》。如果你還沒讀過,你可能需要去讀一下,本文的基礎是在那一篇教學的基礎上完成的。

我想討論一下著色器。在Three.js幫助你免去了很多麻煩之前,原生WebGL就很優秀了。有的時候,你也許會想要完成一些特定的效果,或是想對呈現在你的螢幕上的東西鑽研得更深入一些,那麼著色器一定會進入你的視野。如果你跟我一樣,你也同樣希望實現一些比上一篇教學中的基礎更有意思的東西。在這篇教程中,我會講解Three.js的基礎,這些基礎其實為我們做了很多枯燥的工作。
在開始之前我還要說,這篇教學會有相當多的篇幅在解釋著色器的程式碼,之後會有一篇教學會在著色器程式碼的基礎上前進一點,利用著色器去做點什麼。這是因為著色器shaders第一眼看起來並不易懂,需要一些解釋。
1.兩種著色器
WebGL沒有固定的渲染管線,你無法直接使用一個黑盒子式的著色器(譯者註:上個世紀的顯卡基本上都只支持固定渲染管線);WebGL提供的是可程式化的管線,這種方式更強大但也更難理解和使用。長話短說,可程式渲染管線意味著編寫程式的人要自己負責取得頂點並將它繪製在螢幕上了。著色器是渲染管線的一部分,有兩種著色器:
1.頂點著色器
2.片元著色器
你應該知道的是,這兩種著色器都完全運作在顯示卡在的GPU上,我們將需要它們處理的資料從CPU上卸下,裝到GPU上,減輕了CPU的復旦。現代的GPU對著色器所需的呼叫的運算類型都做了大幅優化,這樣做很值得。
2.頂點著色器
基元形狀,例如一個球體,是由頂點構成的,對吧?頂點著色器被依序傳入這些頂點中的一個頂點,然後處理它。如何處理每個頂點是可以自由自訂的,但頂點著色器有一個必做的事,就是為一個名為 gl_Position 的變數賦值,該變數是一個4維數組,表示該頂點最終在螢幕上的位置。這本身是個有趣的過程,因為我們實際上在談論如何將一個三維座標(一個具有x、y、z值得頂點)轉化為,或者說投影到二維的螢幕上。謝天謝地,如果我們使用Three.js之類的工具,我們能夠如此方便地存取到 gl_Position 。
3.片元著色器
現在我們有包含頂點的三維物體了,現在要將物體投影到二維螢幕上了,但顏色哪裡去了?紋理和光照呢?這正是片元著色器要處理的。
和頂點著色器類似,片元著色器有一項必須完成的任務:設定或消除變數 gl_FragColor ,另一個四維浮點變量,也就是片元點最終的顏色。什麼是片元?想像一個具有三個頂點的三角形,片元就是經過這三個頂點計算後的,所有在三角形內部的點。因此,片元值由頂點的值內插產生。如果一個頂點的顏色是紅色,相鄰頂點的顏色是藍色,那麼我們可以觀測到顏色從紅色頂點附近漸變,由紅色變成紫色,最終在藍色頂點附近變成藍色。
4.著色器變數 說到著色器變量,有三種:Uniforma,Attributes和Varyings。當我第一次聽到這三個字時,我很困惑,因為它們和我之前用到的東西完全不符。但現在,你可以這樣理解它們:
1.Uniforms變數既可以傳入頂點著色器,也可以傳入片元著色器,它們包含了哪些在整個渲染過程中保持不變的變量,例如,一個點光源的位置。
2.Attributes變數對應於每個頂點,它們只可以傳入頂點著色器中,例如每個頂點都具有一個顏色。 Attributes變數和頂點的關係是一一對應的。
3.Varyings變數是在頂點著色器中定義,並且準備傳入給片元著色器的變數。為了確保這一點,我們需要確保在兩個著色器中變數的類型和命名完全一致。一個經典的應用是法線向量,因為在計算光照的時候需要用到法線。
在後面一篇教學中,我會使用這三種變量,你也會學到這三種變數如何真正應用得。
現在,我們已經談過了頂點著色器、片元著色器和三種著色器變數。是時候來看一個我們可以創建的最簡單的著色器了。
5.Hello World(譯者吐槽:能不能不要秀法語啊)
這兒有一個最簡單的頂點著色器:
複製程式碼 程式碼如下:

/**
* 每個頂點座標乘以模型視圖矩陣在乘以投影矩陣
* 獲得在二維螢幕上的座標
*/
void main() {
gl_Position =*/
void main() {
gl_Position = projection> 🎜>modelViewMatrix *
vec4(position,1.0);
}


一個最簡單的片元著色器:
複製程式碼


程式碼如下:


/**
* 將任一像元色設定為粉紅
*/
void main() {
gl_FragColor = vec4(1.0, / / R
0.0, // G
1.0, // B
1.0); // A
}


這就是全部了。現在直接運行的話,你就可以在螢幕上看到一個「無光」的粉紅色形體。不是很複雜,是嗎? 在頂點著色器中,我們透過Three.js傳入了一些uniforms變數。有兩個4×4的矩陣uniforms變數:模型視圖矩陣和投影矩陣。你並不需要太了解這兩個矩陣是怎麼運作的。簡單地說,這兩個矩陣描述了三維點座標如何投影成為二維螢幕上的座標。
事實上,我只介紹了這兩段簡短的程式碼段。 Three.js在你自己的著色器程式碼前已經將它們加進來了,所以你不必擔心。實話說,Three.js還加了很多東西在你的程式碼前面,像是光照資料、節點顏色和節點法向量等等。如果沒有Three.js你要親自創建並設定這些對象,真的。 6.使用著色器材質
複製程式碼


程式碼如下:

/**
* 假設我們可以使用JQuery
* 將著色器的程式碼文字從DOM中抽取
*/
var vShader = $('vertexshader');
var fShader = $('fragmentshader');
var shaderMaterial =
new THREE.ShaderMaterial.Shader ({
vertexShader: vShader.text(),
fragmentShader: fShader.text()
});

從這兒開始,Three.js將會編譯並執行你的著色器,將其連結在你所創造的材質上,材質又依附在你所創造的mesh上。它並沒有變得比真的更容易。也許是這樣吧,但我們在考慮瀏覽器3D編程,我想你應該預期,這個主題是有一定複雜性的。
我們也可以像著色器材質加上另外兩種屬性:uniforms和attributes。他們可以是向量、整數或浮點數,但是如我之前所說,uniforms變數在計算所有點的過程中保持不變,所以它們更可能是單一的值,而attributes變數是對每個頂點而言的,所以他們應是數組。在一個mesh中,attribute變數和頂點應為一一對應的。
7.小結 這篇教程就到這裡了,實際上我已經講得很多了,但是在許多方面我都只是一掠而過。在下一篇教程中我會提供一個複雜的著色器,透過它我將傳入一些attributes變數和uniforms變數來做一些模擬光照效果。 我將這篇教學的源碼打包了,你可以下載下來作為參考
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles