c++ - 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);
}
解决方案
glutPostRedisplay
仅适用于“过剩”窗口。( glutCreateWindow
)。您必须使用 Win-API 函数来使窗口的客户区无效(例如InvalidateRect
):
InvalidateRect(HWND, NULL, TRUE);
推荐阅读
- java - 如何从覆盖方法java调用值?
- java - 在具有身份验证的代理后面使用 Azure EventHub
- python - 在 Django StaticLiveServerTestCase 中提交使用 Intercooler 的表单
- python-3.x - 在python中使用opencv按面积查找第二大轮廓及其内部轮廓
- python - Try/catch 块显示 TypeError: until_not() missing 1 required positional argument: 'method'
- r - 将嵌套列表中的元素传递给 renderUI
- c# - 在 C# 中异步等待事件
- json - 从带有分隔符的字符串中的 json 文件中获取值
- python - TensorFlow FailedPreconditionError:迭代器尚未初始化
- android - 在 Android Studio 中更改选中的单选按钮颜色