Android 16位浮点纹理

Android 16位浮点纹理,android,c++,opengl-es,Android,C++,Opengl Es,我正在使用OpenGL ES 3.0在GPU上创建流体动力学效果。 使用16位浮点FBO I可以使效果正常工作 我的问题是我的目标是不支持浮点纹理的GPU。这种效果因缺乏精确性而崩溃 这种效果只是二维的,所以我只从FBO的前两个通道读写。所以,我想知道是否有人成功地使用了两个无符号int纹理通道来增加额外的精度,以及这是如何可能的 我当前的解决方案如下(GLSL片段着色器代码片段),但根本无法正常工作: #define read(vec) ((((vec).xy * 255.0) - 127.0

我正在使用OpenGL ES 3.0在GPU上创建流体动力学效果。 使用16位浮点FBO I可以使效果正常工作

我的问题是我的目标是不支持浮点纹理的GPU。这种效果因缺乏精确性而崩溃

这种效果只是二维的,所以我只从FBO的前两个通道读写。所以,我想知道是否有人成功地使用了两个无符号int纹理通道来增加额外的精度,以及这是如何可能的

我当前的解决方案如下(GLSL片段着色器代码片段),但根本无法正常工作:

#define read(vec) ((((vec).xy * 255.0) - 127.0) / 127.0) + (vec).zw / 255.0

vec4 write(vec2 vec)
{
    vec2 temp = ((vec * 127.0) + 127.0);
    vec2 a = floor(temp) / 255.0;
    vec2 b = mod(temp, 255.0);
    return vec4(a,b);
}
我认为主要的问题可能是,像这样的任何方案都不可能写零


我希望有人已经解决了这个问题,或者可以看到这样一个问题的解决方案:)

我假设您要存储的值在0.0和1.0之间,但是您希望使用两个有效字节的数据来获得更高的精度,对吗

float read(vec2 rawData) 
{
    return rawData.x + rawData.y / 256.0;
}

vec2 write(float value)
{
    return vec2(value, floor(value * 256.0));
}
将输入/输出浮动的限制设置为与[0,1]不同的任何值只需要将输出值映射到范围[0,1]并调用write,或者将输入值从[0,1]映射到[min,max],这很简单:

// maps val from [fromMin,fromMax] to [toMin,toMax]
float lerp(float val, float fromMin, float fromMax, float toMin, float toMax)
{
    return toMin + (toMax - toMin) * (val - fromMin) / (fromMax - fromMin);
}

const vec2 minMax = vec2(-5.0, 10.0);

float readMapped(vec2 rawData)
{
    return lerp(read(rawData), 0.0, 1.0, minMax.x, minMax.y);
}

vec2 writeMapped(float value)
{
    return write(lerp(value, minMax.x, minMax.y, 0.0, 1.0));
}
对于双通道输入/输出,只需调用这些函数两次