- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
抱歉,我对这个问题的正确名称遇到了一些麻烦,但是我遇到了障碍,我想至少被告知来源。
我一直在努力学习 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 制造商的下载站点获取。
这有两个原因:
OEM 驱动程序的发布通常滞后于 GPU 供应商。
更重要的是:由于只有 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/
我试过休假 this教程,但没有用。我不知道为什么它不起作用。我正在使用 Ubuntu 14.04 和 GNU G++ 命令。 代码: #include int main(void) { g
出于某种原因,当我调用 glfwWindowHint() 时: glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_C
抱歉,我对这个问题的正确名称遇到了一些麻烦,但是我遇到了障碍,我想至少被告知来源。 我一直在努力学习 openGL,并且正在学习本教程: open.gl 有问题的行: glfwWindowHint(G
我是一名优秀的程序员,十分优秀!