OpenGLSL奇怪的效果 - 不确定原因

时间:2012-01-17 21:56:17

标签: opengl-es fragment-shader

我有一个边缘检测着色器,它在渲染猴子和我的HTC Desire HD上都能很好地工作。但是,它不适用于我的LG 3D P920。这是着色器:

简而言之,我正在拍摄中心像素并减去它周围的8个值。纹理为512x512。

precision highp float;

varying vec2 vTextureCoord;

uniform sampler2D sTexture;

vec4 edges(void)
{
     const float offset = 1.0 / 512.0;
     vec4 c = texture2D(sTexture, vTextureCoord);
     vec4 edge = texture2D(sTexture, vTextureCoord + vec2(-offset, -offset)) +
     texture2D(sTexture, vTextureCoord + vec2(-offset, 0.0)) +
     texture2D(sTexture, vTextureCoord + vec2(-offset, offset)) +
     texture2D(sTexture, vTextureCoord + vec2( 0.0, offset)) +
     texture2D(sTexture, vTextureCoord + vec2( offset, offset)) +
     texture2D(sTexture, vTextureCoord + vec2( offset, 0.0)) +
     texture2D(sTexture, vTextureCoord + vec2( offset, -offset)) +
     texture2D(sTexture, vTextureCoord + vec2( 0.0, -offset));

     return 8.0 * (c + -0.125 * edge);
}

void main() {
     gl_FragColor = edges();
}

现在在PC和Desire HD上显示为主要是黑色图像,突出显示彩色边缘。然而,在LG设备上,它显示为过度曝光的图像,但噪声很大。

这感觉就像一个精确的问题,你可以看到我已经尝试提高精度,但我不知道还有什么可以尝试,或者我是否已经做到了。

这个着色器没有隔离,我有一个照明着色器,在这个设备上看起来有噪音,但在其他设备上却没有。

我也尝试过钳制最终值。

1 个答案:

答案 0 :(得分:1)

我说这是一个预防问题。来自PowerVR的文档声明texture2D返回lowp数据,除非将采样器指定为更高的精度。但是只能在浮动纹理上做到这一点。

因此,不是提高采样器的精度,而是具有预期的效果:

vec4 edge = texture2D(sTexture, vTextureCoord + vec2(-offset, -offset));
edge += texture2D(sTexture, vTextureCoord + vec2(-offset, 0.0));
edge += texture2D(sTexture, vTextureCoord + vec2(-offset, offset));
edge += texture2D(sTexture, vTextureCoord + vec2( 0.0, offset)) ;
edge += texture2D(sTexture, vTextureCoord + vec2( offset, offset)) ;
edge += texture2D(sTexture, vTextureCoord + vec2( offset, 0.0));
edge += texture2D(sTexture, vTextureCoord + vec2( offset, -offset));
edge += texture2D(sTexture, vTextureCoord + vec2( 0.0, -offset));

lowp vec4 edge =...暴露了我之前看到的问题。

P.S。我知道我应该只采用我需要的频道进行优化,在这种情况下.rgb