12、Three.js的glsl講解
注意問(wèn)題:glsl詳細(xì)講解文檔:https://juejin.cn/post/7158032481302609950
本人文檔地址:https://note.youdao.com/s/8ijhsVfb
1、GLSL介紹
GLSL是OpenGL Shading Language的縮寫(xiě),是一種用于編寫(xiě)著色器的高級(jí)編程語(yǔ)言,用于在GPU上實(shí)現(xiàn)高性能圖形渲染。
在Three.js中,GLSL著色器被用來(lái)對(duì)3D場(chǎng)景中的幾何體進(jìn)行渲染。它們是通過(guò)在CPU上編寫(xiě)JavaScript代碼來(lái)創(chuàng)建和配置的,但它們的執(zhí)行是在GPU上完成的。Three.js中的GLSL著色器使用了WebGL API來(lái)與GPU交互,并通過(guò)數(shù)據(jù)傳遞、計(jì)算和輸出來(lái)渲染幾何體。
使用GLSL可以實(shí)現(xiàn)各種復(fù)雜的圖形效果,如光照、陰影、反射、抗鋸齒等等。Three.js中的GLSL著色器通常由兩個(gè)部分組成:頂點(diǎn)著色器和片段著色器。頂點(diǎn)著色器用于計(jì)算幾何體的頂點(diǎn)位置和法線,片段著色器用于為每個(gè)像素計(jì)算其顏色和透明度。
通過(guò)編寫(xiě)自定義的GLSL著色器,我們可以實(shí)現(xiàn)更加細(xì)致、個(gè)性化的渲染效果,從而提高3D場(chǎng)景的視覺(jué)質(zhì)量和表現(xiàn)力。
(1)用一個(gè)簡(jiǎn)單案例進(jìn)行講解:創(chuàng)建examples/adminglsl.html文件
瀏覽器查看效果:

(2)對(duì)上述使用glsl的代碼做詳細(xì)講解
當(dāng)我們?cè)赥hree.js中使用GLSL著色器時(shí),我們需要提供兩個(gè)著色器函數(shù):一個(gè)頂點(diǎn)著色器和一個(gè)片段著色器。這些函數(shù)告訴GPU如何對(duì)每個(gè)頂點(diǎn)和像素進(jìn)行處理。
以下是我們?cè)谏厦娲a中使用的頂點(diǎn)著色器代碼:
這個(gè)著色器的主要作用是將立方體的每個(gè)頂點(diǎn)的位置變換到屏幕上的像素坐標(biāo)。每個(gè)頂點(diǎn)的位置由 position 變量表示,它是一個(gè)三維向量。我們使用 modelViewMatrix 和 projectionMatrix 矩陣來(lái)將頂點(diǎn)從三維空間變換到二維屏幕空間。modelViewMatrix 矩陣包含了攝像機(jī)的位置和方向,以及立方體的位置和方向。projectionMatrix 矩陣則包含了透視變換的信息,用于將三維坐標(biāo)轉(zhuǎn)換為二維坐標(biāo)。最后,我們將變換后的頂點(diǎn)位置賦值給 gl_Position 變量,它是一個(gè)四維向量,其中 x 和 y 表示屏幕上的像素坐標(biāo),z 表示深度,w 通常為1。
接下來(lái)是我們使用的片段著色器代碼:
這個(gè)著色器的主要作用是為每個(gè)像素計(jì)算其顏色。我們使用 vUv 變量來(lái)獲取立方體表面上該像素對(duì)應(yīng)的紋理坐標(biāo)。gl_FragColor 變量表示該像素的顏色,我們將其設(shè)置為一個(gè)四維向量,其中前三個(gè)分量為紋理坐標(biāo),第四個(gè)分量為1。由于我們沒(méi)有使用紋理貼圖,因此只顯示了紋理坐標(biāo)的值,也就是顯示了一個(gè)漸變的紅色和綠色方塊。
需要注意的是,頂點(diǎn)著色器和片段著色器都有一個(gè) varying 關(guān)鍵字,用于在兩個(gè)著色器之間傳遞數(shù)據(jù)。在頂點(diǎn)著色器中,我們將紋理坐標(biāo)傳遞給片段著色器。在片段著色器中,我們使用 gl_FragColor 來(lái)輸出像素的顏色。
注意問(wèn)題:上述代碼為什么顯示紅色和綠色漸變
上述代碼中顯示紅色和綠色的漸變是因?yàn)樵谄沃髦?,我們將像素的顏色設(shè)置為一個(gè)四維向量,其中前兩個(gè)分量為紋理坐標(biāo),即 vec4(vUv.x, vUv.y, 0.0, 1.0)。
在WebGL中,紋理坐標(biāo)是指紋理圖像中的位置,范圍通常為0到1。在這個(gè)例子中,我們將 vUv.x 設(shè)置為像素的紅色通道值,vUv.y 設(shè)置為像素的綠色通道值,因此像素的顏色在紅色和綠色之間進(jìn)行漸變。由于藍(lán)色通道和透明通道都設(shè)置為0,因此像素的顏色不包含藍(lán)色和透明度,只有紅色和綠色。因此,最終的效果是一個(gè)紅色和綠色的漸變。