我有一个Android应用程序,我使用openGL来制作一些整洁的图像效果。
基本设置是我不断地将缓冲区绘制到两个纹理中的一个,然后在该纹理的顶部绘制下一帧(本质上是模拟),以产生相同图像不断被操纵的效果。
我正在尝试为此添加一个淡入淡出效果,其中我使背景变暗,然后在其上绘制,但我从中获得了一个非常奇怪的神器。这是我的片段着色器:
private final String mCompositeFragmentShader =
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" +
"varying vec2 bTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"uniform sampler2D bufferTexture;\n" +
"uniform float gamma; \n" +
"void main() {\n" +
" vec4 camera = texture2D(sTexture, vTextureCoord);\n" +
" camera.r = pow(camera.r, 1.0/gamma);\n" +
" camera.g = pow(camera.g, 1.0/gamma);\n" +
" camera.b = pow(camera.b, 1.0/gamma);\n" +
" vec4 bg = texture2D(bufferTexture, bTextureCoord);\n" +
" vec3 color = max(camera.rgb, bg.rgb -vec3(.02, .02, .02));\n"+
" gl_FragColor = vec4(color,1.0);\n" +
"}\n";
代码的相关位是:
vec3 color = max(camera.rgb, bg.rgb -vec3(.02, .02, .02));
所以我希望随着时间的推移,亮区最终会逐渐消失。然而,它不是黑色而是逐渐消失到洋红色网格:
您可以看到屏幕上绘制的每个三角形的网格不同(我只绘制了两个三角形)。
这是顶点着色器,以防万一:
"uniform mat4 uMVPMatrix;\n" +
"uniform mat4 uSTMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aTextureCoord;\n" +
"varying vec4 tempCoords;" +
"varying vec2 vTextureCoord;\n" +
"varying vec2 bTextureCoord;\n" +
"void main() {\n" +
" gl_Position = aPosition;\n" +
" bTextureCoord = aTextureCoord.xy;\n" +
" tempCoords = aTextureCoord;\n" +
" tempCoords.y = aTextureCoord.y * ("+previewSize.height+".0 /"+previewSize.width+".0);\n" +
" vTextureCoord = (uSTMatrix * tempCoords).xy;\n" +
"}\n";
任何人都知道造成这种情况的原因,以及如何解决这个问题?