【发布时间】:2016-04-08 22:23:39
【问题描述】:
我在 IOS 上玩了一些技巧来尝试构建一个 CPU-GPU-hybrid JPEG 编码器。从我对 CPU 的测试来看,我相信使用 GPU 来执行 DCT 和量化步骤很有意义,并且应该会显着提高性能(压缩大量 JPEG 是我应用程序的瓶颈)。有了变换反馈,这应该是可行的,因为我已经用它在 GPGPU 计算中获得了很好的结果。棘手的部分是如何有效地获取数据(RGBA 的无符号整数)。
如前所述,我曾经使用 openGL ES 3.0 进行 GPGPU 计算,所以我只有浮点纹理的经验,这是由
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,WIDTH,HEIGHT,0,GL_RGBA,GL_GLOAT,data);
并通过
传递给着色器texelFetch()
但是现在我的输入数据存储为一个无符号字节(或 uint8)数组,我需要每次依次获取其中的 64 个。我想我可以将它们作为无符号字节的纹理获取,或者更有效地作为无符号整数的纹理获取,然后通过位移将它们分开。
我的问题是,我该怎么做呢?更具体地说,我应该如何为 glTexImage2D() 设置 internalFormat、format 和 type?我尝试了很多组合,但它们都只在着色器中提供了 0(我仔细检查了数据源,它们不是零)。
【问题讨论】:
-
对于普通的 RGBA,每个像素已经有 4 个字节。 glTexImage2D() 可用于逐字节获取,因为每个 vec4 组件都代表该字节中的一个。这些值已标准化,因此您需要将它们乘以 255 以获得表示一个字节的整数值。因此,通过对 glTexImage2D() 进行 16 (64/4) 次调用,您可以获得 64 个字节。还是我在这里遗漏了什么?
-
抱歉,不是 glTexImage2D()。我的意思是着色器中的纹素提取。
-
是的,那是我的 B 计划。我遇到的问题是我不知道如何获取存储为无符号字节的纹理(或者如何为此配置 glTexImage2D)。如果可能的话,我很想跳到计划 A,在其中我获取一个整数(四个字节)而不是一个字节作为“像素”,这会将获取的次数减少到 64/4/4=4。
-
我不确定您是否能够将纹理配置为每像素存储超过 32 位(实际上更少),因此实际上可能无法实现 A 计划。但是,如果您确实找到了一些可靠的东西,我会很高兴听到它……也许是一些普遍支持的扩展或其他东西。 B-Plan:GL_RGBA 用于配置每个像素存储 4 个无符号字节。如上所述,您应该通过将它们乘以 255 来缩放这些值。