我现在正在使用opengl-es,我使用gl着色语言。我希望渲染到纹理,但我发现精度不足。例如,当我向纹理写入浮点值0.5时,我发现存储在纹理中的实际值约为0.498。我该怎么做才能达到更高的精度?
答案 0 :(得分:1)
渲染到每个组件使用8位以上的纹理。如果您没有appropriate OpenGL ES extensions for that,那么通常您无能为力。
答案 1 :(得分:1)
即使是下一个更高的精度也可能不够,因为渲染管道的最后阶段将像素值缩放到0..1的范围,包括端点。因此,1将表示为255,这表示因子为1/255而不是1/256。
这同样适用于所有精度:0.5无法准确表示。
答案 2 :(得分:1)
您可能应该考虑通过打包 - 解压缩值来存储您的值(如果每个像素/纹素只有一个值):
vec4 packFloat(const float value) {
const vec4 bitSh = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);
const vec4 bitMsk = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
vec4 res = fract(value * bitSh);
res -= res.xxyz * bitMsk;
return res;
}
float unpackFloat(const vec4 value) {
const vec4 bitSh = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);
return (dot(value, bitSh));
}
这可能适用于存储深度图之类的值 对于每个像素/纹素,这将是一个32位范围
答案 3 :(得分:0)
尝试在变量前添加highp precision限定符。