0

我有一个边缘检测着色器,它在渲染猴子和我的 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 设备上,它显示为过度曝光的图像,但有相当多的噪点。

这感觉像是一个精度问题,正如你所看到的,我已经尝试提高精度,但我不知道还能尝试什么,或者我是否做得对。

这与此着色器无关,我有一个照明着色器,在此设备上似乎有噪点,但在其他设备上没有。

我也尝试过钳制最终值。

4

1 回答 1

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 =...暴露了我之前看到的问题。

PS我知道我应该只通过我需要的渠道进行优化,在这种情况下.rgb

于 2012-01-18T19:20:14.523 回答