最近查考的资源较多,列几个主要出处:
参考: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. 代码中的关键适配点
这个是重中之重的点,代码关键适配点:
- Mac上的重要适配点是:要让opengl运行在兼容3.2核心的版本上,否则会使用较老的版本,影响shader的编译使用。
变动代码:
glutInitDisplayMode函数参数中添加一项:
glutInitDisplayMode(GLUT_RGBA|GLUT_3_2_CORE_PROFILE);
这两行对于Mac下是不适用的,删除掉:
glutInitContextVersion(4, 3)
glutInitContextProfile(GLUT_CORE_PROFILE);
-
头文件的包含
把除了第2/3节中提到的文件之外的项目文件依赖去除,对去除对vgl.h,gl3w.h这些文件的包含,换成OpenGL/GLUT的头文件。 -
triangles.vert/triangles.frag的版本号不能高于410,修改为400即可
#version 400 core -
一个容易出错的点
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)