compute-shader - 将图像数组传递给计算着色器
问题描述
我目前正在使用 WebGL 2.0 中的计算着色器草稿开发一个项目。[草案]。尽管如此,我不认为我的问题是特定于 WebGL 的,而更像是一个 OpenGL 问题。目标是构建一个用于计算着色器的图像金字塔。每个级别应该是 2^(n-level) 值的平方(低至 1x1)并包含简单的整数/浮点值...
我已经有了这个金字塔所需的值,存储在不同的 OpenGL 图像中,它们都具有相应的大小。我的问题是:你如何将我的图像数组传递给计算着色器。我在限制传递给 14 或 16 的图像数量方面没有问题......但它至少需要 12。如果有一种机制可以将图像存储在纹理中并且使用textureLod
它可以解决问题,但我无法理解如何使用图像来做到这一点。
谢谢你的帮助,我很确定应该有一个明显的方法来做到这一点,但总的来说我对 OpenGL 比较陌生。
解决方案
传入“图像金字塔”在 WebGL 中是很正常的事情。它们被称为mipmap。
gl.texImage2D(gl.TEXUTRE_2D, 0, gl.R32F, 128, 128, 0, gl.RED, gl.FLOAT, some128x128FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 1, gl.R32F, 64, 64, 0, gl.RED, gl.FLOAT, some64x64FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 2, gl.R32F, 32, 32, 0, gl.RED, gl.FLOAT, some32x32FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 3, gl.R32F, 16, 16, 0, gl.RED, gl.FLOAT, some16x16FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 4, gl.R32F, 8, 8, 0, gl.RED, gl.FLOAT, some8x8FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 5, gl.R32F, 4, 4, 0, gl.RED, gl.FLOAT, some4x4FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 6, gl.R32F, 2, 2, 0, gl.RED, gl.FLOAT, some2x2FloatData);
gl.texImage2D(gl.TEXUTRE_2D, 7, gl.R32F, 1, 1, 0, gl.RED, gl.FLOAT, some1x1FloatData);
第2列的数字是mip级别,后面是内部格式,后面是mip级别的宽度和高度。
texelFetch(someSampler, integerTexelCoord, mipLevel)
您可以使用如下方式从着色器访问任何单个纹素
uniform sampler2D someSampler;
...
ivec2 texelCoord = ivec2(17, 12);
int mipLevel = 2;
float r = texelFetch(someSampler, texelCoord, mipLevel).r;
但你说你需要 12、14 或 16 个级别。16 级是 2(16-1) 或 32768x32768。那是 1.3 gig 的内存,所以你需要一个有足够空间的 GPU,你必须祈祷浏览器允许你使用 1.3 gig 的内存。
您可以通过使用 分配纹理texStorage2D
然后使用 上传数据来节省一些内存texSubImage2D
。
你提到使用图像。如果你的意思是<img>
标签或者Image
你不能从中获取浮点或整数数据。它们通常是每通道 8 位的值。
或者当然,而不是使用 mip 级别,您还可以将数据排列到纹理图集中
推荐阅读
- node.js - Node.JS fast-csv 在读取文件时抛出错误
- javascript - 天蓝色部署后,Node Bot FrameWork bot 收到 http 500 错误
- csv - 将mathematica csv导出中的数字转换为numpy复数数组
- java - Google Business Api - Pub Sub 更新通知设置
- linux - 为什么 gdb 回溯系统调用地址与系统调用表地址不同
- google-maps - Google Geocode 格式地址包含十六进制字符
- android - 使用 repeatWhen RxJava2 重复 Retrofit2 请求
- c++ - 在 Windows 10 语言列表中添加语言条目
- asp.net-mvc-5 - 单击电子邮件验证链接时,方法输入中的activationCode为空
- ios - iTunesconnect 移除 tvOS 版本