背景
我试图通过直接在WGSL顶点着色器中对顶点进行编码来呈现一个三角形。
我的想法是有一个全局常量数组,TRI_VERTICES包含三角形的顶点,我将在其中使用内置的vertex_index查找适当的顶点坐标。
let TRI_VERTICES: array<vec4<f32>, 3> = array<vec4<f32>, 3>(
vec4<f32>(0., 0., 0., 1.0),
vec4<f32>(0., 1., 0., 1.0),
vec4<f32>(1., 1., 0., 1.0),
);
@vertex
fn vs_main(
@builtin(vertex_index) in_vertex_index: u32,
) -> @builtin(position) vec4<f32> {
return TRI_VERTICES[in_vertex_index];
}
@fragment
fn fs_main(@builtin(position) in: vec4<f32>) -> @location(0) vec4<f32> {
return vec4<f32>(in.x, in.y, 0.1, 1.0);
}我正在使用wgpu顶点和1实例运行一个绘图调用(在Rust和1中),如下所示:
render_pass.draw(0..3, 0..1);不幸的是,我得到了以下错误:
Shader validation error:
┌─ Shader:13:9
│
13 │ return TRI_VERTICES[in_vertex_index];
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ naga::Expression [3]
Entry point vs_main at Vertex is invalid
Expression [3] is invalid
The expression [1] may only be indexed by a constant问题
如果我只是将let TRI_VERTICES更改为var<private> TRI_VERTICES,那么上述问题似乎很容易解决,但我不确定这是否是“正确”的解决方案。我想知道的是:
var<private>是否意味着数组条目在vs_main中是可变的TRI_VERTICES声明为“常量”?TRI_VERTICES最合适的方法是什么?发布于 2022-08-17 14:15:37
以下内容以Tint格式正确编译。这可能是Naga需要追赶规范更改的情况,您可以在https://github.com/gfx-rs/naga上提交Naga问题。
const TRI_VERTICES = array(
vec4(0., 0., 0., 1.),
vec4(0., 1., 0., 1.),
vec4(1., 1., 0., 1.),
);
@vertex
fn vs_main(
@builtin(vertex_index) in_vertex_index: u32,
) -> @builtin(position) vec4<f32> {
return TRI_VERTICES[in_vertex_index];
}
@fragment
fn fs_main(@builtin(position) in: vec4<f32>) -> @location(0) vec4<f32> {
return vec4(in.x, in.y, .1, 1);
}回答以下问题:
var<private>在顶点着色器中是可变的,但只对当前调用可见。const关键字是新的常量。https://stackoverflow.com/questions/73379152
复制相似问题