我在写一个简单的WebGL程序。我被困在着色器程序一个奇怪的行为:在WebGL片段着色器中奇怪的浮点运算
条件(1.01 * 2.0 > 1.0)
计算结果为真实的,但 条件(0.99 * 2.0 > 1.0)
计算结果为FLASE
每当我被什么东西乘以数量较少比1.0
否则我得到了一些较小的比1.0
为什么这样呢?
[编辑]
我使用片段着色器使用窗高和窗HIGHT(线性斜坡)和显示在屏幕上,以16位无符号的整数数据更改为8位位图。 既然在WebGL(AFAIK)中没有直接存储16bit数据的内部格式,我决定创建Uint8Array(width*height*3)
,在R通道中存储第一个字节,在B通道中存储第二个字节,并将其存储在gl.RGB
,gl.UNSIGNED_BYTE
纹理中(可能LUMINESCANCE_ALPHA
将会是更好)。
在着色器中我重建字形式字节并进行调平。 着色器程序:
#ifdef GL_ES
precision highp float;
#endif
uniform highp sampler2D s_texture;
uniform highp float u_ww;
uniform highp float u_wc;
varying highp vec2 v_texcoord;
void main(void)
{
highp vec3 color = texture2D(s_texture, v_texcoord).rgb;
highp float S = 255.;
highp float d = 65280.;
highp float m = 0.9;
highp float c = color.g*d + color.r*S;
float dp = 0.;
float min = u_wc - u_ww/2.;
float max = u_wc + u_ww/2.;
if(1.0*2.0 > 1.1) gl_FragData[0] = vec4(1,0,0,1);
else{
if(c<min) c=0.;
else if(c>max) c=255.;
else c=(255.*(max-c))/u_ww;
c = c/S;
gl_FragData[0] = vec4(c,c,c,1);
}
}
正如你所看到的,是一个愚蠢的线if(1.0*2.0 > 1.1) gl_FragData[0] = vec4(1,0,0,1);
它的地方,我测试浮点运算。在这个例子中,整个图像是红色的,但是当条件是0.999999999*2.0 > 1.1
时,答案是错误的。当我在重新采样的16位图像中出现奇怪的文物时,我开始怀疑有些东西。
我在Chrome 8和Firefox 4上测试过它。我相信我不了解浮点运算。
很可能我们需要更多的上下文来帮助您。例如,你如何测试你的比较结果?着色器中的条件比普通代码更挑剔。我建议您向我们提供您正在测试的确切代码,以便我们能够为您提供适当的帮助。 – 2010-12-17 23:34:36
你在哪个平台上运行?这可能与GL/GL ES着色器编译器中的错误有关。如果您有更简单的着色器,问题是否会持续存在,例如'if(1.0 * 2.0> 1。1)gl_FragData [0] = vec4(1.0.0.1); else gl_FragData [0] = vec4(0,1,0,1);' ? – rotoglup 2010-12-21 19:41:45