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

最近查考的资源较多,列几个主要出处:
参考:stackoverflow上的问答
参考:opengl/glut官网文档
参考:github上的源码
参考:apple上对opengl支持的介绍
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

最近几天使用Mac做红宝书上的OpenGL程序:
书中程序与Mac匹配不好,但又舍不得放弃Mac下控制台与编译构建的方便,也是痛苦的挣扎了一番。
毕竟Mac上仅能支持的4.1,且Mac上定制的OpenGL framework与其它unix/linux还是不同的。
遇到了许多挫折,有些正确的处理有时又被忽略掉了…
最终,今天终于跑通了,下面记录自己的理解和遇到的问题等。

1. freeglut/glut/glew/gl3w/glfw要用那些?

作用上来区分:
freeglut/glut/glfw:主要都是提供窗口、事件、回调程序、类型简化的支持
glew/gl3w.c: 提供了opengl接口函数的加载包装支持,不过在mac-opengl中已经有opengl函数的加载,不需要使用了。

从上面看出,函数加载这块opengl已经有了,不需要做额外支持,窗口事件这块使用自带的glut很方便,也不需要进行相关的安装—这个是研究了一圈(glfw/glew/gl3w/glut)之后认识到的。

使用Mac上自带glut的方法如下:
Mac上自带的又glut,使用时很简单,头文件包含的方法:

#include <GLUT/glut.h>

链接的时候,添加上-framework GLUT即可

gcc triangles.cpp -framework OpenGL -framework GLUT

2. 使用OpenGL/GLUT那些头文件?

经过实践,在编译triangles过程,除了包含gl.h/glut.h外,还需要包含gl3.h头文件,如果有缺失的话,会部分函数glGenVertexArrays/glBindVertexArray定义无法识别:

#include <OpenGL/gl.h>
#include <OpenGL/gl3.h>
#include <GLUT/glut.h>

3. 编译运行需要的文件和用途

编译需要的文件有:
LoadShaders.h
LoadShaders.cpp
triangles.cpp
运行需要的文件:
triangles.vert
triangles.frag

LoadShaders.h/cpp作用:
定义函数LoadShaders和参数结构,实现加载shader, 编译链接shader源码,创建glProgram,并把shader附加到程序中,把handle返回。

triangles.cpp作用:
主程序:
a. 完成OpenGL绑定窗口的创建
b. 三角形数据的创建(直接使用投影坐标-1.0到1.0范围 )和加载到显卡中
c. 调用shader的加载,并使用shader程序
d. 显示中调用三角形数据的绘制

triangles.vert/frag作用:
着色器程序,着色器的内容非常简单:顶点着色器直接传递投影坐标,片元着色器设置颜色为固定值。

4. 代码中的关键适配点

这个是重中之重的点,代码关键适配点:

  1. Mac上的重要适配点是:要让opengl运行在兼容3.2核心的版本上,否则会使用较老的版本,影响shader的编译使用。
    变动代码:
    glutInitDisplayMode函数参数中添加一项:

glutInitDisplayMode(GLUT_RGBA|GLUT_3_2_CORE_PROFILE);

这两行对于Mac下是不适用的,删除掉:

glutInitContextVersion(4, 3)
glutInitContextProfile(GLUT_CORE_PROFILE);

  1. 头文件的包含
    把除了第2/3节中提到的文件之外的项目文件依赖去除,对去除对vgl.h,gl3w.h这些文件的包含,换成OpenGL/GLUT的头文件。

  2. triangles.vert/triangles.frag的版本号不能高于410,修改为400即可
    #version 400 core

  3. 一个容易出错的点
    glutInitDisplayMode中如果添加了GLUT_DOUBLE,意味着采用了双缓冲,则display函数中的图形刷新要使用函数:
    glutSwapBuffers();
    而不是glFlush();

修改后的main函数和display内容参考:

void display(void)
{
    // set the color when clear screen
    glClearColor (0.2f, 0.2f, 0.4f, 1.0f); 
    // clear screen
    glClear(GL_COLOR_BUFFER_BIT);   
    
    glBindVertexArray(VAOs[Triangles]);
    glDrawArrays(GL_TRIANGLES, 0, NumVertices);

    //glFlush();
    glutSwapBuffers();
}

#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    cout << "start init windows" << endl;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_3_2_CORE_PROFILE);
    glutInitWindowPosition(300, 50);
    glutInitWindowSize(512, 512);
    glutCreateWindow(argv[0]);

    cout << "init vertices" << endl;    
    init();

    cout << "start display" << endl;
    glutDisplayFunc(display);
    glutMainLoop();
}

4. 如何编译和运行

把这些文件放入一个目录triangles中:
LoadShaders.h
LoadShaders.cpp
triangles.cpp
triangles.vert
triangles.frag

编译构建Makefile文件内容:

all : triangles
LDLIBS += -framework OpenGL -framework GLUT
CC = g++
CXX = g++
triangles : LoadShaders.o triangles.o
.PHONY : clean
clean :
	-rm LoadShaders.o triangles.o triangles

编译构建:
triangles目录中添加Makefile文件后,在triangles目录中执行:
make
运行命令:
./triangles

5. 运行效果和下载路径

代码主要修改点就是以上的部分,也上传到了csdn的资源中,有需要的同学可以查找博客同名资源下载参考,注意:这个仅适用与Mac系统中,window和linux都是不适用的。

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值