我正在创建一个游戏引擎,并开始使用简单的openGL窗口创建。我正在使用visual studio 2013,引擎正在构建为dll。这是初始化openGL的dll中的代码:
bool AsGraphicsManager::Initialize(AsWindowCreateStruct pWindow)
{
//first create the error handler
glfwSetErrorCallback(error::glfw_error_callback);
//Initialize the library
if (!glfwInit())
return 0;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
#ifdef _DEBUG
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
#endif /* _DEBUG */
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_SAMPLES, 0);
glfwWindowHint(GLFW_STEREO, GL_TRUE);
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
glfwWindowHint(GLFW_DEPTH_BITS, 16);
mWindow = new AsWindow(pWindow);
//make the first window the current
glfwMakeContextCurrent(mWindow->mWindow);
//make sure to do this to enable new opengl
glewExperimental = GL_TRUE;
//now initialize glew
GLenum res = glewInit();
if (res != GLEW_OK)
{
printf("Error code: %s While Initializing Glew \n", glewGetErrorString(res));
return false;
}
//input handler
glfwSetKeyCallback(mWindow->mWindow, input::key_callback);
glfwSetScrollCallback(mWindow->mWindow, input::scroll_callback);
glfwSetMouseButtonCallback(mWindow->mWindow, input::mouse_callback);
glfwSetCursorPosCallback(mWindow->mWindow, input::mouse_position_callback);
//nothing went wrong
return true;
}
AsWindowCreateStruct是一个定义如下的结构:
struct ASGE_API AsWindowCreateStruct
{
GLushort mHeight;
GLushort mWidth;
GLushort mXPos;
GLushort mYPos;
std::string mWindowTitle;
bool mFullscrean;
AsWindowCreateStruct(GLushort pWindowHeight, GLushort pWindowWidth, GLushort pWindowXPosition, GLushort pWindowYPosition, std::string pWindowTitle, bool pIsFullscrean = false) :
mHeight(pWindowHeight), mWidth(pWindowWidth), mXPos(pWindowXPosition), mYPos(pWindowYPosition), mWindowTitle(pWindowTitle), mFullscrean(pIsFullscrean){}
};
这只会作为一些参数传递给窗口创建。 mWindow是AsWindow的一个对象。该类的定义并不重要,但使用的构造函数定义为:
mHeight = pCreateStruct.mHeight;
mWidth = pCreateStruct.mWidth;
mXPos = pCreateStruct.mXPos;
mYPos = pCreateStruct.mYPos;
mWindowTitle = pCreateStruct.mWindowTitle;
mFullscrean = pCreateStruct.mFullscrean;
mWindow = 0;
//now create the window
if (mFullscrean)
{
mWindow = glfwCreateWindow(mHeight, mWidth, mWindowTitle.c_str(), glfwGetPrimaryMonitor(), nullptr);
if (!mWindow)
{
printf("Error initializing Window \n");
glfwTerminate();
}
}
else
{
mWindow = glfwCreateWindow(mHeight, mWidth, mWindowTitle.c_str(), nullptr, nullptr);
//this needs to happen before seting window position
if (!mWindow)
{
printf("Error initializing Window \n");
glfwTerminate();
}
else
{
//as long as it isn't fullscrean, change the position
glfwSetWindowPos(mWindow, mXPos, mYPos);
}
};
//make the window visible
glfwShowWindow(mWindow);
其中pCreateStruct是AsWindowCreateStruct的一个实例。
现在,除了所有代码之外,问题是glfwCreateWindow()总是返回0.我在控制台中遇到错误“WGL:找不到合适的像素格式”。我调试了大约一个小时,并将其追溯到文件wgl_context.c第357行中调用的函数choosePixelFormat。函数定义位于wgl_context.c第144行。这都在GLFW 3.0.4中。我看过这样的其他文章并没有帮助。我有一台NVidia GTX 650ti,我正在使用Nvidia的Geforce经验让我的驱动程序保持最新状态。 Windows没有安装它们。我试过在他们的网站www.glfw.org上运行GLFW的简单程序,它运行完美。我很确定这与在DLL中运行有关,但我不知道从哪里开始
如果您需要更多信息,我将很高兴。
编辑:
问题出在
glfwWindowHint(GL_STEREO, GL_TRUE);
答案 0 :(得分:2)
GL_STEREO
无法在多个图形卡上启用输出。它使交换链中缓冲区的数量加倍,以实现立体3D渲染(例如,单独的左/右图像)。您可能会在某些圈子中听到它被称为四缓冲。
您需要一台Radeon HD 6xxx +消费者GPU或工作站级NV / AMD GPU才能在Microsoft Windows上的OpenGL中公开这些功能。在OS X中,您可以在没有昂贵的工作站硬件的情况下获得它。
NV的新驱动程序版本据说可以在Microsoft Windows的OpenGL中公开此功能。我无法证实这一点,但很可能他们只会为最新的GPU启用此功能。否则,为了在Microsoft Windows中的消费级NV卡上获得四缓冲,您必须使用D3D。
Doom 3 BFG Edition可能是NV政策改变的原因,这是第一个使用立体渲染的主要OpenGL 游戏 。