GLFW+GLAD OpenGL Mac开发环境搭建
时间:2019-08-24
本文章向大家介绍GLFW+GLAD OpenGL Mac开发环境搭建,主要包括GLFW+GLAD OpenGL Mac开发环境搭建使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
- OpenGL 是什么?The Industry Standard for High Performance Graphics 这是官方解释。说白了他就是一套标准接口。对,是接口,并没有实现具体的代码。
- GLFW 是什么?基于上面的原因,也就清楚了,GLFW就是一种OpenGL的实现。所以开发OpenGL,就可以使用GLFW
- GLAD 是什么?也是由于OpenGL是由各个公司自己实现的方案,所以各个实现的细节不一致。因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。GLAD可以屏蔽平台之间API的差异。我感觉类似Java的虚拟机的角色。
GLFW安装
编译安装
- 从官网下载源代码包:http://www.glfw.org/download.html 我是直接从github下载的(https://github.com/glfw/glfw)
- 编译
cd glfw-master cmake . # 默认是编译静态库,如果要编译动态库则 cmake -DBUILD_SHARED_LIBS=ON . make make install
最后会看到,说明编译安装成功。
Install the project... -- Install configuration: "" -- Installing: /usr/local/include/GLFW -- Installing: /usr/local/include/GLFW/glfw3.h -- Installing: /usr/local/include/GLFW/glfw3native.h -- Installing: /usr/local/lib/cmake/glfw3/glfw3Config.cmake -- Installing: /usr/local/lib/cmake/glfw3/glfw3ConfigVersion.cmake -- Installing: /usr/local/lib/cmake/glfw3/glfw3Targets.cmake -- Installing: /usr/local/lib/cmake/glfw3/glfw3Targets-noconfig.cmake -- Installing: /usr/local/lib/pkgconfig/glfw3.pc -- Installing: /usr/local/lib/libglfw3.a
配置Xcode
在mac上默认开发工具是xcdoe,所以下面展示下xcode的配置。理论上,GLFW的使用跟IDE是无关的,所以其他IDE应该也是可以配置的。
-
配置项目的Build Settings:
-
Other Linker Flags 为
-lgfw3
-
Library Search Paths 的 Debug 和 Release 分别加上
/usr/local/lib/
-
Header Search Paths 加上
/usr/local/include/
-
-
添加库,打开项目的Build Phases
在 Link Binary With Libraries 中添加:
-
Cocoa
-
OpenGL
-
IOKit
-
CoreVideo
-
到此GLFW的开发环境已经配置完毕,可以开始OpenGL的开发了。
GLAD 配置
在线配置
选3.3版本,generate就可以。
如上图,把glad解压以后,把include里面的2个文件夹放入/usr/local/include 下面。
// // main.m // GlfwDemo // // Created by banma-087 on 2019/8/21. // Copyright © 2019 Deman. All rights reserved. // #include <glad/glad.h> #include <GLFW/glfw3.h> #include <stdio.h> #include <stdlib.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window,int width,int height); void processInput(GLFWwindow* window); int main(int argc, const char * argv[]) { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X #endif GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); if(window == NULL){ std::cout << "fail to create window" <<std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ std::cout << "Failed to initialize GLAD" << std::endl; return -1; } glViewport(0,0,800,600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); while (!glfwWindowShouldClose(window)) { processInput(window); glClearColor(0.2f,0.3f,0.3f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } void framebuffer_size_callback(GLFWwindow* window,int width,int height){ glViewport(0,0,width,height); } void processInput(GLFWwindow* window){ if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){ glfwSetWindowShouldClose(window, true); } }
这个时候,我们通过上述代码,生成一个页面。
效果如下:
至此,整个OpenGL的环境配置完成了。
参考:
https://www.glfw.org/docs/latest/quick.html
原文地址:https://www.cnblogs.com/deman/p/11398259.html
- MRTG FOR WINDOWS 安装指南
- 几种常见复合sql查询语句的linq写法[继续补充中]
- [原创]在msmq3.0中使用http协议发送消息
- 微信小程序开发探索之路
- 前端周记 2017 年终总结
- asp.net mvc中的路径选择
- MVC中实现加载更多
- 在ASP.NET MVC 中获取当前URL、controller、action
- [转自Scott]ASP.NET MVC框架(第四部分): 处理表单编辑和提交场景
- MVC前台Post/Get异步获得数据时参数的取值问题
- IQueryable与foreach的困惑?
- ModalPopupExtender用法示例
- MVC中局部视图的使用
- MVC发布后项目存在于根目录中的子目录中时的css与js、图片路径问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AtomicIntegerFieldUpdater源码解析
- “终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
- 一些PHP选项参数相关的函数
- 【Flutter 专题】98 易忽略的【小而巧】的技术点汇总 (六)
- PHP脚本设置及获取进程名
- GlasgowSmile-v2通关笔记
- R语言实现输出文本的多样式
- 学习|Unity3d的导航实现循环线路移动
- 【redis】闲得无聊,来聊聊当下爆火的 redis集群,顺便搭一个玩玩呗
- 【redis入门】Centos下安装redis
- LeetCode精选好题(五)
- 【leetcode两题选手】MySQL类题目(一)
- 【LeetCode每日一题】(8.11)被围绕的区域
- 二叉树的前中后序遍历(迭代法)(带动画)
- 【LeetCode两题选手】算法类题目(8.8)