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

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

使用

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderingTexture);
glUniform1i(_imageTextureUniform, 0);

可以正常上屏

使用

glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, renderingTexture);
glUniform1i(_imageTextureUniform, 2);

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

HarmonyOS
23h前
浏览
收藏 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;
}

把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");
  }
}

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

分享
微博
QQ
微信
回复
21h前
相关问题
HarmonyOS WebView无法正常渲染
94浏览 • 1回复 待解决
HarmonyOS lazyforEach渲染问题
56浏览 • 1回复 待解决
HarmonyOS 界面数据渲染问题
26浏览 • 1回复 待解决
HarmonyOS ArkWeb 特定样式无法渲染
67浏览 • 1回复 待解决
HarmonyOS 富文本渲染问题
268浏览 • 1回复 待解决
HarmonyOS VideoDecoder使用OpenGL渲染
182浏览 • 1回复 待解决
嵌套Class属性变化无法触发UI渲染
324浏览 • 1回复 待解决