GLSL中铸造作业的精度有哪些规则

问题描述 投票:0回答:1

我在 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
时,它也会变为零。

  • 选角规则是什么?如果没有临时收益,float(v) 的精度会是多少?
  • 为什么使用
    mediump float v2
    会产生 0?我认为mediump应该足以产生一些东西!= 0.
opengl-es glsl mali
1个回答
0
投票

16 位浮点数的最大值为

65504.0
。在 fp16 中,
x/65535.0
的除数是
x/+INF
,因此结果为零。

// 仅适用于桌面

桌面可能会忽略

mediump
并为您提供 fp32。

© www.soinside.com 2019 - 2024. All rights reserved.