Поскольку 0,984314 * 255,0 - это ровно 251,0, я предполагаю, что внутренний формат цветовой плоскости - GL_RGBA8
. Это означает, что для каждого цветового канала имеется 1 байт, и zc
может иметь только 256 различных значений, от 0,0 до 1,0 с шагом 1/256.
Если это поддерживается версией OpenGL ES, которую вы используете, то вы можете изменить формат хранилища буфера рендеринга (например, GL_R32F
- только канал красного цвета, но 32-битная плавающая точка).
Или вы можете закодировать глубину для 4 каналов цветовой плоскости 4 * 8 бит:
vec4 PackDepth( in float depth )
{
depth *= (256.0*256.0*256.0 - 1.0) / (256.0*256.0*256.0);
vec4 encode = fract( depth * vec4(1.0, 256.0, 256.0*256.0, 256.0*256.0*256.0) );
return vec4( encode.xyz - encode.yzw / 256.0, encode.w ) + 1.0/512.0;
}
....
fragColor = PackDepth(gl_FragCoord.z);
И вы можете расшифровать его после прочтения значения:
GLfloat zc[4]; // from color buffer
m_func->glReadPixels(xy.x(), m_pFbo->height() - xy.y(), 1, 1, GL_RGBA, GL_FLOAT, zc);
float depth = zc[0] + zc[1]/256.0 + zc[2]/(256.0*256.0) + zc[3]/(256.0*256.0*256.0);
depth = depth * (255.0f/256.0f) * (256.0*256.0*256.0) / (256.0*256.0*256.0 - 1.0);