Mac openGL 的 环境搭建

Mac版本:11.5.2

Xcode:Version 13.0 beta 5 

准备工作:

  • 下载Xcode
  • 没了!

开始配置openGL环境:

打开Xcode,新建一个project 

新建一个macOS项目,选择Command Line Tool

 随意取名(这里因为是学校一个画茶壶的代码,我就teapot了)

之后找到teaPot --> TARGETS -->  Build Phases --> Link Binery With Libraries 打开

点左下角的加号,搜索 OpenGL.framework 和 GLUT.framework 并添加

由于默认生成的main函数是.frame文件,而我想用的是c++,因此把这个main文件删除再新建c++文件 (!一定要删掉 两个main函数就会一直报错)

 右击teaPot文件夹 --> New file... --> 选择c++文件 新建文件并取名为main

 将老师给的代码复制入main

/*
 The iterated function system fern.
 
 Source file to be used with
 Cunningham, Computer Graphics: Programming in OpenGL for Visual Communication, Prentice-Hall, 2007
 
 Intended for class use only
 */
#define GLUT_DISABLE_ATEXIT_HACK

#include <stdlib.h>
#include <stdio.h> 
#include <math.h>
#include <time.h>
#include <GLUT/glut.h>



//∂®“ ‰≥ˆ¥∞ø⁄µƒ¥Û–°
#define WINDOW_HEIGHT 300
#define WINDOW_WIDTH 500

GLenum  G_shadingMode;    //«–ªª¡Ω÷÷√˜∞µƒ£ Ω

//…„œÒª˙¿ÎŒÔõƒæ‡¿Î
float G_fDistance = 3.6f;
//ŒÔõƒ–˝◊™Ω«∂»
float G_fAngle_horizon = 0.0;
float G_fAngle_vertical = 0.0f;


//π‚’’≤Œ ˝
float G_vLit0Position[4] = { 5.0f, 0.0f, 5.0f, 1.0f };
float G_vLit0Ambient[4] = { 0.8f, 0.8f, 0.8f, 1.0f };
float G_vLit0Diffuse[4] = { 0.8f, 0.8f, 0.8f, 1.0f };
float G_vLit0Specular[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
float G_vMaterialSpecu[4] = { 0.8f, 0.8f, 0.8f, 1.0f };

float G_vLit1Position[4] = { 0.0f, 0.0f, 0.0f, 1.0f };


void myinit(void);
void myReshape(GLsizei w, GLsizei h);
void display(void);

//œÏ”¶º¸≈à‰»Î, ¥”∂¯…Ë∂®ŒÔÓ∆Ω¸“∆‘∂“‘º∞–˝◊™µƒªÿµ˜∫Ø ˝
void processSpecialKeys(int key, int x, int y);
void processNormalKeys(unsigned char key,int x,int y);



//÷˜∫Ø ˝
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    
    //≥ı ºªØOPENGLœ‘ æ∑Ω Ω
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);
    
    //…Ë∂®OPENGL¥∞ø⁄Œª÷√∫Õ¥Û–°
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    
    //¥Úø™¥∞ø⁄
    glutCreateWindow ("OpenGL");
    printf("…œ°¢œ¬º¸---»∆x÷·–˝◊™\n");
    printf("◊Û°¢”“º¸---»∆y÷·–˝◊™\n");
    printf("a/Aº¸------¿≠Ω¸/Õ∆‘∂\n");
    printf("1/2º¸------Flat/SmoothªÊ÷∆ƒ£ Ω\n");
    
    //µ˜”√≥ı ºªØ∫Ø ˝
    myinit();
    
    //…Ë∂®¥∞ø⁄¥Û–°±‰ªØµƒªÿµ˜∫Ø ˝
    glutReshapeFunc(myReshape);
    
    //…Ë∂®º¸≈Ãøÿ÷∆µƒªÿµ˜∫Ø ˝
    glutSpecialFunc(processSpecialKeys);
    glutKeyboardFunc(processNormalKeys);
    
    //ø™ ºOPENGLµƒ—≠ª∑
    glutDisplayFunc(display);
    //    glutIdleFunc(display);
    
    glutMainLoop();
    
    return 0;
}


//”√ªß≥ı ºªØ∫Ø ˝
void myinit(void)
{
    //your initialization code
    glEnable(GL_DEPTH_TEST);
    
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    
    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT);
    
    //    glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0);    //À´√Êπ‚’’°£≤Ë∫¯µƒ∑®∑ΩœÚ∫√œÒ «∑¥µƒ.
    
    glShadeModel(GL_SMOOTH);
    //    glShadeModel(GL_FLAT);
}

//¥∞ø⁄¥Û–°±‰ªØ ±µƒªÿµ˜∫Ø ˝
void myReshape(GLsizei w, GLsizei h)
{
    //…Ë∂® ”«¯
    glViewport(0, 0, w, h);
    
    //…Ë∂®Õ∏ ”∑Ω Ω
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, 1.0*(GLfloat)w/(GLfloat)h, 1.0, 30.0);
    //    gluPerspective(60.0, 1.0, 1.0, 30.0);
    //  glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 30.0);
}

//√øËÂOpenGL∂ºª·µ˜”√’‚∏ˆ∫Ø ˝£¨”√ªß”¶∏√∞—œ‘ æ¥˙¬Î∑≈‘⁄’‚∏ˆ∫Ø ˝÷–
void display(void)
{
    //…Ë÷√«Â≥˝∆¡ƒªµƒ—’…´£¨≤¢«Â≥˝∆¡ƒª∫Õ…Ó∂»ª∫≥Â
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    //    glClearDepth(0.8f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glShadeModel(G_shadingMode);
    
    
    //…Ë÷√π‚’’
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLightfv(GL_LIGHT0, GL_POSITION, G_vLit0Position);        //…Ë÷√π‚‘¥µƒŒª÷√
    glLightfv(GL_LIGHT0, GL_AMBIENT, G_vLit0Ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, G_vLit0Diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, G_vLit0Specular);
    
    //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, G_vMaterialSpecu);
    //glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0f);
    
    //…Ë÷√≥…ƒ£–Õæÿ’Ûƒ£ Ω
    glMatrixMode(GL_MODELVIEW);
    
    //‘ÿ»Îµ•ŒªªØæÿ’Û
    glLoadIdentity();
    
    //◊¯±Í÷––ƒœÚZ÷·∆Ω“∆-G_fDistance ( π◊¯±Í÷––ƒŒª”⁄…„œÒª˙«∞∑Ω)
    glTranslatef(0.0, 0.0, -G_fDistance);
    glRotatef(G_fAngle_horizon, 0.0f, 1.0f, 0.0f);
    glRotatef(G_fAngle_vertical, 1.0f, 0.0f, 0.0f);
    
    
    //ªÊ÷∆ŒÔÃÂ
    
    //ª≠“ª∏ˆ»˝Ω«–Œ
    
    glBegin(GL_TRIANGLES);
    glNormal3f(0.0f, 0.0f, 1.0f);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f (-2.0, -1.0f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f (0.0, 1.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f (-2.0, 1.0f, 0.0f);
    glEnd();
    
    //ª≠“ª∏ˆ≤Ë∫¯
    glColor3f(0.0f, 1.0f, 0.0f);
    glTranslatef(0.8f, 0.0f, 0.0f);
    glutWireTeapot(1.0);
    //glutSolidTeapot(1.0);
    //glutSolidTeapot(0.5);
    //glutSolidSphere(1.0, 20, 20);
    
    //Ωªªª«∞∫Ûª∫≥«¯
    glutSwapBuffers();
}


void processSpecialKeys(int key, int x, int y)
{
    switch(key) {
        case GLUT_KEY_LEFT:
            G_fAngle_horizon -= 5.0f;
            break;
        case GLUT_KEY_RIGHT:
            G_fAngle_horizon += 5.0f;
            break;
        case GLUT_KEY_UP:
            G_fAngle_vertical -= 5.0f;
            break;
        case GLUT_KEY_DOWN:
            G_fAngle_vertical += 5.0f;
            break;
    }
    glutPostRedisplay();
}

void processNormalKeys(unsigned char key,int x,int y)
{
    switch(key) {
        case 97:    //"a"
            G_fDistance -= 0.3f;
            break;
        case 65:        //"A"
            G_fDistance += 0.3f;
            break;
        case 49:    //"1"
            G_shadingMode = GL_FLAT;
            break;
        case 50:    //"2"
            G_shadingMode = GL_SMOOTH;
            break;
        case 27:    //"esc"
            exit(0);
    }
    
    glutPostRedisplay();
}

之后运行得到结果

若想去掉警告,则在 #include 部分之前加入一行代码

#define GL_SILENCE_DEPRECATION

即:

最终运行结果如下:

配置成功!


补充:

运行如下代码时,

#include <iostream>
#include <GLUT/glut.h>

void mydisplay(){
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
   //glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

int main(int argc, char * argv[]) {
    glutInit(&argc, argv);
    glutCreateWindow("simple");
    glutDisplayFunc(mydisplay);
    glutMainLoop();
}

 系统显示 Undefined symbol: _glBegin 相关问题,如下:

解决方法: Build Settings --> Linking --> Other Linker Flags 添加 “-framework OpenGL”

 添加完成:

 运行结果:

运行成功! 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值