问题标签 [wgpu-rs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
147 浏览

rust - 是否可以动态索引到 WebGPU 存储缓冲区?

我正在尝试编写一个读取存储在存储缓冲区中的八叉树的 WGSL 着色器。问题是,编译器不喜欢我为访问存储缓冲区中的叶子而计算的动态索引。wgpu 产生以下验证错误:

八叉树的结构使得我可以在 GPU 上遍历它。该结构在这篇 NVIDIA 论文中进行了概述:https ://developer.nvidia.com/gpugems/gpugems2/part-v-image-orientation-computing/chapter-37-octree-textures-gpu

从本质上讲,八叉树是一个IndirectionGrids 数组,每个在内存IndirectionGrid中正好有 8个 s。GridCell网格单元可以表示指向另一个的指针IndirectionGrid或一些数据。

让我们说八叉树的最深处代表一个 16x16x16 的网格。我想GridCell在 7,7,7 得到。我们知道 7,7,7 在根的单元格 0 中,IndirectionGrid因为坐标的每个分量都小于中点。如果我们将坐标分量相加,我们可以得到当前 的GridCell索引IndirectionGrid。因为我正在遍历一棵树,所以我在每个级别都这样做。下面是演示这一点的不完整代码。

导致问题的行是let cell = grid.cells[grid_index].data;

所以最终我的问题是,动态索引是否允许?有什么我可以改变的东西可以神奇地让它发挥作用吗?或者我需要了解更多关于 WebGPU 权衡的背景信息吗?

0 投票
0 回答
31 浏览

fragment-shader - 如何使用与 WebGPU 混合从片段着色器过渡到另一个?

为了动画从任意片段着色器到另一个的过渡(不能修改着色器内的 alpha 值),我在考虑:

  1. 使用第一个片段着色器渲染第一个网格
  2. 使用不同的片段着色器和以下参数渲染相同的网格
    • 对于深度测试,使用比较功能wgpu::CompareFunction::LessEqual,这样我就可以在之前渲染的网格上绘制
    • 我在逐渐更改的渲染通道上使用自定义混合颜色set_blend_constant,并在我的渲染管道中将其与此混合状态一起使用:

它确实工作得很好,但是我不是 OpenGL 或图形管道方面的专家(而不是初学者),所以也许这不是通常要做的事情。

我的问题是我的第二个着色器(绘制在第一个着色器之上)是否有一些透明颜色。由于我已经使用混合功能来控制整体透明度,我不知道如何将来自第二个着色器的实际透明颜色与整体应用的透明度结合起来。

OpenGL 似乎有一个GL_CONSTANT_ALPHA混合模式,我认为(但我可能错了?),它将结合着色器透明度和我的整体透明度。但这在 WebGPU 中不存在,实际上根据这个WebGPU GitHub 问题,它似乎也不存在于 D3D 中。

我应该如何继续结合我的整体透明度和着色器透明度?