关于openGL中glew使用的简单问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于openGL中glew使用的简单问题相关的知识,希望对你有一定的参考价值。

我调用glewInit();
返回的是:1, 也就是
#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */

请问一下怎么会这样? 什么原因? 谢谢!!
请问一下,怎么创建 Render Context? 问题是,我没用用到MFC呀??
请高手指教。

MFC下使用glewInit时需要先将Render Context创建好, 否则glewInit将返回GLEW_ERROR_NO_GL_VERSION

下面是我转的,供你参考:

把CEGUI配置好,运行osgcegui的例子,会发现下面这句话是过不去的:)

new CEGUI::System( new CEGUI::OpenGLRenderer(0) );

调试一下:(用的GEGUI版本为0.6.2)

1 OpenGLRenderer构造失败了。

2 继续找一找构造失败的原因,构造函数调用的最后一个函数initialiseGLExtensions(初始化OpenGL的Extensions),抛出了异常。

3 异常的原因,glewInit返回值不对。

4 跟着glewinit看一看,发现glGetString(GL_VERSION)没有得到正确的version,因此返回了GLEW_ERROR_NO_GL_VERSION。

原因很清楚了,CEGUI初始化的时候需要调用glGetString(GL_VERSION),如果没有一个有效的rendering context,glGetString返回的结果是不确定的。因此在构造CEGUI::OpenGLRenderer之前需要确定一个当前有效的rc。

在osg中按如下写法就可以了:

osgViewer::Viewer viewer;

viewer.setThreadingModel(osgViewer::ViewerBase::SingleThreaded);

viewer.realize();

viewer.getCamera()->getGraphicsContext()->makeCurrent();

第二句话设置线程模式为单线程,如果不设单线程,似乎只能去渲染线程初始化cegui了吧。第四句话里面会调用wglMakeCurrent,设定一个有效的rc。如果这里没有写,osg需要到draw的时候才会MakeCurrent:)
参考技术A MFC下使用glewInit时需要先将Render Context创建好, 否则glewInit将返回GLEW_ERROR_NO_GL_VERSION

使用 GLEW、assimp、SDL2 和 CMake 和 CodeBlocks 的 C++ OpenGL 项目设置

【中文标题】使用 GLEW、assimp、SDL2 和 CMake 和 CodeBlocks 的 C++ OpenGL 项目设置【英文标题】:C++ OpenGL Project Setup using GLEW, assimp, SDL2 and CMake with CodeBlocks 【发布时间】:2016-01-23 22:06:55 【问题描述】:

我已经完成了关于使用 Java 和 lwjgl 在 OpenGL 中制作 3D 渲染引擎的完整教程,制作教程的人也用 C++ 编写了引擎

为了增加我的编程知识,我也想看看 C++ 版本。此外,我相信(我可能完全错了)我实际上可以用 C++ 做比用 java 做的更多的事情。我遇到的主要问题是,尽管包含说明,但我无法让引擎运行,如果有人能帮助我,我将不胜感激。

这是我要设置的引擎:https://github.com/BennyQBD/3DEngineCpp

我想在这个项目中使用 CodeBlocks,因为它是推荐的,与 Visual Studio 不同,它是免费的。我还下载了 glew、assimp 和 sdl,并安装了运行所需的 CMake。现在我必须根据这里的说明将它们放在一起:

###Windows/MinGW###
- Make sure CMake is both installed and added to the system PATH.
- Open a Terminal and run:
```Shell 
# install dependencies
# Install GLEW in %PROGRAMFILES%/GLEW or SET %GLEW_ROOT_DIR% to where GLEW is on your machine (Example: D:\PATH_TO_GLEW)
# Install SDL2 in %PROGRAMFILES%/SDL2 or SET %SDL2_ROOT_DIR% to where SDL2 is on your machine (Example: D:\PATH_TO_SDL2)
# Install ASSIMP in %PROGRAMFILES%/ASSIMP or SET %ASSIMP_ROOT_DIR% to where ASSIMP is on your machine (Example: D:\PATH_TO_ASSIMP)
cd build
# REPLACE "Visual Studio 12" with your preferred build toolchain (Maybe you want "Codeblocks - MinGW Makefiles")
# BTW VS 10 is VS 2010, VS 11 is VS 2012 and VS 12 is VS 2013, BLAME MicroSoft for the naming! LOL! 
cmake -G "Visual Studio 12" ../
# open the generated SLN file (or cbp file if using CodeBlocks) and build!
```
- Copy the DLLs in /lib/_bin/ to /build/Debug/ and /build/Release/
- In Visual Studio, set the Startup project to 3DEngineCpp
- Move the res folder into the build folder
- Run

主要问题是,因为我只在 Eclipse 中完成了 java 编码,所以我有点困惑..

他所说的“打开终端并运行:'''Shell”是什么意思?我应该如何安装glew、sdl2和assimp?什么是 cd 构建?为什么我需要 CMake,它并没有真正提到它的作用..?

也许有人可以详细说明(如果可能的话,一步一步地)我需要做什么才能让它运行,非常感谢!

【问题讨论】:

【参考方案1】:

不保证我的步骤将完美无缺,因为 C++ 中的外部依赖项对我来说仍然非常痛苦,但我会给你一些线索并希望你取得一些进展。另外,我从未使用过 Code::Blocks,所以我不确定 Visual Studio 项目是否与它兼容。这是我知道如何在 Windows 上做事的唯一方法。

首先,您需要安装 CMake。 CMake 是一个生成项目文件的实用程序,以便可以在某些平台上轻松编译项目。它在 Windows 上生成 Visual Studio 项目文件,这将允许您在 Visual Studio 中打开项目,并从那里编译它们。

为了构建项目,您必须首先理清它的依赖关系。


灵光:

    下载 GLEW 的 sources 并提取所有内容。它带有 Visual Studio 项目文件 以管理员权限打开 Visual Studio 打开 GLEW 的项目 构建一切 运行install“项目”以让 Visual Studio 安装 GLEW

Assimp:

    从 GitHub 下载 Assimp 的 source 在某处提取项目根目录。根目录是CMakeLists.txt所在的目录 打开 CMake 的 GUI 实用程序 单击“浏览源”,然后选择该目录 通过单击“浏览构建”选择输出目录 单击配置,完成后单击生成。这将为您生成一个 Visual Studio 项目文件 使用 Visual Studio 打开项目,构建所有内容。像以前一样运行 install 来安装 Assimp

SDL2:SDL 的源代码随 Visual Studio 项目文件一起提供,因此您可以重复 GLEW 的步骤来安装它。


现在您终于可以开始尝试让引擎工作了。不能保证它会起作用,但我会尝试我为 Assimp 建议的相同方法,因为它们都是 CMake 项目。生成项目文件后,您可以在 Visual Studio 中打开它。除了这一次,您不会真正安装它。您可以修改源代码并像运行任何其他 C++ 项目一样运行它。

【讨论】:

以上是关于关于openGL中glew使用的简单问题的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 GLFW3 初始化 GLew

GLEW 库和代码::块

GLEW 不适用于 CMAKE

有关MacBook的简单操作收集

使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常

cocos2d关于glew32.lib错误(转)