glew glfw opengl 之间的关系
glew glfw 搭建opengl 环境时遇到的一些问题记录
windows
即使完全正确配置了 glfw glew 头文件,lib 文件,dll文件后,依然无法调用 gl 相关函数,如glViewport()
一旦调用就会报 gl 函数链接错误
原因:
win32 下必须 link opengl32.lib.
起初我误以为 glew.lib 只要链接好,就可以 调用 gl 相关的函数了。实际上不是这样的,gl函数还是需要 opengl32.lib 链接进去才可以调用。
glfw,glew,opengl 3个库的作用分别如下
glfw:负责创建窗口,处理消息循环
glew:在调用 opengl 相关函数时,不必每次都用 函数指针的方式,检查 机器是否支持 此 gl 函数
opengl:真正的 gl 相关函数,还是需要 link 这个库
今天在搭建环境时,由于没有链接 opengl32.lib (我以为 glew32.lib 链接了就可以调用 opengl相关函数了),导致gl 相关的函数调用不了,卡了很久。还是对 这些库各自的分工职能理解不清晰所致。
mac
mac下 也有 glew ,glfw 库,并且可以通过 brew install glew,brew install glfw 简单的获取到。
但是工程头文件目录,库文件引用 还是要每个工程各自设置.
mac 下 与 opengl32.lib 对应的 gl 库是 OpenGL.framework
如果 引用 OpenGL.framework,则出现的错误 与 windows 下 不 链接 opengl32.lib 的报错是一样的: 无法链接 gl 相关的函数 (比如 glviewport)
mac 下的 glewInit() 必须在 opengl context 创建之后,即 必须在 glfwMakContextCurrent(window)之后。否则 glewInit() 无法创建成功,一些高版本的 gl 函数在调用时,会出现 运行时报错 EXC_BAD_ACCESS
windows 下虽然 glewInit() 调用在前,不会报错,但是用到 gl 一些高版本的函数时,比如 glGenBuffers() ,也会运行时报错
所以,正确的时机调用 glewInit() 是使用 opengl 高版本函数的 必要条件。
另外 :
windows,mac 环境下 ,glew 的头文件都需要在 glfw 之前,否则会无法编译通过.
#define GLEW_STATIC // 根据 glew32s.lib glew32.lib 链接库不同 ,可以选择是否打开这个宏
#include <GL/glew.h>
#include <GLFW\glfw3.h>
mac环境下,必须加上下面这一行,否则 glfw 无法正常 create window
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
附代码:
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW\glfw3.h>#include <iostream>
using namespace std;int main()
{//glewInit();//glewIsSupported("GL_VERSION_2_0");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);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);GLFWwindow* window = glfwCreateWindow(200, 200, "m30", nullptr, nullptr);if (window == nullptr){cout << "Failed to create GLFW window" << endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);int width, height;glfwGetFramebufferSize(window, &width, &height);glewInit();glViewport(0, 0, width, height);//glViewport(0, 0, width, height);GLuint buffer[1];glGenBuffers(1, buffer);glGetString(0);while (!glfwWindowShouldClose(window)){//cout << "m30" << endl;glfwPollEvents();glfwSwapBuffers(window);}glfwTerminate();return 0;
}
总结:
glfw库: 用于处理 各个平台 的 窗口创建,事件循环.通常可以替换成为其他,比如glut,freeglut 等界面库
(是不是也可以替换成 SDL ?)
opengl库: 提供基本的 gl 函数的支持.opengl 库是写 opengl 程序时所必须的。
glew库: 提供高版本 gl 函数的支持。如果不嫌麻烦的话,也可以手写函数指针,来判断各个 opengl 高版本函数是否支持,但是 glew 库 做了 大大的简化,使得 opengl 各个版本的函数像原生函数一样,可以随意调用。
glew库暂时不知道有没有其他 库 可以替换.
glew glfw opengl 之间的关系相关推荐
- OpenGL之glut、glfw、glew、glad等库之间的关系
结论 1.glad与glew作用类似,实现对底层OpenGL接口封装 2.glfw与glut作用类似,创建窗口界面 3.glut年代久远,现在用glfw居多,可使用glfw+glad组合方式,比如这个 ...
- OpenGL与gl glu glut freeglut glew glfw封装库关系(十五)
1.概述 初学者往往搞不明白OpenGL与诸多库的联系下面一张图帮理清楚,gl glu glut freeglut glew glfw都是对OpenGL的封装而已.这些库已经将OpenGL.E ...
- OpenGL ES glut glew glfw glad freeglut
目录 一.简介 1.freeglut 2.glew 3.glut 4.glfw 5.glad 二.分类 1.窗口管理 2.函数加载 三.组合使用 1.freeglut + glew 2.glfw + ...
- 开源项目推荐:OpenGL之gult/freeglut/glew/glfw/glad的联系与区别
本篇内容主要参考了文章:OpenGL+VS2017 环境配置(亲测好使)::附带必要知识点_FuXiii的博客-CSDN博客_vs2017环境配置,但是经过本人局部修改,并添加了个人见解. 1.Ope ...
- OpenGL之gult/freeglut/glew/glfw/glad的联系与区别
转 https://blog.csdn.net/libaineu2004/article/details/105879521 转 https://blog.csdn.net/qq_40565033/a ...
- OpenGL - 如何理解 VAO 与 VBO 之间的关系
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGL LearnOpenGL 笔记 - 入门 02 创建窗口 LearnOpenGL 笔记 - 入门 03 你好,窗口 LearnO ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- 《纯技术分析阿里云OS和Android之间的关系》补充
前面一份投稿的错误很抱歉,rom本身就找错了,用了一个AOSP-like的刷机包.好在这份内容错误的投稿多少起到了抛砖引玉的作用,当天晚上,就给出了正确的rom的分析<纯技术分析阿里云OS和An ...
- 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...
最新文章
- ZEGO即构科技携小程序连麦直播方案亮相GMIC
- 软件定义闪存存储系统关键技术
- Qt Creator 代码自动补全设置
- mysql ef 随机排序_EFCore+Mysql倉儲層建設(分頁、多字段排序、部分字段更新)
- TensorFlow 常见API
- 【jeecg移动开发能力】Jeecg 重磅来袭,强大移动报表配置能力,一次配置七种展现风格
- MyBatis框架 动态SQL
- 【Java】字符串String操作
- 设计模式原则之五:里氏置换原则
- 【项目管理一点通】(48) 项目结项
- ArduinoUNO-IRremote 红外线接收模块使用(还没写完)
- 鲁大师电脑硬件兼容性测试软件,用鲁大师检测软件检测电脑硬件行得通吗?
- 苹果 服务通知 V2
- SwiftUI接入穿山甲开屏广告
- 直接杀向3G市场!华为两款新手机曝光
- Linus Torvalds 在 22 号宣布Linux 5.18发布
- 医用IT隔离电源在医院特殊场所接地系统的应用
- 8.1 标量、向量、矩阵和张量
- Java Web前后端分离项目—后端servlet实例
- e339 java_java-在Spring Mongo中从文档数组中删除项目