首页 > 解决方案 > winapi 中的 glutpostredisplay() 等价物

问题描述

我正在关注这篇文章,以使用 OpenGL 将视频渲染到纹理上,并使用 C++ 将 winforms 渲染到纹理上。我已将渲染器中的代码更改如下。但是glutPostRedisplay();不管用。当我创建一个 OpenGL 窗口并在那里渲染时,同样的逻辑也很有效。但似乎在winforms中效果不佳。据我了解,glutPostRedisplay 正在尝试刷新我的主 winforms 窗口,而不是 OpenGL 视口。我不确定如何刷新我的视口。

 void OpenGLForm::COpenGL::Render(System::Void)
{   
  //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glEnable(GL_TEXTURE_2D);
  // These are necessary if using glTexImage2D instead of gluBuild2DMipmaps
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);


  // Draw a textured quad
  glBegin(GL_QUADS);
  glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
  glTexCoord2f(1.0f, 0.0f); glVertex2f(frame_width, 0.0f);
  glTexCoord2f(1.0f, 1.0f); glVertex2f(frame_width, frame_height);
  glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, frame_height);
  glEnd();

   glFlush();
 //glutSwapBuffers();

 OpenGLForm::COpenGL::SwapOpenGLBuffers();

//Get data from the camera
 uint32_t* buffer = new uint32_t[frame_width * frame_height * 4];
 if (display_mode == DISPLAY_ARGB) {
     // Pass a pointer to the texture directly into Thermal_GetImage for maximum performance
     status = Thermal_GetDisplayImage(camera, buffer, (uint32_t)frame_pixels);


   glTexImage2D(
       GL_TEXTURE_2D,
       0,
       GL_RGBA8,
       frame_width,
       frame_height,
       0,
       GL_RGBA,
       GL_UNSIGNED_BYTE,
       buffer);


    // Clean up buffer
    delete[] buffer;

   // Update display
   glutPostRedisplay();
}

void OpenGLForm::COpenGL::SwapOpenGLBuffers(System::Void)
{
   SwapBuffers(m_hDC);
}

标签: c++winapiopenglglutwin32gui

解决方案


glutPostRedisplay仅适用于“过剩”窗口。( glutCreateWindow)。您必须使用 Win-API 函数来使窗口的客户区无效(例如InvalidateRect):

InvalidateRect(HWND, NULL, TRUE); 

推荐阅读