参考:OpenGL编程指南第8版(红宝书)
参考:https://github.com/badousuan/openGLredBook9th
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

使用Mac环境:Mojave 10.14

1. 背景介绍:

OpenGL编程指南中的例子有许多,在使用的时候,可以从书中对应的官网下载例程,下载编译&构建使用。
官网对应的地址:http://opengl-redbook.com/ 官网中放的有例程所在的git地址和提供zip包下载。

不过对于Mac电脑来说,下载下来的包却不完全能匹配上,主要有两个原因:

  1. Mac系统中的OpenGL版本是4.1版本,而对应的例程是OpenGL version 4.5版本的。
  2. CMakeLists.txt中的配置主要针对win32和linux等进行配置的,而mac和linux并不相同,使用linux的配置有一定的问题。

2. 研究探索

首先参考安装了cmake(glew/glfw/freeglut这几个不需要安装)
https://blog.csdn.net/chunyexiyu/article/details/89063590
之后就是不断的发现并处理错误。

编译构建顺序是,进入目录后通过cmake创建makefile,然后执行make
cmake .
make
也可指定单独make某个例子
make 01-triangles

遇到的问题有:

a. fatal error: #include <GL/gl.h>

这个问题的原因是在MacOS中,OpenGL的目录是Framework的名称OpenGL,和Linux不同,需要手动修改头文件。
方法一:
替换./include/LoadShaders.h中的 GL/gl.h 为 OpenGL/gl.h
方法二:
从系统中找出gl.h,放入到./include/GL/中
例如这个位置:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers/gl.h

方法三:
在include/GL目录中新建一个gl.h,内容为

#include “OpenGL/gl.h”

b. error goto: jump bypasses variable

jump bypasses variable,goto跳转时,把同级变量的定义初始化跳过去了(同级:在同一层{}内)
处理这个问题的方法也有两个:
方法一:在makefile中添加编译选项,把该错误注释掉—这种方法我暂未去查找使用,对编译选项感兴趣的可以去查查用哪个编译选项。
方法二:把下面的变量定义初始化等处理放入{}内,从而让它们不位于同一层次。

例如这个错误对应的文件vdds.cpp中,把goto以下变量初始化部分大括号括起来—从line605-644行。

c. error timeval: forward declaration of timeval

timeval相当于未定义,解决方法,添加定义
vapp.h中添加
#include <sys/time.h>

d. error: memset/memcpy

未包含定义,添加定义
lib/vbm.cpp, src/10-fur/10-fur.cpp中添加
#include

e. ld: library not found for -lGL

链接含库文件时,使用-lGL有问题:这是因为在Mac中,对于OpenGL采用的是framework的包含形式,包含的语句应该采用 -framework OpenGL
修改文件CMakeLists.txt第25行,修改为

elseif (UNIX)if (APPLE)set(COMMON_LIBS vermilion ${OPENGL_LIBRARIES} glfw ${GLFW_LIBRARIES} stdc++ "-framework OpenGL")else()set(COMMON_LIBS vermilion ${OPENGL_LIBRARIES} glfw ${GLFW_LIBRARIES} GL rt dl) endif()

f. error std::sqrt

sqrt未定义,添加定义
在include/mat.h添加
#include

g. error: #version 430 core\n

这个问题的原因是在于这一行未能和上面的标示符号连接起来导致的,把
#version 430往前挪一行即可
在 src/12-particlesimulator/12-particlesimulator.cpp 行113,修改为
STRINGIZE(#version 430 core\n

h. 运行时报错:Segmentation fault: 11

其中一个例子:
make 01-triangles 构建出了文件./bin/01-triangles_d
执行时报错:
Segmentation fault: 11
查看崩溃报告能看出崩溃在01-triangles.cpp:37

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   ???                             000000000000000000 0 + 0
1   01-triangles_d                  0x000000010e6bfcea init() + 186 (01-triangles.cpp:37)
2   01-triangles_d                  0x000000010e6bff90 main + 96 (01-triangles.cpp:98)
3   libdyld.dylib                   0x00007fff76e48ed9 start + 1

而这一行的代码是:
glCreateBuffers( NumBuffers, Buffers );
崩溃原因是这一行的函数为空指针,glCreateBuffers为OpenGL4.5版本新加的函数,所以在4.1版本下不存在的。
修改方法,使用glGenBuffers来替换glCreateBuffers。还有函数glBufferStorage修改为glBufferData,第四个参数修改为GL_STATIC_DRAW。

类似的函数可以通过在gl3wInit–>get_proc打点找出来所有加载失败的函数,共有206个:
glDrawArraysInstancedBaseInstance, glDrawElementsInstancedBaseInstance, glDrawElementsInstancedBaseVertexBaseInstance, glGetActiveAtomicCounterBufferiv, glBindImageTexture, glMemoryBarrier, glDrawTransformFeedbackInstanced, glDrawTransformFeedbackStreamInstanced, glClearBufferData, glClearBufferSubData, glDispatchCompute, glDispatchComputeIndirect, glCopyImageSubData, glFramebufferParameteri, glGetFramebufferParameteriv, glGetInternalformati64v, glInvalidateTexSubImage, glInvalidateTexImage, glInvalidateBufferSubData, glInvalidateBufferData, glInvalidateFramebuffer, glInvalidateSubFramebuffer, glMultiDrawArraysIndirect, glMultiDrawElementsIndirect, glGetProgramInterfaceiv, glGetProgramResourceIndex, glGetProgramResourceName, glGetProgramResourceiv, glGetProgramResourceLocation, glGetProgramResourceLocationIndex, glShaderStorageBlockBinding, glTexBufferRange, glTexStorage2DMultisample, glTexStorage3DMultisample, glTextureView, glBindVertexBuffer, glVertexAttribFormat, glVertexAttribIFormat, glVertexAttribLFormat, glVertexAttribBinding, glVertexBindingDivisor, glDebugMessageControl, glDebugMessageInsert, glDebugMessageCallback, glGetDebugMessageLog, glPushDebugGroup, glPopDebugGroup, glObjectLabel, glGetObjectLabel, glObjectPtrLabel, glGetObjectPtrLabel, glBufferStorage, glClearTexImage, glClearTexSubImage, glBindBuffersBase, glBindBuffersRange, glBindTextures, glBindSamplers, glBindImageTextures, glBindVertexBuffers, glClipControl, glCreateTransformFeedbacks, glTransformFeedbackBufferBase, glTransformFeedbackBufferRange, glGetTransformFeedbackiv, glGetTransformFeedbacki_v, glGetTransformFeedbacki64_v, glCreateBuffers, glNamedBufferStorage, glNamedBufferData, glNamedBufferSubData, glCopyNamedBufferSubData, glClearNamedBufferData, glClearNamedBufferSubData, glMapNamedBuffer, glMapNamedBufferRange, glUnmapNamedBuffer, glFlushMappedNamedBufferRange, glGetNamedBufferParameteriv, glGetNamedBufferParameteri64v, glGetNamedBufferPointerv, glGetNamedBufferSubData, glCreateFramebuffers, glNamedFramebufferRenderbuffer, glNamedFramebufferParameteri, glNamedFramebufferTexture, glNamedFramebufferTextureLayer, glNamedFramebufferDrawBuffer, glNamedFramebufferDrawBuffers, glNamedFramebufferReadBuffer, glInvalidateNamedFramebufferData, glInvalidateNamedFramebufferSubData, glClearNamedFramebufferiv, glClearNamedFramebufferuiv, glClearNamedFramebufferfv, glClearNamedFramebufferfi, glBlitNamedFramebuffer, glCheckNamedFramebufferStatus, glGetNamedFramebufferParameteriv, glGetNamedFramebufferAttachmentParameteriv, glCreateRenderbuffers, glNamedRenderbufferStorage, glNamedRenderbufferStorageMultisample, glGetNamedRenderbufferParameteriv, glCreateTextures, glTextureBuffer, glTextureBufferRange, glTextureStorage1D, glTextureStorage2D, glTextureStorage3D, glTextureStorage2DMultisample, glTextureStorage3DMultisample, glTextureSubImage1D, glTextureSubImage2D, glTextureSubImage3D, glCompressedTextureSubImage1D, glCompressedTextureSubImage2D, glCompressedTextureSubImage3D, glCopyTextureSubImage1D, glCopyTextureSubImage2D, glCopyTextureSubImage3D, glTextureParameterf, glTextureParameterfv, glTextureParameteri, glTextureParameterIiv, glTextureParameterIuiv, glTextureParameteriv, glGenerateTextureMipmap, glBindTextureUnit, glGetTextureImage, glGetCompressedTextureImage, glGetTextureLevelParameterfv, glGetTextureLevelParameteriv, glGetTextureParameterfv, glGetTextureParameterIiv, glGetTextureParameterIuiv, glGetTextureParameteriv, glCreateVertexArrays, glDisableVertexArrayAttrib, glEnableVertexArrayAttrib, glVertexArrayElementBuffer, glVertexArrayVertexBuffer, glVertexArrayVertexBuffers, glVertexArrayAttribBinding, glVertexArrayAttribFormat, glVertexArrayAttribIFormat, glVertexArrayAttribLFormat, glVertexArrayBindingDivisor, glGetVertexArrayiv, glGetVertexArrayIndexediv, glGetVertexArrayIndexed64iv, glCreateSamplers, glCreateProgramPipelines, glCreateQueries, glGetQueryBufferObjecti64v, glGetQueryBufferObjectiv, glGetQueryBufferObjectui64v, glGetQueryBufferObjectuiv, glMemoryBarrierByRegion, glGetTextureSubImage, glGetCompressedTextureSubImage, glGetGraphicsResetStatus, glGetnCompressedTexImage, glGetnTexImage, glGetnUniformdv, glGetnUniformfv, glGetnUniformiv, glGetnUniformuiv, glReadnPixels, glTextureBarrier, glGetTextureHandleARB, glGetTextureSamplerHandleARB, glMakeTextureHandleResidentARB, glMakeTextureHandleNonResidentARB, glGetImageHandleARB, glMakeImageHandleResidentARB, glMakeImageHandleNonResidentARB, glUniformHandleui64ARB, glUniformHandleui64vARB, glProgramUniformHandleui64ARB, glProgramUniformHandleui64vARB, glIsTextureHandleResidentARB, glIsImageHandleResidentARB, glVertexAttribL1ui64ARB, glVertexAttribL1ui64vARB, glGetVertexAttribLui64vARB, glCreateSyncFromCLeventARB, glDispatchComputeGroupSizeARB, glDebugMessageControlARB, glDebugMessageInsertARB, glDebugMessageCallbackARB, glGetDebugMessageLogARB, glMultiDrawArraysIndirectCountARB, glMultiDrawElementsIndirectCountARB, glGetGraphicsResetStatusARB, glGetnTexImageARB, glReadnPixelsARB, glGetnCompressedTexImageARB, glGetnUniformfvARB, glGetnUniformivARB, glGetnUniformuivARB, glGetnUniformdvARB, glBufferPageCommitmentARB, glNamedBufferPageCommitmentEXT, glNamedBufferPageCommitmentARB

k. 运行时未报错,但屏幕不显示图形

例如运行
./01-triangles_d

  1. 首先,需要在bin目录下运行,因为依赖的shader位于media目录下,且使用的相对路径
  2. 其次,shader的版本需要在410以下,而./media/shaders/triangles/triangles.frag版本写的是450,需要修改为410或400
  3. 最后,代码中也需要稍作修改,在main函数中的glfwInit()之后,添加代码glfwWindowHint的几个设置。
    这几个参数用来设置使用内核OpenGL3.2版本的兼容模式,因为在Mac下,缺省版本是低于这个版本的。
    glfwInit();glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

修改后,运行显示的结果:
./01-triangles_d

3. 从Github上下载适配Mac版样例

在Mac电脑上,使用红宝书学习使用OpenGL,大家都不会是第一个,自然的,在github上有做这种修改的同学:
下面的这个地址,就是一个同学对红宝书中的样例源码进行修改,适配Mac环境
https://github.com/badousuan/openGLredBook9th

我试用了,是基本可用的,自己研究的时候,也借鉴了里面的修改方法,建议下载使用。

另外问题都是相通的,如果遇到问题的话,可以参考上面的问题分析来解决。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

Mac上OpenGL红宝书例程环境适配相关推荐

  1. OpenGL红宝书第九版环境配置

    OpenGL红宝书第九版环境配置(VS2017) 对于很多想要学OpenGL的人来说,环境配置一直是一个大问题,笔者就是其中之一.虽然网络上有许多教程,但是由于不同的教程使用的库并不同,利用这些教程配 ...

  2. 关于在vs2013中配置opengl红宝书第八版环境

    转自 http://blog.csdn.net/qq821869798/article/details/45247241 本人刚开始学习opengl,买了一本opengl红宝书第八版, 第一个例子研究 ...

  3. OpenGL红宝书的部分学习记录

    我看的OpenGL红宝书为: <OpenGL编程指南>-- 原书第9版 OpenGL Programming Guide – The Official Guide to Learning ...

  4. VS2012通过makefile编译OpenGL红宝书的示例代码

    通过创建新VC项目,然后设置一堆属性,对于懒人来说还是太复杂了.既然它自带了makefile,可以尝试下使用nmake. 需要注意的是VS2012的安装目录里面已经没有GL的头文件和库文件.这个改动应 ...

  5. OpenGL红宝书:第一个渲染程序Triangles常见问题归总

    OpenGL红宝书第八版从shader开始讲起,其实渲染对大多数人来说都是充满吸引力的,但是程序写起来确实比较麻烦,书上面第一示例程序零零散散也弄了好几天.这里写个博客汇总一下,我觉得对所有初学者都有 ...

  6. 游戏开发计算机图形学杂项知识系列:OpenGL红宝书中第一个渲染程序Triangles常见问题归总

    游戏开发计算机图形学杂项知识系列:OpenGL红宝书中第一个渲染程序Triangles常见问题归总 声明:未经作者允许,严禁商用,转载请标明出处和来源,谢谢 转载自:https://www.cnblo ...

  7. OpenGL红宝书正序解读(一)

    OpenGL红宝书正序解读(一) 第一章:OpenGL简介 第二章:状态管理和绘制几何物体 绘图工具箱 清除窗口 指定颜色 强制完成绘图操作 坐标系统工具箱 描述点.直线.多边形 什么是点.直线.多边 ...

  8. Mac上构建OpenGL红宝书上的triangles程序

    最近查考的资源较多,列几个主要出处: 参考:stackoverflow上的问答 参考:opengl/glut官网文档 参考:github上的源码 参考:apple上对opengl支持的介绍 (Owed ...

  9. OpenGL红宝书8th第一个例子triangles

    年初用Qt涉及过OpenGL,当时只根据Qt自给的库使用,按照Qt给的例子没有出现啥问题,但是最近接触计算机图形学,尝试编译红宝书8th(<OpenGL编程指南>(原书第8版)中文版)第一 ...

最新文章

  1. rtp发送 h265
  2. js 中对象--对象结构(原型链基础解析)
  3. 根据文件路径检测文件大小并检测是否正在被占用
  4. seajs打包部署工具spm的使用总结
  5. sscanf函数和正则表达式
  6. Codeup——问题 H: 部分A+B (15)
  7. 编译AVX代码,升级Redhat 5.5 GCC至4.7.1
  8. 微软将开源查询处理工具Trill,怎么下载部署?
  9. Javascript特效:旋转木马轮播图
  10. 正则表达式 (入门)
  11. CentOS 逻辑卷扩容
  12. IP定位如何揪出SEM、百度竞价的“头号天敌——恶意点击”
  13. 当我开始学微信公众号开发时,我要学什么?
  14. 标准库std::min/std::max与min/max宏冲突
  15. HTML5和CSS3 API文档分享
  16. python动画篮球大小_用Python把蔡徐坤打篮球视频转换成字符动画!
  17. buuctf-AWD-测试1
  18. 番茄助手VA_X的安装
  19. 东风畅行java_东风畅行D1L单桥商用车,在随车吊中有“四”种配置!
  20. [转] FileZilla Server超详细配置

热门文章

  1. java实现登陆ssm框架_SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)
  2. 张驰课堂:初学者参加六西格玛培训可以学到哪些方面的知识
  3. Youtobe前端克隆模板(html + CSS + JavaScript)
  4. matlab将矩阵化为行最简形
  5. [应用方案]ML51单片机通过ADC驱动NTC传感器测量温度
  6. 东北大学20春计算机在线作业,东北大学19春《冶金工程计算机控制与仿真》在线作业123...
  7. CSDN 上传图片取消自动加水印的方法
  8. Unity垂直同步:帧率和刷新率
  9. 整理2010年51单片机程序--4*4按键与数码管显示
  10. visual editor ve1.5下载