在 glsl 中混合两个相机纹理时出现奇怪的纹理结果
Strange texture result when mix two camera textures in glsl
我正在 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);
}
是什么导致了这个结果?
提前致谢。
工件看起来与 Mali 对齐,所以如果我不得不猜测您正在读取当前绑定的帧缓冲区颜色附件作为输入纹理,同时写入它。
这是规范中的 "implementation defined" 行为,并发读写肯定会在像 Mali 这样的 tile-based 渲染器上做坏事。
我正在 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);
}
是什么导致了这个结果? 提前致谢。
工件看起来与 Mali 对齐,所以如果我不得不猜测您正在读取当前绑定的帧缓冲区颜色附件作为输入纹理,同时写入它。
这是规范中的 "implementation defined" 行为,并发读写肯定会在像 Mali 这样的 tile-based 渲染器上做坏事。