最近、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); }` };