Vala プログラミング

WebGPU プログラミング

おなが@京都先端科学大

WebGPU SPH シミュレーション(3)

最近、W3C が WebGPUとWGSL仕様書の published version を出すようになりました。

(6月7日修正)
WGSL の最近の仕様変更により、4月26日付のプログラム「WebGPU SPH シミュレーション(2)」は実行できなくなりました。
以下のようなエラーとワーニングが出ます。
前回は、compute shader の変更でした。今回は vertex shader と fragment shader
の仕様が整備されています。

vertex shader
Warning:
1 use of deprecated language feature: use an entry point parameter
   instead of a variable in the `in` storage class
     [[location(0)]] var<in> vertexPosition : vec3<f32>;
2 use of deprecated language feature: use an entry point parameter
   instead of a variable in the `in` storage class
     [[location(2)]] var<in> position : vec3<f32>;
3 use of deprecated language feature: use an entry point return value
   instead of a variable in the `out` storage class
     [[builtin(position)]] var<out> Position : vec4<f32>;
Error:
1 unable to determine function return type
     fn main() -> void {
2 expected '}'
     const scale : f32 = 0.005;

fragment shader
Warning:
1 use of deprecated language feature: use an entry point return value
   instead of a variable in the `out` storage class
     [[location(0)]] var<out> outColor : vec4<f32>;
Error:
1 unable to determine function return type
     fn main() -> void {

修正
(前回同様、WGSL のワーニングは、エラーを修正すると表示されなくなります。)

vertex shader
1 Warning1, 2
   [[location(0)]] var<in> vertexPosition : vec3<f32>;
   [[location(2)]] var<in> position : vec3<f32>;
   -> fn main([[location(0)]] vertexPosition: vec3<f32>, [[location(2)]] position: vec3<f32>)
      in変数は、entory point の引数として設定する。
2 Error1(Warning3 と関連)
   [[builtin(position)]] var<out> Position : vec4<f32>;
   fn main() -> void {
   -> fn main() -> [[builtin(position)]] vec4<f32> {

   Position = uniforms.proj_view * scaleMTX * vec4<f32>(vertexPosition, 1.0);
   return;
   -> var Position: vec4<f32> = uniforms.proj_view * scaleMTX *
          vec4<f32>(vertexPosition, 1.0);
      return Position;
3 Error2
   const scale : f32 = 0.005; -> let scale : f32 = 0.005;

fragment shader
1 Error1(Warning1 と関連)
   [[location(0)]] var<out> outColor : vec4<f32>; 
   fn main() ->  void {
   -> fn main() ->  [[location(0)]] vec4<f32> {

   outColor = vec4<f32>(1.0, 0.0, 0.0, 1.0);
   return;
   -> return vec4<f32>(1.0, 0.0, 0.0, 1.0);

プログラム
vertex shader と fragment shader のみ記載

// render shader
const renderShaders = {
    vertex:`
    [[block]] struct Uniforms {
        proj_view : mat4x4<f32>;
    };

    [[binding(0), group(0)]] var<uniform> uniforms : Uniforms;

    [[stage(vertex)]]
    fn main([[location(0)]] vertexPosition: vec3<f32>, [[location(2)]] position: vec3<f32>)
        -> [[builtin(position)]] vec4<f32> {
        let scale : f32 = ${POINT_SIZE};
        var scaleMTX : mat4x4<f32> = mat4x4<f32>(
            vec4<f32>(scale, 0.0,   0.0,   0.0),
            vec4<f32>(0.0,   scale, 0.0,   0.0),
            vec4<f32>(0.0,   0.0,   scale, 0.0),
            vec4<f32>(position, 1.0)
        );

        var Position: vec4<f32> = uniforms.proj_view * scaleMTX * vec4<f32>(vertexPosition, 1.0);
        return Position;
    }`,

    fragment:`
    [[stage(fragment)]]
    fn main() ->  [[location(0)]] vec4<f32> {
        return vec4<f32>(1.0, 0.0, 0.0, 1.0);
    }`
    };