我一直在努力学习学习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;但无济于事。
感谢您通过我的问题来帮助我解决问题,如果您自己有这个问题,我希望它能帮助您解决问题。
答案 0 :(得分:3)
问题的实际原因(由OP确认)是过时的和/或不是功能齐全的驱动程序。这再次提醒一下,在OpenGL问题的情况下,第一步应该始终是升级到最新版本的图形驱动程序,直接从GPU制造商的下载站点获得。
有两个原因:
OEM驱动程序通常落后于GPU供应商的大量版本。
更重要的是:通过Windows更新安装的驱动程序被Microsoft剥夺了对OpenGL的支持,原因只有微软知道。
总而言之:您的程序可能会获得缺少所需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[])
{
…