HarmonyOS 使用opengles进行渲染时,无法成功渲染上屏的问题

点击按钮后调用opengles进行渲染时,使用glActiveTexture时不使用GL_TEXTURE0,第一次可以成功上屏,之后均无法上屏,屏幕显示黑色

使用

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderingTexture);
glUniform1i(_imageTextureUniform, 0);
  • 1.
  • 2.
  • 3.

可以正常上屏

使用

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, renderingTexture);
glUniform1i(_imageTextureUniform, 2);
  • 1.
  • 2.
  • 3.

仅第一次能上屏,之后均黑屏展示

HarmonyOS
2024-12-27 17:03:37
662浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
superinsect

因为初始的纹理的创建和纹理单元的绑定逻辑有点混乱,所以把plugin_render的drawimage函数的创建纹理和处理逻辑都封装进了egl_core.cpp的displayTexture中,传pixels进函数完成openGL部分的处理,修改后如下:

napi_value PluginRender::drawImage(napi_env env, napi_callback_info info) {
  //...省略前面未修改部分
  // 获取图片数据
  void *addrPtr = nullptr;
  ret = OH_PixelMap_AccessPixels(pixelMap, &addrPtr);
  if (ret == IMAGE_RESULT_SUCCESS) {
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "PluginRender", "access image info success");
  }

  render->eglCore_->displayTexture2(addrPtr, pixelMapInfo.width, pixelMapInfo.height);
  OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginRender", "PluginRender render->eglCore_->displayTexture() executed");
  glBindFramebuffer(GL_FRAMEBUFFER, 0);

  // glBindTexture(GL_TEXTURE_2D, 0);
  // if (texture2D > 0) {
  // glDeleteTextures(1, &texture2D);
  // }
  OH_PixelMap_UnAccessPixels(pixelMap);
  addrPtr = nullptr;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

把egl_core的displayTexture重新写了一下,直接传pixelmap的地址绘制:

void EGLCore::displayTexture(const void *pixels, int tWidth, int tHeight) {
  PrepareDraw();
  GLuint renderingTexture;
  glGenTextures(1, &renderingTexture);
  glActiveTexture(GL_TEXTURE2);
  glBindTexture(GL_TEXTURE_2D, renderingTexture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glBindTexture(GL_TEXTURE_2D, GL_NONE);
  if (tWidth <= 0 || tHeight <= 0) {
    return;
  }
  _textureWidth = tWidth;
  _textureHeight = tHeight;

  if (!_programRGBA) {
    return;
  }
  glEnable(GL_BLEND);
  glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
  glUseProgram(_programRGBA);
  glActiveTexture(GL_TEXTURE2);
  glBindTexture(GL_TEXTURE_2D, renderingTexture);
  //_imageTextureUniform = glGetUniformLocation(_programRGBA, "renderingTexture");
  glUniform1i(0, 2);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)tWidth, (GLsizei)tHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,pixels);


  int INPUT_POSITION_ATTR = glGetAttribLocation(_programRGBA, INPUT_POSITION_NAME);
  int INPUT_TEXTURE_COORDINATE_ATTR = glGetAttribLocation(_programRGBA, INPUT_TEXTURE_COORDINATE_NAME);



  updateVertices();
  glVertexAttribPointer(INPUT_POSITION_ATTR, 2, GL_FLOAT, 0, 0, _vertices);
  glEnableVertexAttribArray(INPUT_POSITION_ATTR);

  // 更新顶点数据 - 纹理绘制锚点
  updateTextureVertices();
  glVertexAttribPointer(INPUT_TEXTURE_COORDINATE_ATTR, 2, GL_FLOAT, 0, 0, _textureVertices);
  glEnableVertexAttribArray(INPUT_TEXTURE_COORDINATE_ATTR);



  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

  glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  glDisable(GL_BLEND);

  // 绘制完成
  if (!FinishDraw()) {
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EGLCore", "displayTexture FinishDraw failed");
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.

之前渲染失败的种种问题应该是sampler读取纹理单元错误,因为激活了纹理单元2,而sampler默认是去纹理单元0读取,所以需要使用glUniform1i更改,这部分的逻辑后续需要根据使用的sampler逻辑进行修改。

分享
微博
QQ
微信
回复
2024-12-27 18:49:51
相关问题
HarmonyOS WebView无法正常渲染
751浏览 • 1回复 待解决
HarmonyOS lazyforEach渲染问题
698浏览 • 1回复 待解决
HarmonyOS ArkWeb 特定样式无法渲染
610浏览 • 1回复 待解决
HarmonyOS 界面数据渲染问题
898浏览 • 1回复 待解决
HarmonyOS 富文本渲染问题
1165浏览 • 1回复 待解决
HarmonyOS VideoDecoder使用OpenGL渲染
841浏览 • 1回复 待解决
Text 组件无法渲染组合 unicode emoji
1123浏览 • 0回复 待解决
嵌套Class属性变化无法触发UI渲染
1037浏览 • 1回复 待解决