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中可用的东西来获得相似或等效的结果?
附注:
我不能预先计算CPU中的值并将数据作为纹理或其他任何方式传递,因为数据是由着色器程序生成的.
您可能会想到我建议将数据打包到纹理中,将其上传到CPU,处理它然后用结果更新纹理.嗯,这实际上是我目前的解决方案,但由于大量数据传输,性能非常差.我非常希望能够直接在着色器中完成.
它有点参与,但这应该做的伎俩:
int b=0;
for (int i = 0; i < 8; i++)
{
b *= 2;
b += mod(a, 2);
a /= 2;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |