我在 Android 设备(Google Pixel 6)上的 OpenGL ES 3.0 中有一个 GL_R16UI 纹理。然后,我绘制一个屏幕矩形,并使用以下片段着色器将纹理复制到 RGBA8 输出:
uniform mediump usampler2D texture_sampler;
in highp vec2 texcoords;
out lowp vec4 out_color;
void main() {
mediump uint v = texture(texture_sampler, vec2(0.5, 0.5)).r;
highp float v2 = float(v); // need temporary for android
out_color = vec4(v2 / 65535.0, 0, 0, 1);
// out_color = vec4(float(v) / 65535.0, 0, 0, 1); // works only on desktop
}
v
设置为 120 * 256。
vec4(float(v) / 65535.0, ..
没有显示任何错误,结果只是变为 0。
当我用 highp float v2
替换 mediump float v2
时,它也会变为零。
mediump float v2
会产生 0?我认为mediump应该足以产生一些东西!= 0.16 位浮点数的最大值为
65504.0
。在 fp16 中,x/65535.0
的除数是 x/+INF
,因此结果为零。
// 仅适用于桌面
桌面可能会忽略
mediump
并为您提供 fp32。