2016-08-11 23 views
0

OpenGl ESフラグメントシェーダを使用してビデオエフェクトアプリケーションを構築しました。
しかし、このアプリケーションには1282のエラーがあり、私の場合はglUniformMatrix4fv()で発生しました。Android OpenGL ESフラグメンテーションシェーダ1282エラー

GLES20.glViewport(0, 0, getWidth(), getHeight()); 
GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 
GLES20.glUseProgram(program); 
GLToolbox.checkGlError("glUseProgram"); 

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureID[0]); 

triangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); 
GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false, 
          TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices); 
GLToolbox.checkGlError("glVertexAttribPointer aPosition"); 

GLES20.glEnableVertexAttribArray(aPositionHandle); 
GLToolbox.checkGlError("glEnableVertexAttribArray aPositionHandle"); 

triangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); 
GLES20.glVertexAttribPointer(aTextureHandle, 3, GLES20.GL_FLOAT, false, 
          TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices); 
GLToolbox.checkGlError("glVertexAttribPointer aTextureHandle"); 

GLES20.glEnableVertexAttribArray(aTextureHandle); 
GLToolbox.checkGlError("glEnableVertexAttribArray aTextureHandle"); 

Matrix.setIdentityM(mVPMatrix, 0); 
GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, mVPMatrix, 0); 
GLToolbox.checkGlError("uMVPMatrixHandle glUniformMatrix4fv"); 
GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, sTMatrix, 0); 
GLToolbox.checkGlError("uSTMatrixHandle glUniformMatrix4fv"); 
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
GLToolbox.checkGlError("glDrawArrays"); 

GLES20.glFinish(); 

私のフラグメントシェーダーソースのgl_FragColor = vec4(color.rgb * weight, color.a);に問題が見つかりました。

String shader = "#extension GL_OES_EGL_image_external : require\n" 
     + "precision mediump float;\n" 
     + "vec2 seed;\n" 
     + "varying vec2 vTextureCoord;\n" 
     + "uniform samplerExternalOES tex_sampler_0;\n" 
     + "uniform samplerExternalOES tex_sampler_1;\n\n" 
     + "float scale;\n" 
     + "float stepX;\n" 
     + "float stepY;\n\n" 
     + "float rand(vec2 loc) {\n" 
     + " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" 
     + " float theta2 = dot(loc, vec2(12.0, 78.0));\n" 
     + " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" 
     + " float temp = mod(197.0 * value, 1.0) + value;\n" 
     + " float part1 = mod(220.0 * temp, 1.0) + temp;\n" 
     + " float part2 = value * 0.5453;\n" 
     + " float part3 = cos(theta1 + theta2) * 0.43758;\n" 
     + " float sum = (part1 + part2 + part3);\n" + 
     "\n" 
     + " return fract(sum)*scale;\n" 
     + "}\n" 
     + "\n" 
     + "void main() {\n" 
     + seedString[0] 
     + seedString[1] 
     + scaleString 
     + stepX 
     + stepY 
     + "\n" 
     + " float noise = texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, -stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, -stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, stepY)).r * 0.224;\n" 
     + " noise += 0.4448;\n" 
     + " noise *= scale;\n" 
     + "\n" 
     + " vec4 color = texture2D(tex_sampler_0, vTextureCoord);\n" 
     + " float energy = 0.33333 * color.r + 0.33333 * color.g + 0.33333 * color.b;\n" 
     + " float mask = (1.0 - sqrt(energy));\n" 
     + " float weight = 1.0 - 1.333 * mask * noise;\n" 
     + "\n" 
     + " gl_FragColor = vec4(color.rgb * weight, color.a);\n" 
     + "}\n"; 

問題はオリジナルのフラグメントシェーダーがアンドロイド4.4で動作していたことです。しかし、それはアンドロイド6.0で動作していませんでした。

私のフラグメントシェーダーソースでgl_FragColor = vec4(color.rgb * weight, color.a);が変更されました。

String shader = "#extension GL_OES_EGL_image_external : require\n" 
     + "precision mediump float;\n" 
     + "vec2 seed;\n" 
     + "varying vec2 vTextureCoord;\n" 
     + "uniform samplerExternalOES tex_sampler_0;\n" 
     + "uniform samplerExternalOES tex_sampler_1;\n\n" 
     + "float scale;\n" 
     + "float stepX;\n" 
     + "float stepY;\n\n" 
     + "float rand(vec2 loc) {\n" 
     + " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" 
     + " float theta2 = dot(loc, vec2(12.0, 78.0));\n" 
     + " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" 
     + " float temp = mod(197.0 * value, 1.0) + value;\n" 
     + " float part1 = mod(220.0 * temp, 1.0) + temp;\n" 
     + " float part2 = value * 0.5453;\n" 
     + " float part3 = cos(theta1 + theta2) * 0.43758;\n" 
     + " float sum = (part1 + part2 + part3);\n" + 
     "\n" 
     + " return fract(sum)*scale;\n" 
     + "}\n" 
     + "\n" 
     + "void main() {\n" 
     + seedString[0] 
     + seedString[1] 
     + scaleString 
     + stepX 
     + stepY 
     + "\n" 
     + " float noise = texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, -stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, -stepY)).r * 0.224;\n" 
     + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, stepY)).r * 0.224;\n" 
     + " noise += 0.4448;\n" 
     + " noise *= scale;\n" 
     + "\n" 
     + " vec4 color = texture2D(tex_sampler_0, vTextureCoord);\n" 
     + " float energy = 0.33333 * color.r + 0.33333 * color.g + 0.33333 * color.b;\n" 
     + " float mask = (1.0 - sqrt(energy));\n" 
     + " float weight = 1.0 - 1.333 * mask * noise;\n" 
     + "\n" 
     + " // gl_FragColor = vec4(color.rgb * weight, color.a);\n" 
     + " gl_FragColor = vec4(color.rgb, color.a);\n" 
     + " gl_FragColor = gl_FragColor\n" 
     + "  + vec4(rand(vTextureCoord + seed),\n" 
     + "   rand(vTextureCoord + seed),\n" 
     + "   rand(vTextureCoord + seed), 1);\n" 
     + "}\n"; 

この問題の原因と解決策を知りたい。

ありがとうございます。

答えて

0

あなたの場合の1282はおそらくGL_INVALID_OPERATIONです。

私はあなたの制服場所が

GLES20.glUniformMatrix4fv(uMVPMatrixHandle, 1, false, mVPMatrix, 0); 
//or 
GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, sTMatrix, 0); 

があなたのuMVPMatrixHandleなどuSTMatrixHandleを取得し、問題があるかもしれませんあなたのglGetUniformLocation()方法を確認し、あなたの行に無効だと思います。名前が頂点シェーダーのものと一致することを確認してください。

+0

'glGetUniformLocation()'メソッドをチェックしました。しかし、私は同じエラーを見ることができます。私の頂点シェーダでは、 'uMVPMatrixHandle'と' uSTMatrixHandle'が名前にマッチしました。私の頂点シェーダ名 '' uniform mat4 uMVPMatrix; \ n "'、 '" uniform mat4 uSTMatrix; \ n "'。そして、検査方法は 'uMVPMatrixHandle = GLES20.glGetUniformLocation(プログラム、" uMVPMatrix ");'、 'uSTMatrixHandle = GLES20.glGetUniformLocation(プログラム、" uSTMatrix ");' –

+0

です。今、私のアプリケーションが動作します! 'onDrawFrame()'メソッドに 'glGetUniformLocation()'メソッドを追加しました。 'uMVPMatrixHandler'、' uSTMatrixHandle'をチェックしました。ありがとう@ハリー –