我有一个边缘检测着色器,它在渲染猴子和我的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设备上,它显示为过度曝光的图像,但噪声很大。
这感觉就像一个精确的问题,你可以看到我已经尝试提高精度,但我不知道还有什么可以尝试,或者我是否已经做到了。
这个着色器没有隔离,我有一个照明着色器,在这个设备上看起来有噪音,但在其他设备上却没有。
我也尝试过钳制最终值。
答案 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