当前位置: 首页 > 知识库问答 >
问题:

窗口标题覆盖Opengl渲染

章德惠
2023-03-14

我正在尝试学习windows上的opengl编程,虽然我最初是从SDL开始的,但我已经决定放弃它,以便学习如何使用WGL自己启动OpenGL上下文。

我使用nanovg作为一个快速的图形绘制库,用SDL渲染一切都很好,但是,现在我已经移除了SDL,创建了我自己的窗口和OpenGL上下文,我发现窗口的标题栏与渲染区域重叠了。好像渲染区域的原点(0,0)在整个窗口的左上方,而不是标题栏的正下方,如果这有意义的话?

形状渲染得很好,但是如果我在位置0渲染一个矩形,高度为20的0,最初我不会看到,但是,如果我增加窗口的高度,它最终会出现。

我必须做什么才能让渲染区域的原点位于标题栏下方?

我已经将glViewport设置为0,0,并在启动时设置窗口的宽度和高度,如果这有帮助的话。

编辑:这是 OpenGL 上下文创建代码,您看到的“窗口大小”和“窗口大小”高度属性与 WinAPI 创建窗口函数提供的高度和宽度相同。

const int PixelFormatAttributeList[] =
                {
                    WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
                    WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
                    WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
                    WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
                    WGL_COLOR_BITS_ARB, 32,
                    WGL_DEPTH_BITS_ARB, 32,
                    WGL_STENCIL_BITS_ARB, 32,
                    0 
                };

int ContextAttributes[] =
                {
                    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
                    WGL_CONTEXT_MINOR_VERSION_ARB, 3,
                    WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
                    0 
                };

wglChoosePixelFormatARB(WindowDeviceContext, PixelFormatAttributeList, NULL, 1, &PixelFormat, &FormatCount);

SetPixelFormat(WindowDeviceContext, PixelFormat, &PFD);

OpenGLContext = wglCreateContextAttribsARB(WindowDeviceContext, 0, ContextAttributes);                  
wglMakeCurrent(WindowDeviceContext, OpenGLContext);

glViewport(0, 0, WindowSize.Width, WindowSize.Height);

nvgCreateGL3(NVG_ANTIALIAS | NVG_STENCIL_STROKES);

谢谢

共有1个答案

司徒经纶
2023-03-14

好吧,事实证明,这更多地与我对窗口的无知有关,而不是与OpenGL本身有关(但它也与我对OpenGL的无知有很大关系)。windows中窗口的大小包括其标题栏,将视口的大小设置为窗口的大小是导致在标题栏下方呈现形状的问题的原因,解决问题的方法是检索窗口的客户端矩形,并使用它来设置视口。

 类似资料:
  • 我正在寻找一些关于渲染子窗口的信息,特别是关于OpenGL如何与GDI互操作的信息。我的问题是,我基本上有两个窗口,首先,主窗口是在qt中创建的,而在qt内部,子窗口是利用OpenGL渲染器托管的。 现在我想做的是在我的OpenGL窗口顶部托管一个覆盖,所以我用它来覆盖OpenGL窗口。我遇到的问题是,当我使用OpenGL渲染时,OpenGL生成的图形似乎模糊了图形区域,包括并有效地撤消了由qt合

  • 问题内容: 我正在尝试创建系统覆盖图。但是我一直在“拒绝权限”。我正在使用SDK版本23。 我的清单文件: 我用来创建叠加层的代码: 问题答案: 首先,没有名为的权限。是的。 其次,如果您的年龄为23岁或更高,并且您正在运行Android 6.0+设备,则您的应用一开始将不会获得此权限。致电查看您是否具有权限,如果没有,则用于将用户引导到“设置”。

  • 我写了一个< code>OpenGL代码用于在屏幕上渲染图像。我使用< code>GLUT来创建一个窗口和回调,但是我想在< code>win32窗口中而不是在< code>GLUT中呈现图像,基本上我们有一个< code > CreateWindowEx() API来在< code>win32中创建窗口,并且我们有一个< code>HWND(句柄),以便我们可以将此句柄传递给< code>HDC

  • 我正在通过glfw3库学习OpenGL,我正在使用imgui制作一个有趣的应用程序。 我想做一个小引擎或CAD工具。 问题是我不能在imgui窗口中呈现我想要的。 我搜索了谷歌,找到了以下链接: https://gamedev.stackexchange.com/questions/150214/render-in-a-imgui-window https://gamedev.stackexcha

  • 我有一个常规的Win32窗口,我想使用OpenGL渲染该窗口的一部分,我发现了这个问题: 在常规窗口中使用打开GL (Win32) 但我真的不知道他们是如何在一个窗口内创建一个面板,并获得了它的DC。。 基本上,我想要一个使用win32绘制按钮、列表等的窗口,并在同一窗口的某个指定部分渲染opengl内容。 我试着使用glScissor和清除缓冲区,但这只是用黑色填充整个屏幕,而我指定的部分是透明