2010-12-17 93 views
1

我在写一个简单的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上测试过它。我相信我不了解浮点运算。

+0

很可能我们需要更多的上下文来帮助您。例如,你如何测试你的比较结果?着色器中的条件比普通代码更挑剔。我建议您向我们提供您正在测试的确切代码,以便我们能够为您提供适当的帮助。 – 2010-12-17 23:34:36

+0

你在哪个平台上运行?这可能与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

回答

2

也许它不使用浮动。

试试这个:

float xa = 1.01; //then change to 0.99 
float xb = 1.0; 
float xc = 2.0; 
if (xa * xb > xc) 
    ... 

这是否帮助?如果是这样,也许编译器(或硬件)由于某种原因将它们转换为int。

1

您应该将着色器剥离到最小的情况。

if(1.0*2.0 > 1.1) gl_FragData[0] = vec4(1,0,0,1); 
else gl_FragData[0] = vec4(1,0,1,1); 

if(0.999999*2.0 > 1.1) gl_FragData[0] = vec4(1,0,0,1); 
else gl_FragData[0] = vec4(1,0,1,1); 

多少787-9你需要添加触发错误?它仍然发生在0.9?

一旦你完成了,使用该代码来报告Chrome或Firefox(他们使用相同的GLSL分析器)的错误。解析具有太多有效数字的常量是完全可能的。

相关问题