型定義ファイルを用意
raw-loader
を使用
three.jsで ShaderMaterial や RawShaderMaterial を使うと、自作したGLSLを利用することが出来る。 公式ドキュメントで紹介されている方法や、「three.js glsl」とかで検索して出てくる大抵の記事にはhtmlやjsに直書きしている例が見られる。 しかし、これではシンタックスハイライトは効かないし見栄えも良くない。
型定義ファイル (.d.ts
) を .(frag|vert)
ファイルと同じ場所に用意。
:
├── src
│ ├── glsl
│ │ ├── glsl.d.ts
│ │ ├── hoge.frag
│ │ └── hoge.vert
│ └── index.ts
:
ファイル名は適当で良いが、自分は glsl.d.ts
とした。 内容は以下の通り。
declare module '*.vert' {
const src: string;
export default src;
}
declare module '*.frag' {
const src: string;
export default src;
}
.(vert|frag)
ファイルを外部モジュールとして declare
キーワードでアンビエント宣言している。
.ts
ファイルにimportする際のコードは以下のようになる。
import hoge_frag from "./glsl/hoge.frag";
import hoge_vert from "./glsl/hoge.vert";
.(ts|js)
ではないファイルをimportしたいので、 loaderが必要。
npmjs.comで "shader loader webpack" と検索してみると、パッケージが10個ほど(2019/11/15現在)出てくる。
が、単に .vert
と .frag
をimportしたいだけであれば、これらを使う必要はない。 テキストをそのまま string
として読み込みたいので、 webpack-contrib/raw-loader を用いる。
yarn add --dev raw-loader
webpack.config.js
には以下のように記述する。
// (略)
module: {
rules: [
{
test: /.(ts|tsx|js)$/,
use: 'ts-loader',
include: [path.resolve(__dirname, 'src')],
exclude: /node_modules/
},
{
test: /.(vert|frag)$/,
use: 'raw-loader',
include: [path.resolve(__dirname, 'src')],
exclude: /node_modules/
}
]
},
// (略)
完成。 よいシェーダーライフを。