gpt4 book ai didi

c++ - 注释掉 glfwWindowHint() 使代码起作用(带有 GLFW 的 OpenGL),为什么?

转载 作者:太空狗 更新时间:2023-10-29 21:18:28 24 4
gpt4 key购买 nike

抱歉,我对这个问题的正确名称遇到了一些麻烦,但是我遇到了障碍,我想至少被告知来源。

我一直在努力学习 openGL,并且正在学习本教程: open.gl

有问题的行:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

在完成本教程的过程中,我的代码中出现了访问冲突异常。只有在我注释掉以下几行之后,我才能让程序按照教程所说的那样工作,它应该是第一次工作。本教程对注释掉的行说明如下:

“您会立即注意到前三行代码仅与该库相关。它指定我们需要 OpenGL 上下文至少支持 OpenGL 3.2。GLFW_OPENGL_PROFILE 选项指定我们需要一个上下文仅支持新的核心功能。”

我的想法是,也许我的驱动程序不支持 OpenGL 3.2 或更高版本,因为当我注释掉有问题的行时,我的程序运行良好。 但是,我下载了一个叫做 GPU caps viewer 的软件。当软件扫描我的硬件时,它说我的 NVIDIA GeForce GT 540M 和 HD Graphics 3000 都支持 OpenGL 4.3。所以我对问题的根源感到非常困惑,我做错了什么,或者这是硬件问题?

以下是 GPU CAPS 和 NVIDIA PORTAL 的快照:2 pictures on imgur

不起作用:

#include "stdafx.h"  //necessary headers in here


int _tmain(int argc, _TCHAR* argv[])
{
glfwInit();

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
glfwMakeContextCurrent(window);

while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
glfwTerminate();
return 0;

作品:

#include "stdafx.h" //necessary headers in here


int _tmain(int argc, _TCHAR* argv[])
{
glfwInit();
/**
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
**/
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr, nullptr); // Windowed
glfwMakeContextCurrent(window);

while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
glfwTerminate();
return 0;

头文件

#pragma once
#define GLEW_STATIC
#include <glew.h>

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <thread>

#define GLFW_INCLUDE_GLU
#include <glfw3.h>

想到的最后一件事是,当我转到 NVIDIA 控制面板时,它显示 Visual Studio 2013 仅使用 Intel HD 3000 显卡。它没有给我使用我的 GeForce 显卡的选项,这可能是问题所在吗?

EditOne:我尝试通过右键单击它并选择“使用图形处理器运行...”通过 Windows 资源管理器运行我的 Visual Studio 2013,但无济于事。

感谢您浏览我的问题来帮助我解决问题,如果您自己也有这个问题,我希望它能帮助您解决问题。

最佳答案

问题的实际原因(由 OP 确认)是过时的和/或功能不全的驱动程序。这再次提醒我们,如果出现 OpenGL 问题,首先应该始终升级到最新版本的图形驱动程序,直接从 GPU 制造商的下载站点获取。

这有两个原因:

  1. OEM 驱动程序的发布通常滞后于 GPU 供应商。

  2. 更重要的是:由于只有 Microsoft 才知道的原因,Microsoft 剥夺了通过 Windows 更新安装的驱动程序对 OpenGL 的适当支持。


长话短说:您的程序可能会为缺少所需 OpenGL 功能的英特尔高清显卡获取 OpenGL 上下文。因此,当设置这些 GLFW 窗口时提示窗口创建失败,并且由于您的程序不检查此错误,它将尝试使用该窗口,这当然会导致麻烦。

你应该怎么做? 首先也是最重要的是添加错误检查!这是一个如何处理窗口创建失败的示例:

GLFWwindow* window = glfwCreateWindow(
800,
600,
"OpenGL",
nullptr,
nullptr);
if( !window ) {
print_some_error_message();
exit(-1);
}
glfwMakeContextCurrent(window);

接下来您要强制系统使用 NVidia 卡。不要那样做“通过在 NVidia BS 上运行的资源管理器启动”;说你把你的程序发给别人?你想把这个负担加在他们身上吗?或者你呢,当你想调试它的时候?

正确执行:告诉系统您要以 Optimus 配置在 NVidia 硬件上运行。只需将以下内容链接到您的程序中:

extern "C" {
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}

最好把它放在你程序的主要功能旁边,即在你的情况下

#include "stdafx.h"  //necessary headers in here

extern "C" {
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}

int _tmain(int argc, _TCHAR* argv[])
{

关于c++ - 注释掉 glfwWindowHint() 使代码起作用(带有 GLFW 的 OpenGL),为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com