LoginSignup
3
0

WebGL で色々な表現に挑戦する - シェーダーを別のファイルに移す

Last updated at Posted at 2023-12-09

この記事の概要

前回の記事ではウィンドウのサイズにあわせて要素を拡大し、リサイズ時も追従するようにしました。

今回はシェーダーファイルを上手く扱うための方法についてです。
まだ表現力をアップするには至りません……。

現状の確認

現状のコードを抜粋すると、こういった部分があります。

// シェーダープログラムの作成
const vertexShaderSource = `#version 300 es
in vec2 aPosition;
void main() {
  gl_Position = vec4(aPosition, 0.0, 1.0);
}`;

const fragmentShaderSource = `#version 300 es
precision mediump float;
out vec4 outColor;
void main() {
  outColor = vec4(1.0, 0.0, 0.0, 1.0); // 赤色
}`;

const vertexShader = gl.createShader(gl.VERTEX_SHADER) as WebGLShader;
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER) as WebGLShader;
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

vertexShaderSourcefragmentShaderSource については、GLSL を文字列として埋め込んでいるだけです。

今のコードであれば良いですが、後々やりづらくなると思いますし、分割しておく方が何かと楽でしょう。

というわけで、これらを別のファイルに移します。

別のファイルへ移動し import

以下のように新しいフォルダとファイルを作成しました。

.
└── src
    ├── main.ts
    ├── shaders # 新しいフォルダ
    │   ├── plane.frag # フラグメントシェーダー
    │   └── plane.vert # 頂点シェーダー
    ├── style.css
    └── vite-env.d.ts
shaders/plane.frag
#version 300 es

precision mediump float;

out vec4 outColor;

void main() {
  outColor = vec4(1.0, 0.0, 0.0, 1.0); // 赤色
}
shaders/plane.vert
#version 300 es

in vec2 aPosition;

void main() {
  gl_Position = vec4(aPosition, 0.0, 1.0);
}

拡張子は .frag .vert と分けず、どちらも .glsl でも良いです。
ただ、同じにした場合は planeFragmenr.glsl planeVertex.glsl みたいなファイル名にすることが多いようで、冗長さが嫌でこうしました。

main.ts も書き換えます。

main.ts
+ import vertexShaderSource from "./shaders/plane.vert";
+ import fragmentShaderSource from "./shaders/plane.frag";
- const vertexShaderSource = `#version 300 es
- in vec2 aPosition;
- void main() {
-   gl_Position = vec4(aPosition, 0.0, 1.0);
- }`;
-
- const fragmentShaderSource = `#version 300 es
- precision mediump float;
- out vec4 outColor;
- void main() {
-   outColor = vec4(1.0, 0.0, 0.0, 1.0); // 赤色
- }`;

これでおしまいかと思いきや、現段階ではこのようなエラーが出ます。

こちらを解決します。

プラグインの設定

今回は Vite を使っているので、それにあわせたプラグインである vite-plugin-glsl を適用します。

bun i -d vite-plugin-glsl

tsconfig.jsontypes フィールドに追加します。

tsconfig.json
{
  "compilerOptions": {
    "types": [
      "vite-plugin-glsl/ext"
    ]
  }
}

そして、vite.config.js にも手を加えます。

import { defineConfig } from "vite";
import glsl from "vite-plugin-glsl";

export default defineConfig({
  plugins: [glsl()],
});

この状態で起動すれば、ちゃんと表示できます。

VS Code の設定

ここからは VS Code を使っている人だけに該当する話です。

今のままでは GLSL にシンタックスハイライトが当たりません。
拡張機能をインストールします。

いくつか試してみた限りでは以下が良かったです。

gl_Position のような組み込みの変数なら、ドキュメントを読むこともできます。

ただし VS Code の初期設定のままだと Inlay Hints の主張が強いかもしれません。
設定の Editor > Inlay Hints: Enabled から offUnlessPressed にでも変えると良い具合になる気がします。

最後に

あれやこれや設定に関する記事を書きました。
そろそろ具体的な表現について記事を書きます。

次の記事はこちらです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0