three.js引入glsl文件并高亮顯示代碼的完整步驟
同一個(gè)js文件中引入glsl
在three.js中自己寫shader語(yǔ)言的時(shí)候,我們需要把glsl與JavaScript兩種語(yǔ)言結(jié)合起來(lái),即在ShaderMaterial中傳入對(duì)象,從而引入shader。實(shí)際上,對(duì)象中的vertexShader和fragmentShader兩屬性的值是String,所以最簡(jiǎn)單的辦法就是將整個(gè)shader代碼作為字符串:
//vertexShader字符串
const vertexShader = `
void main() {
gl_Position = vec4(position, 1.0);
}
`;
//fragmentShdaer字符串
const fragmentShader = `
void main() {
gl_Fragment = vec4(1.,0.,0.,1.);
}
`;
//作為值傳入對(duì)象的vertexShader,fragmentShader屬性
const material = new THREE.ShaderMaterial({
vertexShader, //鍵值對(duì)同名,可省略值
fragmentShder,
})glsl文件與js文件分開
這樣在three.js中引入shader語(yǔ)言當(dāng)然可以運(yùn)行,但問題在于這樣shader語(yǔ)言和JavaScript原因在同一個(gè)文件夾中,不好管理,我們需要將js文件和glsl文件單獨(dú)成兩個(gè)文件,最好形成如下的文件結(jié)構(gòu):
(1)shader文件夾
vertexShader.glsl
fragmentShader.glsl
(2)app.js
(3)index.html
但問題在于js并不能importglsl文件,所以我能只好將.glsl改成.js,將shader語(yǔ)言作為js的字符串進(jìn)行import,上述的文件結(jié)構(gòu)就變成了:
(1)shader文件夾
vertexShader.js
fragmentShader.js
(2)app.js
(3)index.html
//vertexShader.js
const vertexShader = `
void main() {
gl_Position = vec4(position, 1.0);
}
`;
export default vertexShader;
//app.js
import vertexShader from './shader/vertexShader.js';
import fragmentShader from './shader/fragmentShader.js';確實(shí)這樣就將js文件和glsl文件分開了,但是這樣shader語(yǔ)言以字符串導(dǎo)入到j(luò)s中,其本身沒有問題,因?yàn)樵趈s中,shader就是以一段字符串傳的形式給GPU。但一個(gè)問題在于,我們?cè)诰庉嬈髦锌吹降膕hader語(yǔ)言沒有高亮,因?yàn)樗鼈冎皇且欢巫址恳粯宇伾?,這是非常不方便的。

高亮顯示glsl代碼
這里需要下載插件Comment target templates.

使用步驟非常簡(jiǎn)單,只需加上/*glsl*/,告訴插件字符串里的東西是glsl語(yǔ)言:
//vertexShader.js
const vertexShader = /*glsl*/`
void main() {
gl_Position = vec4(position, 1.0);
}
`;
export default vertexShader;最終在vscode中的顯示效果:

當(dāng)然在three.js中引入shader語(yǔ)言的方式有很多,也可以放到html中,放在<script>標(biāo)簽里面。插件Comment target templates讓shader語(yǔ)言作為字符的時(shí)候能夠高亮,這真的很方便。通過(guò)一些打包工具,也可以直接將.glsl文件直接引入js中去,但可能配置比較麻煩,目前這種方式已經(jīng)能很好滿足我得需求了。
總結(jié)
到此這篇關(guān)于three.js引入glsl文件并高亮顯示代碼的文章就介紹到這了,更多相關(guān)three.js引入glsl并高亮代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
前端HTML實(shí)現(xiàn)個(gè)人簡(jiǎn)歷信息填寫頁(yè)面效果實(shí)例
本文介紹了如何使用HTML、CSS和JavaScript構(gòu)建一個(gè)個(gè)人簡(jiǎn)歷信息填寫頁(yè)面,涵蓋了簡(jiǎn)歷頁(yè)面的HTML結(jié)構(gòu)設(shè)計(jì)、CSS樣式美化以及JavaScript實(shí)現(xiàn)動(dòng)態(tài)功能和驗(yàn)證的全過(guò)程,需要的朋友可以參考下2024-11-11
javascript宿主對(duì)象之window.navigator詳解
這篇文章主要為大家詳細(xì)介紹了javascript宿主對(duì)象之window.navigator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
JavaScript如何使用Promise實(shí)現(xiàn)分批處理接口請(qǐng)求
當(dāng)我們?cè)陂_發(fā)時(shí)遇到需要同時(shí)發(fā)起百條接口請(qǐng)求怎么辦呢,本文主要來(lái)和大家介紹一下JavaScript如何使用Promise實(shí)現(xiàn)分批處理接口請(qǐng)求,需要的可以參考下2024-03-03
分享XmlHttpRequest調(diào)用Webservice的一點(diǎn)心得
因?yàn)轫?xiàng)目需要,以后前端、手機(jī)客戶端調(diào)用ASP.NET的Webservice來(lái)獲取信息.所以這段時(shí)間開始看Webservice,試著通過(guò)XmlHttpRequest調(diào)用Webservice,過(guò)程中碰到不少問題,也有不少的收獲2012-07-07
JavaScript如何在不重新加載頁(yè)面的情況下修改URL
在現(xiàn)代Web應(yīng)用中,單頁(yè)面應(yīng)用(SPA)越來(lái)越流行,為了提升用戶體驗(yàn),我們經(jīng)常需要在不重新加載頁(yè)面的情況下修改URL,本文將詳細(xì)介紹如何在不重新加載頁(yè)面的情況下修改URL,并通過(guò)多個(gè)示例展示其應(yīng)用場(chǎng)景,需要的朋友可以參考下2024-11-11
使用JavaScript獲取URL參數(shù)的方法總結(jié)
在?JavaScript?中,獲取?URL?參數(shù)是非常常見的操作,這篇文章為大家整理了四個(gè)JavaScript常見的獲取URL參數(shù)方法,希望對(duì)大家有所幫助2024-12-12
js 按照指定間隔 向字符串中插入隨機(jī)字符串的實(shí)現(xiàn)代碼
看到論壇有人問,覺得有意思,就試著寫了一下。2010-03-03
普通web整合quartz跑定時(shí)任務(wù)的示例
這篇文章主要介紹了普通web整合quartz跑定時(shí)任務(wù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03

