如何在没有(“<<”||“>>”)运算符的情况下有效执行位移?

时间:2010-08-12 10:06:08

标签: performance opengl-es bit-manipulation shader glsl

我正在开发一个OpenGL ES 2.0着色器,我有紧密的数据,例如两个字节块内的三个5位无符号整数。要解压缩这些数据,我显然需要进行位移,但OpenGL ES着色语言不支持此功能(参见第29页http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf

因此,我执行了许多* 2和/ 2操作来模拟位移。

有谁知道更有效/更优雅的方式来做到这一点?有没有我不知道的技巧?

谢谢!

4 个答案:

答案 0 :(得分:5)

如果您正在执行多班制,则可以使用电源操作。比特移位是乘法或除以2 n ,并且功率运算比多次乘法或除法运算更具可读性,我认为,但我不确定性能。我想这是一个更优雅的解决方案,但可能效率不高。

答案 1 :(得分:3)

根据您的操作,这些线程可能有一些用处:

GLSL:在一个浮点数中打包法线 link

将多个浮点数打包为单个浮点值 link

将浮动包装到各种位深度目标 (必须搜索OpenGL.org论坛,因为Stack溢出不允许新用户使用2个以上的链接)

答案 2 :(得分:1)

我从未使用OpenGL,但如果您的环境支持,最有效的方法是每种类型的16位查找表。您需要在启动时填充表一次,但这应该非常快。您可以为每种类型或二维表使用单独的表,例如表[65536] [3]。

答案 3 :(得分:1)

从你的问题我不确定,但你可以使用&(位和),对吧?那么写起来应该很快:

processing(variable & 11111); processing(variable & 1111100000); (...)

当然,这些位掩码应保存为整数常量。