繁体   English   中英

Android OpenGL ES Fragement Shader 1282错误

[英]Android OpenGL ES Fragement Shader 1282 error

我使用OpenGl ES片段着色器构建了视频效果应用程序。
但是,此应用程序有1282错误,在我的情况下发生在glUniformMatrix4fv()。

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";

问题是..原始片段着色器在android 4.4中工作。 但是,这在android 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";

我想知道此问题的原因和解决方案。

谢谢。

在您的情况下,1282可能是GL_INVALID_OPERATION

我认为您的统一位置在您的行中无效

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

检查你的glGetUniformLocation()方法,你在何处获得uMVPMatrixHandle以及uSTMatrixHandle和问题可能是在那里。 确保名称与顶点着色器中的名称匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM