今天是学习opengl的第一天(原来也看过opengl的一些知识点,但是没有上机code过),记录一下学习中出现的问题以及对应的解决方法,希望可以帮到遇到同样问题的同学,也记录自己的学习历程。
我是在windows上学习的,使用的是vs2013。
1.获取opengl开发中使用的两个.lib
学习opengl会用到两个库:GLFW 和 GLEW
GLFW:GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口 。下载官网:http://www.glfw.org/download.html
GLEW:OpenGL扩展库是个简单的工具,用于帮助C/C++开发者初始化扩展(OpenGL扩展功能)并书写可移植的应用程序。GLEW当前支持各种各样的操作系统,包含Windows,Linux,Darwin,Irix与Solaris。下载官网:http://glew.sourceforge.net/index.html
最好下载源码,源代码编译库可以保证生成的库是兼容你的操作系统和CPU的。
编译源码可以使用CMake。 官网:https://cmake.org/download/ 如何使用cmake编译源码,请搜索相关文章。
编译完成后, 复制编译生成的库和include文件夹放到你自己想使用的目录下。
2.创建工程
用vs创建一个空的工程(我使用的语言是c++),然后导入上面生成的两个.lib和include里面包含的文件。
3.第一个opengl demo的代码
// GLEW
//#define GLEW_STATIC //注意这个宏注释掉了
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
#include <iostream>
const GLuint WIDTH = 800, HEIGHT = 600;
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "first opengl test", nullptr, nullptr);
if (!window)
{
std::cout<<"failed to create window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = true;
auto err = glewInit();
if (err!=GLEW_OK)
{
auto str=glewGetErrorString(err);
std::cout << "failed to init glew" << std::endl;
return -1;
}
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
glClearColor(0.0, 0, 0.5, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
运行结果如下图:
说说我在这段代码中遇到的问题:
1. glfwCreateWindow创建的窗口一直为null,经过查找是
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);(设置使用的opengl主版本号)与
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3)(设置使用的opengl次版本号);指定的opengl版本号我的电脑不支持。
解决方法:查看电脑支持的opengl版本,工具http://pan.baidu.com/s/1slb79md
我的是笔记本,开始查看时只支持到opengl3.1,经过查找自己的独立显卡最高可以支持到opengl4.3的,我升级了显卡驱动,发现依然只支持到3.1,又搜索了下 ,由于是双显卡(我的情况是电脑默认使用的集显)将显卡设置成独显就好了,设置方法:控制面板 — NVIDIA控制面板,全局改为高性能。
这样就可以创建成功window了。
2.glewExperimental = true;一直链接出错
我查了下库的导入没有问题,不应该link error的,仔细检查代码发现应该是
#define GLEW_STATIC 的问题 当时参考的资料它使用的是glew32s.lib静态库
而我使用的是glew32.lib不是静态库,注释掉这个宏定义就好了。(如果使用的是静态库,要加上这个宏定义)。
3.glfwMakeContextCurrent(window);这句话要再glewinit() 之前 否则glewinit()会初始化失败