eglCreateWindowSurface已经将XCompoent对应的NativeWindow和OpenGL绑定了,红圈中的方法又去写入这个native\_window,这是出现问题的原因。直接调用gldraw渲染然后eglSwapBuffers就会自动送显了,无需再对native\_window拷贝写入。示例参考:void RenderThread::DrawImage() { OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "RenderThread", "DrawImage."); if (eglSurface_ == EGL_NO_SURFACE) { OH_LOG_Print(LOG_APP, LOG_WARN, LOG_PRINT_DOMAIN, "RenderThread", "eglSurface_ is EGL_NO_SURFACE"); return; } renderContext_->MakeCurrent(eglSurface_); int32_t ret = OH_NativeImage_UpdateSurfaceImage(nativeImage_); if (ret != 0) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RenderThread", "OH_NativeImage_UpdateSurfaceImage failed, ret: %{public}d, texId: %{public}d", ret, nativeImageTexId_); return; } OH_LOG_Print(LOG_APP, LOG_DEBUG, LOG_PRINT_DOMAIN, "RenderThread", "OH_NativeImage_UpdateSurfaceImage succeed."); float matrix[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; ret = OH_NativeImage_GetTransformMatrixV2(nativeImage_, matrix); if (ret != 0) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RenderThread", "OH_NativeImage_GetTransformMatrix failed, ret: %{public}d", ret); return; } for (int i = 0; i < 16; i++) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "RenderThread", "mjt: %{public}d:%{public}f", i, matrix[i]); } glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); shaderProgram_->Use(); shaderProgram_->SetInt("texture", 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, nativeImageTexId_); shaderProgram_->SetMatrix4v("matTransform", matrix, 16, false); glBindVertexArray(vertexArrayObject_); glEnable(GL_DEPTH_TEST); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, Detail::indices); renderContext_->SwapBuffers(eglSurface_); }
eglCreateWindowSurface已经将XCompoent对应的NativeWindow和OpenGL绑定了,红圈中的方法又去写入这个native\_window,这是出现问题的原因。直接调用gldraw渲染然后eglSwapBuffers就会自动送显了,无需再对native\_window拷贝写入。
示例参考: