我正在android中制作一个简单的图像过滤器应用程序,并在GPUImage(https://github.com/BradLarson/GPUImage)中使用相同的方法实现了低通滤波器
它缓冲先前和当前相机帧的混合并进行渲染。 因此,我创建了一个缓冲区FBO并渲染当前的相机纹理,然后将其用作下一个相机纹理在低通滤镜着色器中混合的纹理。
我在一些智能手机(Galaxy S10,Nexus 6P等)上测试了我的代码,并且效果很好。但是在Galaxy S8(Mali-G71)中,结果很奇怪,我不知道出了什么问题。
这些是错误的结果
这是我的代码:
Fragment shader:
varying vec2 vTextureCoord;
uniform sampler2D sTexture1;
uniform float filterStrength;
void main() {
vec4 texColor0 = texture2D(sTexture, vTextureCoord);
vec4 texColor1 = texture2D(sTexture1, vTextureCoord);
gl_FragColor = mix(texColor0, texColor1, filterStrength);
}
什么会导致此结果? 预先感谢。
答案 0 :(得分:0)
工件看起来与Mali对齐,因此,如果我不得不猜测,您正在将当前绑定的帧缓冲区颜色附件作为输入纹理读取,同时对其进行写入。
这是规范中的“实现定义”行为,并且并发读写肯定会在像Mali这样基于图块的渲染器上做坏事。