【问题标题】:Beginner Guide to OpenGL in Xcode [closed]Xcode中的OpenGL初学者指南[关闭]
【发布时间】:2017-04-15 21:16:32
【问题描述】:

我目前正在尝试学习 Open GL,但我发现入门非常困难。我的 OpenGL 经验为零,但在 Obj-C 和 Swift 方面有一点经验。我只想画基本的几何图形,没什么花哨的。

我首先假设您可以使用 NSOpenGLView.. 但似乎没有关于如何实际开始使用的有用文档。我已经搜索和搜索,但是对于一个新手来说,所有的文档和教程都很难使用,而且它们经常已经过时了等等

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

【问题讨论】:

  • 这个范围很广。您应该展示一个您遇到问题的具体示例。
  • 嗯,就其性质而言,这是一个广泛的问题。似乎是为了评论而评论......这没有帮助
  • 不,因为过于宽泛的问题是题外话。除非您缩小范围,否则您的问题可能会被关闭。 “我如何处理这个话题”问题不适合该网站,因为它们几乎完全基于意见。如果您刚开始并遇到特定问题,那将是主题。
  • 我的问题是。我需要创建一个 OpenGL 视图,然后我可以用它来练习 OpenGL。无论我是使用 NSOpenGlView 还是其他一些框架或库,我都不在乎。我只需要某种解决问题的方法,因为正如我所说,我遇到的文档通常已经过时或过于复杂。你自己有 Xcode/OpenGL 方面的经验吗?
  • 不。但是这个网站上的其他人会这样做。如果您使问题更合适,他们将更有可能帮助您。这不是我攻击你或试图关闭你。像这样过于宽泛、开放式的问题不容易得到好的答案。有经验的用户会花时间回答网站所针对的问题:较小的、可搜索的、具体的问题。如果你真的想问这样一个开放式问题,像 Reddit 或 Google+ 这样的讨论媒体会是一个更好的起点。

标签: objective-c swift xcode opengl


【解决方案1】:

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

  1. OpenGL 和 OpenGL ES 不一样,Xcode 上的 OpenGL ES 也和 android 上的不一样,因为 Apple 修改了一些语法。

  2. 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 教程中学到的一些代码修改它。如果我能再见到他,我要感谢那个人。希望这对你有帮助:)

附:我有一个“OpenGL ES3 模板项目”示例代码的副本,其中两个 3D 立方体相互旋转,但这要复杂得多。

【讨论】:

  • 这正是我所需要的,非常感谢您提供的所有建议和示例代码!
  • 如果你喜欢这个答案,你可以把它标记为接受:)
猜你喜欢
  • 2010-09-06
  • 2012-07-20
  • 2010-09-23
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多