MAC OS下使用Xcode进行GLSL编程的配置过程
整理自之前使用的163博客原创文章。
环境:系统 OS X 10.9.2 (13C64),工具 Xcode 5.1,图形卡 Intel Iris 1024 MB
1 MacPorts安装
- $ sudo port -v selfupdate
- ---> Updating the ports tree
- Synchronizing local ports tree from rsync://rsync.macports.org/release/tarballs/ports.tar
- receiving file list ... done
- ports.tar
使用control+z终止更新,终端输入
- $ sudo vim /opt/local/etc/macports/sources.conf
打开配置文件,更改最后一行的默认下载地址(参考“解决安装macports,不能更新的问题”,参考下载网址列表),如可修改为韩国镜像:
- #rsync://rsync.macports.org/release/tarballs/ports.tar [default]
- #http://www.macports.org/files/ports.tar.gz [default]
- rsync://cjj.kr.rsync.macports.org/macports/release/tarballs/ports.tar
改好后wq保存退出,再次运行
- $ sudo port -v selfupdate
进行更新,更新成功后会显示如下信息:
- ---> MacPorts base is already the latest version
- The ports tree has been updated. To upgrade your installed ports, you should run port upgrade outdated
安装过程中遇到其它问题请戳:
Mac OS X Lion安装MacPorts(让你在Mac的Shell下更加游刃有余)
2 GLEW库安装
glew库主要有如下三种安装方式:1)在Xcode中直接导入framework(下载地址);2)编译glew源代码进行安装(参考“Installing GLEW in Mac OS X (Leopard)”);3)通过MacPorts进行安装。
实测了三种方式,均可成功安装glew库,但前两种方式在Xcode中链接不成功,本文通过MacPorts进行安装(参考“GLEW: Apple Mach-O Linker (Id) Error”)。
终端输入
- $ sudo port install glew
进行安装,安装成功后显示:
- ---> Installing glew @1.10.0_0
- ---> Activating glew @1.10.0_0
- ---> Cleaning glew
- ---> Updating database of binaries: 100.0%
- ---> Scanning binaries for linking errors: 100.0%
- ---> No broken files found.
安装过程中遇到其它问题请戳
cannot link glew under xcode4, macosx lion
3 Xcode中GLSL的配置
Mac系统中已内置openGL、GLUT和GLSL,无需安装。
启动Xcode,新建Cocoa Application工程,删除“TriangleAppDelegate.*”文件、“*main.m”文件和“MainMenu.xib”文件。右键单击"Supporting Files"添加新文件,选择"C++ File"。添加后,删除对应的头文件。右键单击"Frameworks",添加"OpenGL.framework"和"GLUT.framework"(参考“MAC OS X And Win7 vs2010 搭建OpenGL”,参考“在Xcode中使用GLUT开发OpenGL应用程序”)。
下面是添加对GLEW库的链接,在build setting中添加如下参数即可:
- other linker flags: -lGLEW
- header search paths: /opt/local/include/
- library search paths: /opt/local/lib/
4 Hello World
在supporting files下添加basic.vert:
- void main(){
- gl_Position = ftransform();
- }
在supporting files下添加basic.frag:
- void main() {
- gl_FragColor = vec4(0.4,0.4,0.8,1.0);
- }
在supporting files下添加textfile.h:
- #ifndef macGL_textfile_h
- #define macGL_textfile_h
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- char *textFileRead(const char *fn);
- int textFileWrite(char *fn, char *s);
- unsigned char *readDataFromFile(char *fn);
- #endif
在supporting files下添加textfile.cpp:
- #include "textfile.h"
- unsigned char * readDataFromFile(char *fn){
- FILE *fp;
- unsigned char *content = NULL;
- int count=;
- if (fn != NULL) {
- fp = fopen(fn,"rb");
- if (fp != NULL) {
- fseek(fp, , SEEK_END);
- count = ftell(fp);
- rewind(fp);
- if (count > ) {
- content = (unsigned char *)malloc(sizeof(unsigned char) * (count+));
- count = fread(content,sizeof(unsigned char),count,fp);
- content[count] = '\0';
- }
- fclose(fp);
- }
- }
- return content;
- }
- char *textFileRead(const char *fn) {
- FILE *fp;
- char *content = NULL;
- int count=;
- if (fn != NULL) {
- fp = fopen(fn,"rt");
- if (fp != NULL) {
- fseek(fp, , SEEK_END);
- count = ftell(fp);
- rewind(fp);
- if (count > ) {
- content = (char *)malloc(sizeof(char) * (count+));
- count = fread(content,sizeof(char),count,fp);
- content[count] = '\0';
- }
- fclose(fp);
- }
- }
- return content;
- }
- int textFileWrite(char *fn, char *s) {
- FILE *fp;
- int status = ;
- if (fn != NULL){
- fp = fopen(fn,"w");
- if (fp != NULL) {
- if (fwrite(s,sizeof(char),strlen(s),fp) == strlen(s))
- status = ;
- fclose(fp);
- }
- }
- return(status);
- }
在supporting files下添加GLSLTest.cpp。其中display函数中的glutWireTeapot()是glut内置的画茶壶的函数。注意MAC下特有的glBindVertexArrayAPPLE,glBindVertexArrayAPPLE,glGenVertexArraysAPPLE:
- //#pragma comment(lib,"libGLEW.a")
- #include <GL/glew.h>
- #include "textfile.h"
- #include <glut/glut.h>
- #include <iostream>
- using namespace std;
- GLuint vShader,fShader;//顶点着色器对象
- //顶点位置数组
- float positionData[] = {
- -0.8f, -0.8f, 0.0f,
- 0.8f, -0.8f, 0.0f,
- 0.0f, 0.8f, 0.0f };
- //颜色数组
- float colorData[] = {
- 1.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 1.0f };
- GLuint vaoHandle;//vertex array object
- void initShader(const char *VShaderFile,const char *FShaderFile)
- {
- //1、查看GLSL和OpenGL的版本
- const GLubyte *renderer = glGetString( GL_RENDERER );
- const GLubyte *vendor = glGetString( GL_VENDOR );
- const GLubyte *version = glGetString( GL_VERSION );
- const GLubyte *glslVersion =
- glGetString( GL_SHADING_LANGUAGE_VERSION );
- GLint major, minor;
- glGetIntegerv(GL_MAJOR_VERSION, &major);
- glGetIntegerv(GL_MINOR_VERSION, &minor);
- cout << "GL Vendor :" << vendor << endl;
- cout << "GL Renderer : " << renderer << endl;
- cout << "GL Version (string) : " << version << endl;
- cout << "GL Version (integer) : " << major << "." << minor << endl;
- cout << "GLSL Version : " << glslVersion << endl;
- //2、编译着色器
- //创建着色器对象:顶点着色器
- vShader = glCreateShader(GL_VERTEX_SHADER);
- //错误检测
- if ( == vShader)
- {
- cerr << "ERROR : Create vertex shader failed" << endl;
- exit();
- }
- //把着色器源代码和着色器对象相关联
- const GLchar *vShaderCode = textFileRead(VShaderFile);
- const GLchar *vCodeArray[] = {vShaderCode};
- glShaderSource(vShader,,vCodeArray,NULL);
- //编译着色器对象
- glCompileShader(vShader);
- //检查编译是否成功
- GLint compileResult;
- glGetShaderiv(vShader,GL_COMPILE_STATUS,&compileResult);
- if (GL_FALSE == compileResult)
- {
- GLint logLen;
- //得到编译日志长度
- glGetShaderiv(vShader,GL_INFO_LOG_LENGTH,&logLen);
- if (logLen > )
- {
- char *log = (char *)malloc(logLen);
- GLsizei written;
- //得到日志信息并输出
- glGetShaderInfoLog(vShader,logLen,&written,log);
- cerr << "vertex shader compile log : " << endl;
- cerr << log << endl;
- free(log);//释放空间
- }
- }
- //创建着色器对象:片断着色器
- fShader = glCreateShader(GL_FRAGMENT_SHADER);
- //错误检测
- if ( == fShader)
- {
- cerr << "ERROR : Create fragment shader failed" << endl;
- exit();
- }
- //把着色器源代码和着色器对象相关联
- const GLchar *fShaderCode = textFileRead(FShaderFile);
- const GLchar *fCodeArray[] = {fShaderCode};
- glShaderSource(fShader,,fCodeArray,NULL);
- //编译着色器对象
- glCompileShader(fShader);
- //检查编译是否成功
- glGetShaderiv(fShader,GL_COMPILE_STATUS,&compileResult);
- if (GL_FALSE == compileResult)
- {
- GLint logLen;
- //得到编译日志长度
- glGetShaderiv(fShader,GL_INFO_LOG_LENGTH,&logLen);
- if (logLen > )
- {
- char *log = (char *)malloc(logLen);
- GLsizei written;
- //得到日志信息并输出
- glGetShaderInfoLog(fShader,logLen,&written,log);
- cerr << "fragment shader compile log : " << endl;
- cerr << log << endl;
- free(log);//释放空间
- }
- }
- //3、链接着色器对象
- //创建着色器程序
- GLuint programHandle = glCreateProgram();
- if (!programHandle)
- {
- cerr << "ERROR : create program failed" << endl;
- exit();
- }
- //将着色器程序链接到所创建的程序中
- glAttachShader(programHandle,vShader);
- glAttachShader(programHandle,fShader);
- //将这些对象链接成一个可执行程序
- glLinkProgram(programHandle);
- //查询链接的结果
- GLint linkStatus;
- glGetProgramiv(programHandle,GL_LINK_STATUS,&linkStatus);
- if (GL_FALSE == linkStatus)
- {
- cerr << "ERROR : link shader program failed" << endl;
- GLint logLen;
- glGetProgramiv(programHandle,GL_INFO_LOG_LENGTH,
- &logLen);
- if (logLen > )
- {
- char *log = (char *)malloc(logLen);
- GLsizei written;
- glGetProgramInfoLog(programHandle,logLen,
- &written,log);
- cerr << "Program log : " << endl;
- cerr << log << endl;
- }
- }
- else//链接成功,在OpenGL管线中使用渲染程序
- {
- glUseProgram(programHandle);
- }
- }
- void initVBO()
- {
- // Create and populate the buffer objects
- GLuint vboHandles[];
- glGenBuffers(, vboHandles);
- GLuint positionBufferHandle = vboHandles[];
- GLuint colorBufferHandle = vboHandles[];
- //绑定VBO以供使用
- glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
- //加载数据到VBO
- glBufferData(GL_ARRAY_BUFFER, * sizeof(float),
- positionData,GL_STATIC_DRAW);
- //绑定VBO以供使用
- glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
- //加载数据到VBO
- glBufferData(GL_ARRAY_BUFFER, * sizeof(float),
- colorData,GL_STATIC_DRAW);
- glGenVertexArraysAPPLE(,&vaoHandle);
- glBindVertexArrayAPPLE(vaoHandle);
- glEnableVertexAttribArray();//顶点坐标
- glEnableVertexAttribArray();//顶点颜色
- //调用glVertexAttribPointer之前需要进行绑定操作
- glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
- glVertexAttribPointer( , , GL_FLOAT, GL_FALSE, , (GLubyte *)NULL );
- glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
- glVertexAttribPointer( , , GL_FLOAT, GL_FALSE, , (GLubyte *)NULL );
- }
- void init()
- {
- //初始化glew扩展库
- GLenum err = glewInit();
- if( GLEW_OK != err )
- {
- cout <<"Error initializing GLEW: " << glewGetErrorString(err) << endl;
- }
- initShader("basic.vert","basic.frag");
- initVBO();
- glClearColor(0.0,0.0,0.0,0.0);
- //glShadeModel(GL_SMOOTH);
- }
- void display()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- ////绘制一个三角形(使用普通方法)
- //glBegin(GL_TRIANGLES);
- //glColor3f(0.0f,1.0f,0.0f);
- //glVertex3f(0.0f,1.0f,0.0f);
- //glColor3f(0.0f,1.0f,0.0f);
- //glVertex3f(-1.0f,-1.0f,0.0f);
- //glColor3f(0.0f,0.0f,1.0f);
- //glVertex3f(1.0f,-1.0f,0.0f);
- //glEnd();
- //使用VAO、VBO绘制
- glBindVertexArrayAPPLE(vaoHandle);
- //glDrawArrays(GL_TRIANGLES,0,3);
- glutWireTeapot(0.5);
- GLint tiz = glGetUniformLocation(vaoHandle, "iz");
- glUniform1iARB(tiz, );
- glBindVertexArrayAPPLE();
- glutWireTeapot(1.0);
- glutSwapBuffers();
- }
- void keyboard(unsigned char key,int x,int y)
- {
- switch(key)
- {
- case :
- glDeleteShader(vShader);
- glUseProgram();
- break;
- }
- }
- int main(int argc,char** argv)
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize(,);
- glutInitWindowPosition(,);
- glutCreateWindow("GLSL Test : Draw a triangle");
- init();
- glutDisplayFunc(display);
- glutKeyboardFunc(keyboard);
- glutMainLoop();
- return ;
- }
运行成功后的效果图:
其它参考网址:
MAC OS下使用Xcode进行GLSL编程的配置过程的更多相关文章
- mac os 下搭建android开发环境
mac os 下搭建android开发环境 周银辉 mac os 下搭建android环境比较方便, 如下几个步骤: 1,安装jdk 先搞清楚自己是否已经安装,在命令行下:java -version, ...
- mac os 下的sublime --- 快捷键
mac os 下的sublime ---列模式 http://www.oschina.net/question/249672_161413 触控板也可以的:左手同时按住 Option 和触控板左下角 ...
- Mac OS下编写对拍程序
介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...
- MAC OS下免费下载YouTube
YouTube上有很多不错的视频,你感兴趣的视频除了可以加入自己播放列表之外,还可以将其下载到本地收藏起来.推荐这款软件“Xilisoft Download YouTube Video for Mac ...
- YII 框架在 MAC OS下 连接数据库失败 提示 DB connection: SQLSTATE[HY000] [2002]
作者:zccst CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] No such file or dire ...
- wget Mac OS 下安装
wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...
- Mac OS下 Redis2.6.14部署记录
Mac OS下 Redis2.6.14部署记录 部署一个Redis作为缓存进行验证,记录部署过程. 官网:http://redis.io/,目前最近稳定版为2.6.14 解压,进入目录.按照READ ...
- Mac os 下的文件权限管理
Mac os 下的文件权限管理 命令 ls -l -A 结果 -rw-r--r-- 1 user admin 2326156 4 12 15:24 adb 横线代表空许可.r代表只读,w代表写,x代表 ...
- Mac os下安装pycurl
今天在Mac OS 10.9.2下安装pycurl时候失败,出现以下问题 Using curl-config (libcurl 7.30.0) clang: error: unknown argume ...
随机推荐
- 002-python基础-hello-world
python hello.py 时,明确的指出 hello.py 脚本由 python 解释器来执行. 如果想要类似于执行shell脚本一样执行python脚本,例: ./hello.py ,那么就需 ...
- GRE协议学习与练习
通用路由封装(英语:Generic Routing Encapsulation,缩写为GRE),一种隧道协议,可以在虚拟点对点链路中封装多种网络层协议.由思科系统开发 以下是GRE协议的简单练习 网络 ...
- QTP获取系统时间并自定义格式
function GetDateTime(Nowstr) Dim Currentdatetime Dim YY 'Year Dim MM ...
- 找到一个学习bootstrap的好网站
http://www.w3cschool.cc/bootstrap/bootstrap-css-overview.html
- Mac下如何显示隐藏文件/文件夹_百度经验
在应用程序里打开终端, cd 你的文件夹名 ls -a 即可显示该文件夹下的所有隐藏文件 如果你想打开整个系统的隐藏文件可以在终端下输入以下命令: defaults write com.apple ...
- IOS内存管理「4」- ARC 和垃圾回收机制的基本概念
- layoutSubviews 浅尝
layoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机: 1.init初始化不会触发layoutSubviews 2 ...
- 基于.net mvc的校友录(源程序)
废话不多说,上程序再说: http://pan.baidu.com/s/11MnLo 我.net mvc4的正式学习时长,其实也就一个多月,期间除去玩游戏.听歌.谈恋爱,也就半个月,大神请轻喷~~ 转 ...
- 格式化输出[parts/iomanip]
/* 用ios类中的成员函数来进行IO格式的控制总需要写一条单独的语句,而不能直接嵌入到IO语句中,显得很不方便,因此C++又提供了一种用操作符来控制IO的格式.操作符分为带参和不带参两种,带参的定义 ...
- 老叶观点:MySQL开发规范之我见
来源:http://ourmysql.com/archives/1396 大多数MySQL规范在网上也都能找得到相关的分享,在这里要分享的是老叶个人认为比较重要的,或者容易被忽视的,以及容易被混淆的一 ...