注释掉glfwWindowHint()会使代码起作用(OpenGL with GLFW),为什么?

时间:2015-05-10 07:50:29

标签: c++ opengl glfw

抱歉,我对这个问题的正确名称有点麻烦,但是我遇到了障碍,我想至少知道消息来源。

我一直在努力学习学习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,右键单击它并选择&#34;使用图形处理器运行...&#34;但无济于事。

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

1 个答案:

答案 0 :(得分:3)

问题的实际原因(由OP确认)是过时的和/或不是功能齐全的驱动程序。这再次提醒一下,在OpenGL问题的情况下,第一步应该始终是升级到最新版本的图形驱动程序,直接从GPU制造商的下载站点获得。

有两个原因:

  1. OEM驱动程序通常落后于GPU供应商的大量版本。

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

  3. 总而言之:您的程序可能会获得缺少所需OpenGL功能的英特尔高清显卡的OpenGL环境。因此,当设置这些GLFW窗口提示窗口创建失败时,由于您的程序没有检查此错误,它将尝试使用该窗口,这当然会造成麻烦。

    你应该怎么做? 首先添加错误检查! 以下是如何处理窗口创建失败的示例:

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

    接下来,您要强制系统使用NVidia卡。不要这样做&#34;通过浏览器在NVidia BS上运行&#34 ;;说你把你的程序运送给别人?你想把这个负担放在他们身上吗?或者你想要调试它时怎么样?

    正确执行:告诉系统您要在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[])
    {
        …