Wgpu:正确编写的 WGSL 着色器解析错误
Wgpu: correctly written WGSL shader parsing error
我正在使用 wgpu-rs 并在 WGSL 中编写着色器。为了测试示例着色器,我从这里复制了一些示例代码:https://www.w3.org/TR/WGSL/#var-and-let.
这是我的简单着色器:
// Vertex shader
struct VertexInput {
[[location(0)]] pos: vec3<f32>;
};
struct VertexOutput {
[[builtin(position)]] pos: vec4<f32>;
};
[[stage(vertex)]]
fn main(vertex_input: VertexInput) -> VertexOutput {
var out: VertexOutput;
out.pos = vec4<f32>(vertex_input.pos, 1.0);
var a: i32 = 2;
var i: i32 = 0;
loop {
if (i >= 4) { break; }
let step: i32 = 1;
i = i + step;
if (i % 2 == 0) { continue; }
a = a * 2;
}
return out;
}
// Fragment shader
[[stage(fragment)]]
fn main(in: VertexOutput) -> [[location(0)]] vec4<f32> {
return vec4<f32>(1.0, 1.0, 1.0, 1.0);
}
但是,当我尝试编译它时,出现以下错误:
[2021-08-18T16:13:33Z ERROR wgpu_core::device] Failed to parse WGSL code for Some("Shader: simple shader"): expected '(', found ';'
[2021-08-18T16:13:33Z ERROR wgpu::backend::direct] wgpu error: Validation Error
Caused by:
In Device::create_shader_module
note: label = `Shader: simple shader`
Failed to parse WGSL
错误是由行 i = i + step;
引起的,但是如前所述,这段代码是从 W3 文档中复制的,为什么不能编译?
看起来 wgpu-rs
着色器验证有利于 built-in step()
function over a variable declared with the same name. Going by the W3 WGSL docs, this should resolve to the variable,因为它在更近的范围内。
将 step
变量重命名为其他名称应该可以解决眼前的问题。
已经创建了 an issue 来跟踪这个,但我添加了这个作为另一个例子。
我正在使用 wgpu-rs 并在 WGSL 中编写着色器。为了测试示例着色器,我从这里复制了一些示例代码:https://www.w3.org/TR/WGSL/#var-and-let.
这是我的简单着色器:
// Vertex shader
struct VertexInput {
[[location(0)]] pos: vec3<f32>;
};
struct VertexOutput {
[[builtin(position)]] pos: vec4<f32>;
};
[[stage(vertex)]]
fn main(vertex_input: VertexInput) -> VertexOutput {
var out: VertexOutput;
out.pos = vec4<f32>(vertex_input.pos, 1.0);
var a: i32 = 2;
var i: i32 = 0;
loop {
if (i >= 4) { break; }
let step: i32 = 1;
i = i + step;
if (i % 2 == 0) { continue; }
a = a * 2;
}
return out;
}
// Fragment shader
[[stage(fragment)]]
fn main(in: VertexOutput) -> [[location(0)]] vec4<f32> {
return vec4<f32>(1.0, 1.0, 1.0, 1.0);
}
但是,当我尝试编译它时,出现以下错误:
[2021-08-18T16:13:33Z ERROR wgpu_core::device] Failed to parse WGSL code for Some("Shader: simple shader"): expected '(', found ';'
[2021-08-18T16:13:33Z ERROR wgpu::backend::direct] wgpu error: Validation Error
Caused by:
In Device::create_shader_module
note: label = `Shader: simple shader`
Failed to parse WGSL
错误是由行 i = i + step;
引起的,但是如前所述,这段代码是从 W3 文档中复制的,为什么不能编译?
看起来 wgpu-rs
着色器验证有利于 built-in step()
function over a variable declared with the same name. Going by the W3 WGSL docs, this should resolve to the variable,因为它在更近的范围内。
将 step
变量重命名为其他名称应该可以解决眼前的问题。
已经创建了 an issue 来跟踪这个,但我添加了这个作为另一个例子。