jinleili / learn-wgpu-zh

Learn wgpu 中文版
https://jinleili.github.io/learn-wgpu-zh/
MIT License
353 stars 21 forks source link

提问:如何把YUV420渲染到RGBA的surface上? #22

Closed mycrl closed 1 month ago

mycrl commented 1 month ago

我查找了很多资料,都没有找到相关的示例,并且我也去wgpu的discussions里面问了一下,也没有得到解答,我找到的最接近的示例就是一个在web上使用webgpu的示例

https://github.com/tidoust/media-tests/blob/main/ToRGBXVideoFrameConverter.js

这个示例是将任何纹理转成RGBA,这个例子其实很好,但是我发现移植到wgpu会存在一些问题,比如device.importExternalTexture,wgpu还没有支持这个草案,虽然wgpu支持yuv或者nv12的format,但是能支持这个颜色空间的设备很少,至少目前我手上的不支持,所以我只能创建一个rgba的surface和texture

我猜测大概是需要将YUV拆分成3个R8通道,然后将3个通道在shader里面转换,但是我目前完全只有一个模糊的概念,对于实际如何操作完全不清楚,这个问题已经困扰我很久了

虽然在这个repo里面提这个问题有点ot,但是我目前找不到其他可以寻求帮助的途径了

感谢!

jinleili commented 1 month ago

wgpu 虽然至少可以在 metal 及 vulkan 后端支持 srgb 格式的 external texture, 但目前确实还不支持 textureSampleBaseClampToEdge.

我猜测大概是需要将YUV拆分成3个R8通道,然后将3个通道在shader里面转换

你的想法是对的,拆分成 3 个单通道的 r8/16/r32 纹理在 shader 中转换是可行的。可以借助 chatgpt 等 AI 工具写出 glsl 的代码,然后再手动转换成 wgsl 语法