问题标签 [webgpu]
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.
webgpu - 为什么我无法在 Windows chromeV95 的 chrome://flags 中搜索 #enable-unsafe-webgpu
在windows chromeV95中,我输入chrome://flags并搜索#enable-unsafe-webgpu,没有结果?
chrome-canary - 如何让 WebGPU 在 Chrome Canary 97 中运行?
无论哪个 WebGPU 示例(austin-eng、jack1232/WebGPU-Step-By-Step 等)我在 Chrome Canary 97.0.4686.0 中运行并启用了不安全的 WebGPU 标志,我都会在控制台中收到一些错误,表明我的浏览器不支持网络GPU。
示例:https ://austin-eng.com/webgpu-samples/samples/helloTriangle
你能重现这种行为吗?
java - WebGPU JsInterop 包装器
我正在尝试使用 JsInterop 在 GWT 2.9.0 中使用 WebGPU,但在尝试将所有 WebGPU 接口映射到 Java 时遇到了一些问题。我所指的定义位于https://www.w3.org/TR/webgpu/#idl-index
1)我如何映射一个无符号长长的?
有一个 typedef:typedef [EnforceRange] unsigned long long GPUSize64;
例如在这里使用:
如果我把它包起来
我收到一条错误消息:
鉴于我的更高级别的 API 仅在此处公开一个 int 以与其他 API 兼容,我可能只使用一个 int,但映射 GPUSize64 的正确解决方案是什么?
2)我如何包装字典?
当我尝试翻译以下定义时
像这样:
然后按以下方式使用它:
我可以编译得很好,但在运行时出现错误说
令我困惑的是,它两次说“无法从'GPUExtent3DDict'读取'width'属性”,这暗示它需要嵌套的东西,并且可能与typedef中关于“sequence or GPUExtent3DDict”的最后一行有关,我不明白。当我以这种方式定义 GPUExtent3D 时:
然后像这样使用它:
它工作得很好,但我想用 JsInterop 方式而不是 JavaScriptObject 范围。我该怎么做呢?
3)如何映射一个枚举?
我还在这里找到了一个可行的解决方案,我想知道这是推荐的还是不推荐使用的/旧的方法给定一个枚举声明:
我可以像这样映射它吗
或者有没有办法为此使用带有@JsEnum的java枚举(我试过但在值中使用的破折号有问题)
非常感谢,祝您有愉快的一天!
webgpu - “提交时使用的已破坏纹理 [Texture]。” 在 chrome/webgpu 中使用视频纹理时
我正在尝试在 WebGpu 中使用 external_texture,但遇到了错误。
我创建了一个视频元素并创建了一个外部纹理:
我像这样绑定它:
并在我的着色器中引用它,如下所示:
我已将视频元素和 videoTexture 都存储到一个变量中,以防万一它与垃圾收集有关,但它没有帮助。我似乎做的一切都与视频上传示例 ( https://austin-eng.com/webgpu-samples/samples/videoUploading ) 中的一样,除了我的程序中还有很多事情要做。
webgpu - 在 WebGPU 中,您可以在多个帧中重复使用相同的渲染通道吗?
在 WebGPU 中,您可以通过定义其描述符来创建渲染通道:
然后通过命令编码器运行它并开始录制。
因此,从本质上讲,您似乎需要当前纹理才能开始录制(即,不调用context.getCurrentTexture().createView()
您就无法创建描述符,没有它您就无法开始录制)。但是 API 似乎暗示纹理可以改变每一帧(请注意,甚至几个月前也是这种情况,当时 API 不同,您将从交换链中检索纹理)。因此,基本上,您似乎无法跨不同帧重用渲染通道(当然,除非您不渲染到交换链,而是以屏幕外纹理为目标)。
所以,问题是。在 WebGPU 中,您可以在多个帧中重复使用相同的渲染通道吗?
与 Vulkan 的比较
我的问题源于我对 Vulkan 的(很少)接触。VKImage
在 Vulkan 中,您可以重用记录的资源,因为有一种方法可以预先知道交换链中有多少对象;它们将具有从 0 开始的索引,例如0
,1
和2
. 我不记得确切的语法,但我记得基本上你可以记录 3 个单独的命令缓冲区,每个命令缓冲区一个VKImage
并跨帧重复使用它们。您所要做的就是在渲染循环中查询当前的索引VKImage
并检索相应的记录命令缓冲区。
rust - 是否可以动态索引到 WebGPU 存储缓冲区?
我正在尝试编写一个读取存储在存储缓冲区中的八叉树的 WGSL 着色器。问题是,编译器不喜欢我为访问存储缓冲区中的叶子而计算的动态索引。wgpu 产生以下验证错误:
八叉树的结构使得我可以在 GPU 上遍历它。该结构在这篇 NVIDIA 论文中进行了概述:https ://developer.nvidia.com/gpugems/gpugems2/part-v-image-orientation-computing/chapter-37-octree-textures-gpu
从本质上讲,八叉树是一个IndirectionGrid
s 数组,每个在内存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 权衡的背景信息吗?
fragment-shader - 如何使用与 WebGPU 混合从片段着色器过渡到另一个?
为了动画从任意片段着色器到另一个的过渡(不能修改着色器内的 alpha 值),我在考虑:
- 使用第一个片段着色器渲染第一个网格
- 使用不同的片段着色器和以下参数渲染相同的网格
- 对于深度测试,使用比较功能
wgpu::CompareFunction::LessEqual
,这样我就可以在之前渲染的网格上绘制 - 我在逐渐更改的渲染通道上使用自定义混合颜色
set_blend_constant
,并在我的渲染管道中将其与此混合状态一起使用:
- 对于深度测试,使用比较功能
它确实工作得很好,但是我不是 OpenGL 或图形管道方面的专家(而不是初学者),所以也许这不是通常要做的事情。
我的问题是我的第二个着色器(绘制在第一个着色器之上)是否有一些透明颜色。由于我已经使用混合功能来控制整体透明度,我不知道如何将来自第二个着色器的实际透明颜色与整体应用的透明度结合起来。
OpenGL 似乎有一个GL_CONSTANT_ALPHA
混合模式,我认为(但我可能错了?),它将结合着色器透明度和我的整体透明度。但这在 WebGPU 中不存在,实际上根据这个WebGPU GitHub 问题,它似乎也不存在于 D3D 中。
我应该如何继续结合我的整体透明度和着色器透明度?