是否有一种很好的方法可以在片段着色器中获取纹理的原始无符号char值

时间:2014-09-19 19:49:59

标签: ios iphone opengl-es opengl-es-2.0

我想要一种方法来确保在初始化纹理时获得与每个通道传递的完全相同的uchar值,我猜我可以通过将浮点值乘以255得到,但是有更好的没有OpenGL ES 3.0的方法吗?

目的: 我正在尝试将此用于基于通道值的非实时纹理查找,这将需要超过8位的精度才能获得,因此我将组合两个通道并使用伪二进制运算来执行此操作。我意识到这将是非常缓慢的,但这不是一个实时操作。

示例代码: 目前,只有纹理中的浮点可以用于我的知识。

float channel_value = texture2D(normalMap, textureCoord).a;

我希望能够做一些相当于

的事情
int channel_value = texture2D(normalMap, textureCoord).a;
然后我可以做一个效率很低的二进制操作,比如

mod(channel_val / pow(2, x), 2)

检查位值。

1 个答案:

答案 0 :(得分:1)

我认为ES 2.0中没有更优雅的方式。纹理格式的选择非常有限,不包括您可以在ES 3.0中使用的整数纹理格式。

要在着色器中获取原始整数值,您需要注意舍入。理论上,乘以255.0将得到原始值,但在处理浮点时总是存在精度限制。由于从floatint的演员阵容向下舍入,我会加0.5,以确保你的回合最接近int

vec4 floatVal = texture2D(...);
ivec4 intVal = ivec4(floatVal * 255.0 + 0.5);

如果您想要恢复原始值,则还需要确保使用GL_NEAREST作为过滤参数。否则,将对插值进行插值,并将它们转换为int,不一定会为您提供纹理数据中最初的值。

相关问题