Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么Texamage2D总是给出无效操作错误?_Android_C_Opengl Es - Fatal编程技术网

Android 为什么Texamage2D总是给出无效操作错误?

Android 为什么Texamage2D总是给出无效操作错误?,android,c,opengl-es,Android,C,Opengl Es,这是我的代码,我找不到问题隐藏在哪里 bool setupGraphics(int w, int h) { printGLString("Version", GL_VERSION); printGLString("Vendor", GL_VENDOR); printGLString("Renderer", GL_RENDERER); printGLString("Extensions", GL_EXTENSIONS); glViewport(0, 0,

这是我的代码,我找不到问题隐藏在哪里

bool setupGraphics(int w, int h) {
    printGLString("Version", GL_VERSION);
    printGLString("Vendor", GL_VENDOR);
    printGLString("Renderer", GL_RENDERER);
    printGLString("Extensions", GL_EXTENSIONS);

    glViewport(0, 0, w, h);
    checkGlError("glViewport");

    glEnable(GL_DEPTH_TEST);

    LOGI("setupGraphics(%d, %d)", w, h);
    gProgram = createProgram(gVertexShader, gFragmentShader);
    if (!gProgram) {
        LOGE("Could not create program.");
        return false;
    }
    gvPositionHandle = glGetAttribLocation(gProgram, "vPosition");
    checkGlError("glGetAttribLocation");

    //Init texture.
    makeCheckImage();  
    checkGlError("init texture1");
    glGenTextures(1, gTextureHandler);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
    glBindTexture(GL_TEXTURE_2D, gTextureHandler[0]);
    checkGlError("init texture2");

    gTextureUniformHandler = glGetUniformLocation(gProgram, "uTexture");
    gTextureCoordinateHandler = glGetAttribLocation(gProgram, "vTexCoordinate");
    checkGlError("init texture");

    return true;
}
以及日志:

I/libgl2jni(30066): GL Version = OpenGL ES 2.0 build 1.8.GOOGLENEXUS.ED945322@2112805
I/libgl2jni(30066): GL Vendor = Imagination Technologies
I/libgl2jni(30066): GL Renderer = PowerVR SGX 540
I/libgl2jni(30066): GL Extensions = GL_EXT_debug_marker GL_OES_rgb8_rgba8 GL_OES_depth24 GL_OES_vertex_half_float GL_OES_texture_float GL_OES_texture_half_float GL_OES_element_index_uint GL_OES_mapbuffer GL_OES_fragment_precision_high GL_OES_compressed_ETC1_RGB8_texture GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_required_internalformat GL_OES_depth_texture GL_OES_get_program_binary GL_OES_packed_depth_stencil GL_OES_standard_derivatives GL_OES_vertex_array_object GL_OES_egl_sync GL_EXT_multi_draw_arrays GL_EXT_texture_format_BGRA8888 GL_EXT_discard_framebuffer GL_EXT_shader_texture_lod GL_IMG_shader_binary GL_IMG_texture_compression_pvrtc GL_IMG_texture_npot GL_IMG_texture_format_BGRA8888 GL_IMG_read_format GL_IMG_program_binary GL_IMG_multisampled_render_to_texture
I/libgl2jni(30066): setupGraphics(480, 800)
I/libgl2jni(30066): after init texture2() glError (invalide operation)
如果我注释glTexImage2DGL_纹理2D,0,4,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage; glBindTextureGL_TEXTURE_2D,gTextureHandler[0];然后一切都会好起来。

看起来您的glBindTexture和glTexImage顺序不对。glTexImage更新当前绑定到指定目标的纹理


首先绑定纹理,然后填充数据。此外,您还应该在设置min/mag过滤器之前绑定纹理,因为这些过滤器也会修改绑定的纹理。

我自己解决了这个问题。该错误是由GLTEXAGE2D中的参数不一致引起的。如果我将其更改为glTexImage2DGL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage;,那么错误就不存在了。

谢谢@Tim。这是我犯的错误之一。但在我将glBindTexture移到glGenTexture下方之后,问题仍然存在。我还没有添加“glEnableGL\u TEXTURE\u 2D”,我必须启用它吗?因为在我一开始启用它之后,它会在加载着色器时出错。顺便说一句,我使用的gl版本是opengles2,平台是android。glEnableGL_TEXTURE_2D在opengles2.0中不是有效的命令。它仅适用于固定管道opengl,已从GLES2.0中删除。我会尝试添加更多的错误检查,并找到它的确切来源@user674199我想我已经在代码中添加了足够多的错误检查。错误来自与GLTEXAGE完全相同的行。