Xcode中的OpenGL初学者指南

时间:2017-04-15 21:16:32

标签: objective-c swift xcode opengl

我目前正在尝试学习Open GL,但我发现它很难开始。我没有OpenGL经验,但在Obj-C和Swift方面有一点经验。我只想绘制基本的几何图形,没什么特别的。

我首先假设您可以使用NSOpenGLView ..但似乎没有关于如何真正开始使用它的有用文档。我进行了搜索和搜索,但作为一个新手,所有文档和教程都很难处理,而且往往它们已经过时等等。

我只需要一个视图控制器中的OpenGL视图的基本起点,我可以开始。

1 个答案:

答案 0 :(得分:0)

几年前,当我尝试为我正在创建的动作游戏学习OpenGL时,我遇到了同样的问题。然而,当我深入研究文档和教程时,我得出的结论是,它比我想象的要复杂得多。以下是我学到的一些信息:

  1. OpenGL与OpenGL ES不同,Xcode上的OpenGL ES也与Android上的不同,因为Apple修改了一些语法。

  2. Xcode上的OpenGL ES有几个不同的版本:

    • ES1(固定管道):不需要着色器程序。它更简单但选项更少。
    • ES2 / ES3(可编程管道):使用shader并有更多选项,但更复杂。
  3. 之后我将平台改为使用Windows作为替代,因为PC上的OpenGL教程更加详细,可以找到许多示例项目。与使用Xcode相比,基础知识更容易学习。

    我建议您学习绘制形状的基本概念以及在Windows等其他平台上编写着色器,然后在获得更多经验后再回到Xcode。

    但是,如果你坚持使用Xcode,我可以提供一些可以成功编译而没有错误的示例代码。以下代码是在OpenGL ES1上编写的。只需创建一个新的Single View Application并粘贴以下代码:

    ViewController.h:

    #import <UIKit/UIKit.h>
    #import <GLKit/GLKit.h>
    
    @interface ViewController : GLKViewController
    
    @end
    

    ViewController.m:

    #import "ViewController.h"
    
    typedef struct {
    
        GLKVector3 PositionCoordinates;
    
    }VertexData;
    
    #define SQUARE_SIZE 120.0f
    
    VertexData Vertices[] = {
    
        {0.0f, 0.0f, 0.0f},
        {SQUARE_SIZE, 0.0f, 0.0f},
        {0.0f, SQUARE_SIZE, 0.0f},
        {0.0f, SQUARE_SIZE, 0.0f},
        {SQUARE_SIZE, 0.0f, 0.0f},
        {SQUARE_SIZE, SQUARE_SIZE, 0.0f}
    };
    
    @interface ViewController ()
    
    @property (nonatomic, strong) EAGLContext *Context;
    @property (nonatomic, strong) GLKBaseEffect *BaseEffect;
    
    @end
    
    @implementation ViewController {
    
        GLuint _VertexBufferID;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.Context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    
        GLKView *View = (GLKView *)self.view;
        View.context = self.Context;
        [EAGLContext setCurrentContext:self.Context];
    
        self.BaseEffect = [[GLKBaseEffect alloc] init];
        self.BaseEffect.useConstantColor = YES;
        self.BaseEffect.constantColor = GLKVector4Make(255/255.0f, 255/255.0f, 255/255.0f, 1.0f);
    
        self.BaseEffect.transform.projectionMatrix = GLKMatrix4MakeOrtho(0, self.view.bounds.size.width, 0, self.view.bounds.size.height, 0, 100);
    
        glClearColor(0/255.0f, 0/255.0f, 0/255.0f, 1.0f);
    
        glGenBuffers(1, &_VertexBufferID);
        glBindBuffer(GL_ARRAY_BUFFER, _VertexBufferID);
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
    
        glEnableVertexAttribArray(GLKVertexAttribPosition);
        glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), NULL);
    }
    
    #pragma mark - GLKView delegate methods
    
    -(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    
        glClear(GL_COLOR_BUFFER_BIT);
        [self.BaseEffect prepareToDraw];
        glDrawArrays(GL_TRIANGLES, 0, 6);
    }
    
    -(void)Update {
    
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    如果你正在使用Storyboards,请记得将ViewController上的视图更改为GLKView类,如照片所示。

    Change view class into GLKView

    编译,然后,BOOM!一个多汁的白色方块已经成熟,随时可以编辑!

    White square in GLKView

    第一次成功使用此代码时,我泪流满面。从我从Youtube教程中学到的一些代码中修改它。如果我再见到他,我要感谢那个人。希望这有助于你:)

    P.S。我有一份“OpenGL ES3模板项目”示例代码的副本,其中两个3D立方体相互旋转,但这更加复杂。