移植使用位操作到GLES的桌面GLSL着色器

gla*_*ert 1 opengl bit-manipulation glsl opengl-es-2.0 glsles

我正在将桌面OpenGL应用程序移植到GLES-2(特别是iOS).在桌面版本中,一些GLSL着色器依赖于GLES缺少的整数位操作.

此函数最初用于片段着色器:

int reverseByte(int a)
{
    int b = 0;
    for (int i = 0; i < 8; i++)
    {
        b <<= 1;
        b |= ((a & (1 << i)) >> i);
    }
    return b;
}

// ---- usage example: ----

// get inputs from somewhere, just some test values here...
int r = 255;
int g = 128;
int b = 20;

r = reverseByte(r);
g = reverseByte(g);
b = reverseByte(b);

/* produces:
r = 255
g = 1
b = 40
*/

// color would then be normalized to [0,1] range and further used...
Run Code Online (Sandbox Code Playgroud)

它反转了一个字节中的位顺序.这与RGB颜色一起使用,在[0,255]范围内.GLES缺少整数位操作,因此上述函数无法编译.我做了一些研究试图找到它的替代品,并在这里找到了几种其他可能的反转位的方法,但都依赖于整数位操作.

我的问题是:有没有办法只使用浮点运算和/或GLSL-ES中可用的东西来获得相似或等效的结果?

附注:

  1. 我不能预先计算CPU中的值并将数据作为纹理或其他任何方式传递,因为数据是由着色器程序生成的.

  2. 您可能会想到我建议将数据打包到纹理中,将其上传到CPU,处理它然后用结果更新纹理.嗯,这实际上是我目前的解决方案,但由于大量数据传输,性能非常差.我非常希望能够直接在着色器中完成.

rat*_*eak 5

它有点参与,但这应该做的伎俩:

int b=0;
for (int i = 0; i < 8; i++)
{
    b *= 2;
    b += mod(a, 2);
    a /= 2;
}
Run Code Online (Sandbox Code Playgroud)