我目前正在尝试学习Open GL,但我发现它很难开始。我没有OpenGL经验,但在Obj-C和Swift方面有一点经验。我只想绘制基本的几何图形,没什么特别的。
我首先假设您可以使用NSOpenGLView ..但似乎没有关于如何真正开始使用它的有用文档。我进行了搜索和搜索,但作为一个新手,所有文档和教程都很难处理,而且往往它们已经过时等等。
我只需要一个视图控制器中的OpenGL视图的基本起点,我可以开始。
答案 0 :(得分:0)
几年前,当我尝试为我正在创建的动作游戏学习OpenGL时,我遇到了同样的问题。然而,当我深入研究文档和教程时,我得出的结论是,它比我想象的要复杂得多。以下是我学到的一些信息:
OpenGL与OpenGL ES不同,Xcode上的OpenGL ES也与Android上的不同,因为Apple修改了一些语法。
Xcode上的OpenGL ES有几个不同的版本:
ES1
(固定管道):不需要着色器程序。它更简单但选项更少。ES2
/ ES3
(可编程管道):使用shader
并有更多选项,但更复杂。之后我将平台改为使用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
类,如照片所示。
编译,然后,BOOM!一个多汁的白色方块已经成熟,随时可以编辑!
第一次成功使用此代码时,我泪流满面。从我从Youtube教程中学到的一些代码中修改它。如果我再见到他,我要感谢那个人。希望这有助于你:)
P.S。我有一份“OpenGL ES3模板项目”示例代码的副本,其中两个3D立方体相互旋转,但这更加复杂。