GLSL程序调试

时间:2013-11-17 03:17:03

标签: opengl glsl

#ifdef GL_ES                                
precision lowp float;                        
#endif                                        

varying vec4 v_fragmentColor;                        
varying vec2 v_texCoord;                            
varying vec2 v_texCoordBlendMap;                    
varying vec3 v_normal;                              

varying vec4 v_FogColor;                    
varying float v_distance;                     
uniform sampler2D u_texture;                      
uniform sampler2D u_tex1;                    
uniform sampler2D u_tex2;                     
uniform sampler2D u_tex3;                     
void main()                                    
{                                                
 vec4 colour1    = texture2D(u_texture,          v_texCoord); 
vec4 colour2    = texture2D(u_tex1,      v_texCoord);  
float blendVal = texture2D(u_tex2,       v_texCoordBlendMap).r; 
float fValue = 1.0 - blendVal; 
vec4 texColor  = colour1*fValue +   colour2*blendVal; 
texColor.a = 1;                 
v_fragmentColor.a = 1;          
vec4 finalclr = texColor * v_fragmentColor; 
    if(finalclr.a == 1)         //why not it equal 1        
        {                                       
        gl_FragColor=vec4(1,0,0,1);         
     }                                      
     else                                   
     {                                      
        gl_FragColor=vec4(1,1,1,1);         
    }                                       
}                                           

嗨,大家好,很抱歉在手机上问这个。我在本周调试搅拌机脚本时感到困惑。上面的ps脚本它用于模拟两个RGBA。但是为了测试和简化,我有意地将两个Alpha通道写成1.0并期望输出的红色。但是frag颜色输出是白色而不是红色。怎么会这样?

1 个答案:

答案 0 :(得分:1)

尝试使用以下方法缩小范围:

finalclr.a = texColor.a * v_fragmentColor.a;

很可能就是这样:

  • 向量乘法运算符可能不是您所期望的
  • 向量乘法引入了浮点不准确性。
  • 浮点乘法引入浮点不准确。
  • v_fragmentColor不可写。
  • 片段着色器获得默认的中等精度AFAIK,您可能必须提供precision highp精度说明符

如果归结为精确问题,你无法解决,请使用以下内容比较浮动ab的差异:

if (abs(a - b) < EPSILON) // absolute value of difference
{
    // consider them equal...
}

其中EPSILON是一个小值。