首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WGSL顶点着色器中声明和使用*常数*数组?

如何在WGSL顶点着色器中声明和使用*常数*数组?
EN

Stack Overflow用户
提问于 2022-08-16 19:08:53
回答 1查看 299关注 0票数 0

背景

我试图通过直接在WGSL顶点着色器中对顶点进行编码来呈现一个三角形。

我的想法是有一个全局常量数组,TRI_VERTICES包含三角形的顶点,我将在其中使用内置的vertex_index查找适当的顶点坐标。

代码语言:javascript
复制
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中),如下所示:

代码语言:javascript
复制
render_pass.draw(0..3, 0..1);

不幸的是,我得到了以下错误:

代码语言:javascript
复制
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最合适的方法是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-17 14:15:37

以下内容以Tint格式正确编译。这可能是Naga需要追赶规范更改的情况,您可以在https://github.com/gfx-rs/naga上提交Naga问题。

代码语言:javascript
复制
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);
}

回答以下问题:

  1. var<private>在顶点着色器中是可变的,但只对当前调用可见。
  2. 新的const关键字是新的常量。
  3. 该规范允许删除大多数类型注释,因此如上声明就足够了。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73379152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档