整理自之前使用的163博客原创文章。

GLSL项目中需要使用GLEW库,因此先要安装GLEW库和在Xcode中配置GLEW。要使GLEW在Xcode中被正确链接,又需要通过MacPorts来安装GLEW。下文以MacPorts-->GLEW-->GLSL的顺序来阐述。
环境:系统 OS X 10.9.2 (13C64),工具 Xcode 5.1,图形卡 Intel Iris 1024 MB

1 MacPorts安装

MacPorts是与apt-get和yum类似的软件管理包,下载与系统对应的安装包后进行安装(安装过程中会联网进行更新,导致安装过程很久,建议断网安装)。安装之后打开终端运行
$ 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下更加游刃有余)

Mac中MacPorts安装和使用

Mac OS X中MacPorts安装和使用

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 ;
}

运行成功后的效果图:

其它参考网址:

【GLSL教程】(四)shder的简单示例

GLSL Tutorial

How to link glew in xcode

【GLSL教程】(二)在OpenGL中使用GLSL

GLSL.Refract & Reflect & Diffraction

MAC OS下使用Xcode进行GLSL编程的配置过程的更多相关文章

  1. mac os 下搭建android开发环境

    mac os 下搭建android开发环境 周银辉 mac os 下搭建android环境比较方便, 如下几个步骤: 1,安装jdk 先搞清楚自己是否已经安装,在命令行下:java -version, ...

  2. mac os 下的sublime --- 快捷键

    mac os 下的sublime ---列模式 http://www.oschina.net/question/249672_161413 触控板也可以的:左手同时按住 Option 和触控板左下角 ...

  3. Mac OS下编写对拍程序

    介绍 对拍是信息学竞赛中重要的技巧,它通过一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序.对拍最大的优势在于可以通过人力所不能及的速度和数量达到验证的效果.下面我们 ...

  4. MAC OS下免费下载YouTube

    YouTube上有很多不错的视频,你感兴趣的视频除了可以加入自己播放列表之外,还可以将其下载到本地收藏起来.推荐这款软件“Xilisoft Download YouTube Video for Mac ...

  5. YII 框架在 MAC OS下 连接数据库失败 提示 DB connection: SQLSTATE[HY000] [2002]

    作者:zccst CDbConnection failed to open the DB connection: SQLSTATE[HY000] [2002] No such file or dire ...

  6. wget Mac OS 下安装

    wget是一个从网络上自动下载文件的自由工具,支持通过HTTP.HTTPS.FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理. 下面介绍如何在Mac OS 下安装Wget 下载最新版的 ...

  7. Mac OS下 Redis2.6.14部署记录

    Mac OS下 Redis2.6.14部署记录 部署一个Redis作为缓存进行验证,记录部署过程. 官网:http://redis.io/,目前最近稳定版为2.6.14  解压,进入目录.按照READ ...

  8. Mac os 下的文件权限管理

    Mac os 下的文件权限管理 命令 ls -l -A 结果 -rw-r--r-- 1 user admin 2326156 4 12 15:24 adb 横线代表空许可.r代表只读,w代表写,x代表 ...

  9. Mac os下安装pycurl

    今天在Mac OS 10.9.2下安装pycurl时候失败,出现以下问题 Using curl-config (libcurl 7.30.0) clang: error: unknown argume ...

随机推荐

  1. Tostring记录,方便自己查看

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  2. sql server 判断是否存在数据库,表,列,视图

    1 判断数据库是否存在if exists (select * from sys.databases where name = '数据库名')    drop database [数据库名] 2 判断表 ...

  3. 'mysql.column_stats' doesn't exist and Table 'mysql.index_stats' doesn't exist

    在生产库MariabDB中修改字段类型,提示如下错误:​Table 'mysql.column_stats' doesn't existTable 'mysql.index_stats' doesn' ...

  4. yum代理设置

    vi /etc/yum.conf 加入以下:proxy=http://代理服务器ip:port 如果代理需要账号密码:proxy_username=userproxy_password=密码

  5. Android HttpClient GET或者POST请求基本使用方法(转)

    在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.这里只介绍如何使用HttpCl ...

  6. 6 让我们的C#程序开始做点数学运算

    请相信我你只需要懂得最基本的数学运算,就可以从事大多数的软件项目的开发工作.千万不要一提编程,就让数学把你吓跑了.大多数的程序开发人员从事的编程工作是应用系统的开发.这些系统的绝大多数功能,只需要最基 ...

  7. .net中运用solr提升搜索效率(入门)

    概述: 在开发网站的时候经常有要对某些内容查询的需求.此时如果基于数据库查询来做搜索功能,由于要对多个字段做模糊匹配,效率往往非常糟糕.这种情况就可以用Solr来提升搜索的效率.Solr是一个独立的企 ...

  8. Entity Framework学习笔记(四)----Linq查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...

  9. cameralink---格式 概要清晰理解

    DS90CR288 和DS90CR286共同组成LVDS收发对, LVDS: 4对数据+1对时钟 TTL: 时钟线1:clk 并行总线共27根: 同步线2:一根场同步,一根行同步 空闲: 1 数据线2 ...

  10. c++ 中static关键字

    static可以用于修饰普通的变量和函数,也可以用于修饰类的成员 普通应用 1.修饰普通变量 修饰全局变量:将变量的作用域限制在所属文件 修饰局部变量:将变量的生存周期延迟到程序结束 2.修饰普通函数 ...