GLFW初体验

2023-11-07

GLFW初体验

GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有。猜测F表示for,W表示Window

GLFW是干啥用的?

一个轻量级的,开源的,跨平台的library。支持OpenGL及OpenGL ES,用来管理窗口,读取输入,处理事件等。因为OpenGL没有窗口管理的功能,所以很多热心的人写了工具来支持这些功能,比如早期的glut,现在的freeglut等。那么GLFW有何优势呢?glut太老了,最后一个版本还是90年代的。freeglut完全兼容glut,算是glut的代替品,功能齐全,但是bug太多。稳定性也不好(不是我说的啊),GLFW应运而生。

如何使用GLFW

直接使用库文件

1. 到这里下载编译好的库文件

2. 解压后直接使用即可,详见后面配置。

自行编译源码

如果想提高B格,自行编译的话,可以按如下步骤进行。

1. 到这里下载GLFW

2. 到这里下载CMake

3. 参考这个页面进行编译

配置GLFW编程环境

1. 打开Visual Studio 2012,新建一个Console程序

2. 右键单击project选择properties,打开属性页面

3. 在VC++Directories-Include Directories中写入glfw的头文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/include

4. 在VC++ Directories-Library Directory中写入glfw的库文件目录,我这里是 ../glfw-3.0.4.bin.WIN32/lib-msvc110

5. 在Linker - Input - Additional Dependencies中填入glfw3dll.lib

注意:如果使用静态链接,那么上面第五步中glfw3dll.lib应该换成glfw3.lib,并且在工程属性页面中C/C++ - Code Generation 将 Runtime Library 设置为 /Mt 或者 /Mtd

渲染三角形

配置好环境之后,开始进入正题,总得画点什么吧。 渲染三角形几乎是图形程序中的Hello world。代码如下,框架是从glfw首页copy过来的,绘制三角形的代码是我加上去的。

#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(480, 320, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Draw a triangle */
        glBegin(GL_TRIANGLES);

        glColor3f(1.0, 0.0, 0.0);    // Red
        glVertex3f(0.0, 1.0, 0.0);

        glColor3f(0.0, 1.0, 0.0);    // Green
        glVertex3f(-1.0, -1.0, 0.0);

        glColor3f(0.0, 0.0, 1.0);    // Blue
        glVertex3f(1.0, -1.0, 0.0);

        glEnd();

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

代码很简单,看注释即可,无需多解释。如果一切正常,屏幕上会出现一个窗口,里面有一个五颜六色的三角形。

常见错误及解决办法

使用一个库无非包含三个步骤:

  • 包含头文件
  • 链接库文件
  • 提供运行时dll文件

只要这三个步骤正确了,基本不会出问题。

错误一

1    error C1083: Cannot open include file: 'GLFW/glfw3.h': No such file or directory
2    IntelliSense: cannot open source file "GLFW/glfw3.h"
3    IntelliSense: identifier "GLFWwindow" is undefined
4    IntelliSense: identifier "window" is undefined
5    IntelliSense: identifier "glfwInit" is undefined
6    IntelliSense: identifier "glfwCreateWindow" is undefined
7    IntelliSense: identifier "NULL" is undefined
8    IntelliSense: identifier "glfwTerminate" is undefined
9    IntelliSense: identifier "glfwMakeContextCurrent" is undefined
10    IntelliSense: identifier "glfwWindowShouldClose" is undefined
11    IntelliSense: identifier "glfwSwapBuffers" is undefined
12    IntelliSense: identifier "glfwPollEvents" is undefined
13    IntelliSense: identifier "glfwTerminate" is undefine

这显然是头文件没有找到,导致下面所有glfw相关的类型都找不到定义。需要正确设置头文件的路径,注意只要包含到include目录一级即可,比如\glfw-3.0.4.bin.WIN32\include

错误二

Error    1    error LNK2019: unresolved external symbol _glfwInit referenced in function _main
Error    2    error LNK2019: unresolved external symbol _glfwTerminate referenced in function _main
Error    3    error LNK2019: unresolved external symbol _glfwCreateWindow referenced in function _main
Error    4    error LNK2019: unresolved external symbol _glfwWindowShouldClose referenced in function _main
Error    5    error LNK2019: unresolved external symbol _glfwPollEvents referenced in function _main
Error    6    error LNK2019: unresolved external symbol _glfwMakeContextCurrent referenced in function _main
Error    7    error LNK2019: unresolved external symbol _glfwSwapBuffers referenced in function _main
Error    8    error LNK1120: 7 unresolved externals

这个错误发生在链接阶段,说明是库文件(.lib)文件找不到,需要在项目的属性页面中设置lib文件,在Visual Studio中右键单击Project,选择Properties - Configuration Propterties - Linker - Input - Additional Dependencies,单击右侧的下三角进入编辑页面,将glfw3dll.lib加入其中即可。

注意:gflw提供了不同版本的库文件,如果你使用的是Visual Studio 2012,请使用lib-msvc110下面的库文件,如果是Visual Studio 2013,那么则需要使用lib-msvc120下面的库文件。lib文件有两个,一个是glfw3.lib,一个是glfw3dll.lib,前者是静态链接用的(链接此文件后,运行时无需dll文件,但是程序体积会变大),后者是动态链接用的(配合dll使用),不要搞混。

错误三

dll缺失,如下。

编译链接都没问题,运行时出现这个错误,很简单,使用的是动态链接,但是程序没有找到对应的dll文件,将glfw3.dll复制到程序所在目录即可,一般是Visual Studio的Debug或Release目录。

错误四

Error    1    error LNK2005: _free already defined in LIBCMT.lib(free.obj)
Error    2    error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
Error    4    error LNK1169: one or more multiply defined symbols foun

这是由于VS默认链接了LIBCMT.lib,只要将它禁止即可,在工程属性页面选择Linker - Input - Ignore Specific Library,点击右侧小箭头进行编辑,加入libcmt.lib即可。

==

作者: zdd
出处: http://www.cnblogs.com/graphics/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分类:  OpenGL
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GLFW初体验 的相关文章

  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • WebKit 是否使用 OpenGL 来渲染 CSS 过渡?

    WebKit 是使用 OpenGL 来渲染 CSS 过渡 还是使用软件渲染 WebKit 只是一个前端 这取决于后端和硬件支持 谷歌浏览器使用skia http code google com p skia 作为后端 它可以使用软件或硬件
  • 为什么拥有单独的投影矩阵但结合模型和视图矩阵会有好处?

    当您学习 3D 编程时 您会被告知用 3 个变换矩阵来思考是最简单的 模型矩阵 该矩阵对于每个模型都是独立的 它根据需要旋转和缩放对象 最后将其移动到 3D 世界中的最终位置 模型矩阵将模型坐标转换为世界坐标 视图矩阵 对于大量对象 如果不
  • OpenGL - 两个纹理的幂

    OpenGL 使用二次幂纹理 这是因为由于 MipMapping 某些 GPU 只接受 2 的幂纹理 当绘制比实际更大的纹理时 使用这些二次方纹理会导致问题 我想到了一种方法来解决这个问题 即仅在我们使纹理小于实际大小时使用 PO2 比率
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 使用 GLSL 直接在着色器中从位置计算平移矩阵

    我正在开发 C OpengL 程序以及 GLSL 顶点和片段着色器 我正在创建同一对象的多个实例 我只需要改变实例之间的对象位置 这是我所做的 我正在使用一个统一变量 它是一个变换矩阵数组 每个矩阵代表一个对象实例 MVP 也是一个变换矩阵
  • 用于新 Windows 游戏项目的 OpenGL 或 Direct3D?或者是其他东西?

    我正在 Windows 上启动一个爱好游戏项目 该项目将大量使用 3D 图形效果 它很可能是用 C 编写的 我应该使用 OpenGL 还是 Direct3D 作为我的图形后端 为什么 或者我应该使用现成的图形引擎 例如OGRE 3D htt
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • LWJGL3:重载的 glBufferData 方法

    我正在使用 LWJGL 调用 OpenGL 函数 方法org lwjgl opengl GL15 glBufferData http javadoc lwjgl org org lwjgl opengl GL15 html glBuffer
  • 重新创建窗口而不破坏上下文

    这个问题是关于使用 OpenGL 的图形应用程序 当时我正在使用 GLFW 框架 但我考虑更改它 我的目标是让用户 尽可能 在全屏模式和窗口模式之间不断切换 此过程应该花费不到一秒的时间 并且可以在运行时发生 例如 看看游戏 我的世界 用户
  • 如何在不使用 Kinect SDK 函数的情况下将深度空间中的点转换为 Kinect 中的颜色空间?

    我正在做一个增强现实应用程序 将 3D 对象叠加在用户的彩色视频之上 使用 Kinect 1 7 版本 虚拟对象的渲染在 OpenGL 中完成 我已经成功地在深度视频上叠加了 3D 对象 只需使用 NuiSensor h 标头中深度相机的固
  • OpenGL:顶点越多,性能越慢

    我正在开发一个程序的一部分 其中给定 xyz 坐标集合 制作 3D 模型 我已经完成了这张图片所需的所有功能 即平移 旋转 缩放 但是给出的 xyz 坐标越多 程序运行速度就越慢 我的程序在处理 29 000 个坐标时运行得非常流畅 但当我
  • 如何使用现代 OpenGL 在透视投影中绘制对象的正交轴? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有带有透视投影的 3D 场景 我还可以选择场景中的一个对象 我需要为选定的对象绘制轴 问题是轴不会在透视投影中保存其大小 如果物体远离眼睛
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和

随机推荐

  • JAVA中的异常

    一 异常的分类 这是从jdk AP里简单摘出来 java中关于Exception和ERROR的一个关系 可以看出他们都来自于同一个父类Throwable Error java中的Error是比较严重的问题 非程序本身的问题 一般都是虚拟机相
  • Python tkinter Misc类+Wm类详解

    Misc类 这个类是模块中最基本的类 所有组件甚至是Tk都继承这个类 不过 组件并不直接继承这个类 而是继承Widget类 Widget类直接继承BaseWidget类 而BaseWidget类直接继承Misc 比较特殊的Toplevel继
  • 计算机二级高级应用教材,全国计算机等级考试教程 二级MS Office高级应用(教材)...

    全国计算机等级考试教程 二级MS Office高级应用 教材 依据教育部考试中心新颁布的全国计算机等级考试二级MS Office高级应用的考试大纲进行编写 全国计算机等级考试教程 二级MS Office高级应用 教材 以考点为主线 以 理论
  • Citesapace作图结果部分——文章整体思路简单分析

    Citespace相关论文 除了引言部分 一般从第二部分开始结合citespace作图软件进行分析 以下做一个该部分简要的概括 2 Materials and Methods 数据检索部分一般分为两部分 2 1 Data Collectio
  • 解决Python中的循环引用和内存泄漏问题

    在Python编程中 循环引用和内存泄漏是两个常见的问题 本文将详细介绍如何识别和解决这些问题 并提供详细的代码示例 1 什么是循环引用 循环引用是指两个或多个对象之间相互引用的情况 这种情况可能导致内存泄漏 因为Python的垃圾回收机制
  • 数据治理体系建设

    01 数据治理建设路径 1 业务数字化的目的是打造一体化的业务流 信息流与数据流 从企业整体经营管理的角度 战略制定及分解 领域业务目标制定 业务方案设计 业务需求识别 信息系统功能及数据库设计 数据汇聚及分析 业务目标监测及改善 这个过程
  • 图片在网页能打开,小程序上不显示的解决方法

    这种情况可能是图片被小程序自动加上了防盗链 导致显示不出来 解决方案 1 在img标签是上加属性 referrerPolicy no referrer
  • 使用VS Code打造Python编程与Markdown写作利器,打破知乎、WordPress和微信公众号的壁垒

    目录 1 前言 2 安装与环境搭建 2 1 VS Code安装 2 2 VS Code常用快捷键 2 3 打造Python编辑器 2 4 打造Markdown编辑器 3 一些技巧 3 1 更舒适的Python编程环境 3 2 Markdow
  • oracle数据库中选择桌面类和服务器类的区别

    在以前的学习过程中 一直用到的都是sql server数据库 之后接触到了oracle数据库 在安装过程中 有两个选项 桌面类和服务器类 当时按照网上的安装步骤 选择了桌面类 后来公司里他们安装都是用的服务器类 后来查了查两者的区别 桌面类
  • 【MyBatis】resultMap和resultType的区别

    mybatis中resultMap和resultType的区别 mybatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型的 而resultMap
  • 使用jira的sprint面板进行敏捷开发——scrum master笔记(待完善)

    一 jira中sprint面板的创建 这个很简单 键入jira后 顶栏处找 面板 查看全部面板 此时页面右上侧有 创建面板 的按钮 点击 选择 创建一个Scrum面板 根据提示填信息到完成即可 二 jira中sprint面板的配置 点击进入
  • 如何清除win7系统中的开机密码

    设置系统的开机密码是很正常的事情 当然 忘记开机密码也是常有的事情 下面的方法是通过PE盘清除win7的卡机密码 首先 看一下我的电脑是有密码的 有密码的机器 二 PE盘的准备 我用的pe是we 这是我用过的最良心的PE环境 关于PE的安装
  • java查找算法:二分查找(两种方式)

    二分查找算法思想 二分查找针对的是一个有序的数据集合也就是数组 这也成为了二分查找的一个重要局限性 查找思想有点类似分治思想 每次都通过跟区间的中间元素对比 将待查找的区间缩小为之前的一半 直到找到要查找的元素 或者区间被缩小为0 一 返回
  • Cocos Creator 3D 梦想再起航!

    在 Cocos 不算长的生命历程中 我们曾多次尝试给开发者带来 3D 游戏的开发能力 2014 年 我们的 3D 团队开辟了 Cocos2d x 对 3D 的支持 至今已孵化出莉莉丝的 剑与家园 腾讯的 乱世王者 这样的超级大作 同时 Co
  • Skywalking web页面空白问题解决

    问题描述 今天微服务报错想用链路id追踪这个服务的流向 发现skywalking页面空白 查看后台进程发现skywalking oap server服务掉了 重启还是不行 tail n500 skywalking oap server lo
  • Python实现飞机大战游戏(后附完整代码文件和素材)

    前言 自学Python的记录 不喜勿喷 本程序的代码是以B站黑马程序员的视频代码为基础 个人加以总结思考 写就的博文 纯属记录自己的学习历程 当初想到要用Python的pygame模块开发飞机大战游戏的时候 顿时就兴奋了 毕竟学以致用是最好
  • 网络自动化运维(NetDevOps)创作者推荐

    前言 随着NetDevOps技术登上了历史舞台 越来越多的从业者开始利用NetDevOps简化网络的运维 并进行了技术分享 将蛋糕越做越大 在这里 仅代表个人对这些无私奉献的网络 运维工程师们表达由衷的敬意 此外 我也想向大家推荐一些我认识
  • 【Java】POJO

    POJO Plain Ordinary Java Object 简单的Java对象 通指没有使用Entity Beans的普通java对象 可以把POJO作为支持业务逻辑的协助类 POJO实质上可理解为简单的实体类 顾名思义 POJO类的作
  • 深夜更新,C语言笔记整理

    C 语言笔记整理 C语言一经出现就以其功能丰富 表达能力强 灵活方便 应用面广等特点迅速在全世界普及和推广 C语言不但执行效率高而且可移植性好 可以用来开发应用软件 驱动 操作系统等 C语言也是其它众多高级语言的鼻祖语言 所以说学习C语言是
  • GLFW初体验

    GLFW初体验 GLFW 很遗憾 没有找到FW的确切含义 Wiki上没有 GLFW主页也没有 猜测F表示for W表示Window GLFW是干啥用的 一个轻量级的 开源的 跨平台的library 支持OpenGL及OpenGL ES 用来