無意味な力--OpenGL ESへのエントリーからのOpenGL ESはすぐにGLKitを理解します

OpenGL ESの背景

OpenGL ES(組み込みシステム用のOpenGL)先の時間ハンドヘルドのための時計をもとに、組み込みターゲット高度な3Dグラフィックスアプリケーションプログラミングコネクタ(API)のOpenGL ESは、支配的なスマートフォンプラットフォームのグラフィックスAPIです⽀ホールド..: iOSの、のAndriod、ブラックベリー、パダ、Linuxでは、Windowsの。

OpenGL ESのオープングラフィックスライブラリ(OpenGLは)視覚化⼆次元および三次元データのために使用されます。これは、汎用性の高いオープンな標準グラフィックスライブラリ、⽀支援2Dおよび3Dデジタルコンテンツ作成、機械的、建築設計、仮想プロトタイピング、シミュレーションフライ⾏、ビデオゲームやその他のアプリケーションです。あなたは、データを提出するよう構成されたOpenGLの3Dグラフィックス・パイプラインを使用することができます。頂点が変換され、プリミティブの組み合わせを点灯し、2次元画像を生成するためにラスタライズされます。OpenGLのは、関数呼び出しが基礎となるグラフィックス・ハードウェアのグラフィックスコマンドに送信することができます変換するように設計されています。基盤となるハードウェアは、グラフィックスコマンドの処理専用なので、非常に速く、OpenGLグラフィックスは、一般的に便利です。

組込みシステムのためのOpenGL(OpenGL ESのは)OpenGLのの簡易版である、それはライブラリ内のモバイルグラフィックスハードウェアで実装するの習得が容易かつ簡単に両方を提供し、冗長な機能を排除します。
12791315-716adfaff9674126.png
OpenGLのES.png
OpenGL ESは、アプリケーションが基盤となるグラフィックス・プロセッサのパワーを活用することができます。IOSのGPU上で複雑な2Dおよび3Dグラフィックス、および複雑な計算で変色画素毎に最終画像を実行することができます。

GLKitについて

GLKitフレームワークはOpenGLの/ OpenGL ESの年代に基づいてアプリケーションの開発を簡素化するために設計されています。アプリケーションのOpenGL ESのまたはOpenGL開発を加速するために表示されます。ループのレンダリングを実現するために数学ライブラリ、背景テクスチャの読み込み、事前に作成したシェーダ効果だけでなく、標準ビューとビューコントローラを使用してください。
GLKitフレームワークは、機能および必要なクラスは、ワークロード・シェーダに基づいて、新しいアプリケーション、または固定機能頂点又はプロセス依存性放出セグメント設けのOpenGL ESまたはOpenGLの以前のバージョンをサポートするために既存のアプリケーションを作成するために低減することができる提供します。
GLKit機能:
1.負荷テクスチャ
2.高性能数学提供するために
、多くの場合、ターゲットマークを提供3.⻅がある
4がビューとビューコントローラを提供します。

これはGLKitココアタッチの一部及びA(のUIKitを含む)他の複数のフレームです。GLKViewとGLKViewControllerクラスはGLKitのフレームワークの一部です。
GLKViewは会場が(ビュー)を描画提供し、クラスのココアタッチのUIViewのサブクラスを構築されています。
GLKViewControllerは(標準のUIKitデザインパターンへの拡張は、図面管理、プレゼンテーションの内容を表示するために使用します。)のUIViewControllerのサブクラスを構築されています

GLKit的のHello World

新しいXcodeプロジェクト、ViewController.hのヘッダファイルをインポートします

#import <GLKit/GLKit.h>
#import <OpenGLES/ES3/gl.h>
#import <OpenGLES/ES3/glext.h>

そして、のViewControllerが変更GLKViewControllerを継承する、のViewControllerのビューはGLKViewある変更を継承します。

{
    EAGLContext *context;   //上下文
    GLKBaseEffect *cEffect; //完成着色器的工作
}

1.OpenGL ES関連の初期化

-(void)setUpConfig
{
//1.初始化上下文&设置当前上下文
context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
//判断context是否创建成功
if (!context) {
        NSLog(@"Create ES context Failed");
    }
//设置当前上下文
[EAGLContext setCurrentContext:context];
    
//2.获取GLKView & 设置context
GLKView *view =(GLKView *) self.view;
view.context = context;

//3.配置视图创建的渲染缓存区.
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
view.drawableDepthFormat = GLKViewDrawableDepthFormat16;
    
//4.设置背景颜色
glClearColor(1, 0, 0, 1.0);
}

注釈1:。
。EAGLContextは層がアップルのiOS OpenGLESインターネットの下に実装されているレンダリング
。KEAGLRenderingAPIOpenGLES1 = 1、固定回線
kEAGLRenderingAPIOpenGLES2 = 2、
kEAGLRenderingAPIOpenGLES3 = 3、。

注釈2:
(1)drawableColorFormat:カラーバッファフォーマット。
はじめに:のOpenGL ESはキャッシュを有し、それが画面に表示される色のために記憶されます。あなたは、各ピクセルの色のフォーマットバッファを設定するには、そのプロパティを使用することができます。
GLKViewDrawableColorFormatRGBA8888 = 0、
デフォルトのバッファ領域8「ビットを用いて、各画素の最小部分(RGBA)、(4バイト各ピクセルように、4×8ビット)。
GLKViewDrawableColorFormatRGB565は、
あなたのAPPは、色の小さな範囲を許可する場合、あなたはこれを設定することができます。APPは、あなたがより少ないリソース(メモリや処理時間)を消費できるようになります

(2)drawableDepthFormat :.デプスバッファ形式
GLKViewDrawableDepthFormatNone = 0、ない深度バッファが存在しないことを意味
GLKViewDrawableDepthFormat16、
GLKViewDrawableDepthFormat24は、
あなたが(一般的に3Dゲームのために使用される)、このプロパティを使用したい場合、あなたはGLKViewDrawableDepthFormat16やGLKViewDrawableDepthFormat24を選択する必要があります。ここでの違いはGLKViewDrawableDepthFormat16の使用は、より少ないリソースを消費しますです

2.ロード頂点/テクスチャ座標データ

//1.设置顶点数组(顶点坐标,纹理坐标)
 /*
纹理坐标系取值范围[0,1];原点是左下角(0,0);
故而(0,0)是纹理图像的左下角, 点(1,1)是右上角.
*/
GLfloat vertexData[] = {
        0.5, -0.5, 0.0f,    1.0f, 0.0f, //右下
        0.5, 0.5, -0.0f,    1.0f, 1.0f, //右上
        -0.5, 0.5, 0.0f,    0.0f, 1.0f, //左上
        
        0.5, -0.5, 0.0f,    1.0f, 0.0f, //右下
        -0.5, 0.5, 0.0f,    0.0f, 1.0f, //左上
        -0.5, -0.5, 0.0f,   0.0f, 0.0f, //左下
    };

//2.开辟顶点缓存区
//(1).创建顶点缓存区标识符ID
GLuint bufferID;
glGenBuffers(1, &bufferID);
//(2).绑定顶点缓存区.(明确作用)
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
//(3).将顶点数组的数据copy到顶点缓存区中(GPU显存中)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    
//3.打开读取通道.
//顶点坐标数据
glEnableVertexAttribArray(GLKVertexAttribPosition);
 /*
     typedef NS_ENUM(GLint, GLKVertexAttrib)
     {
     GLKVertexAttribPosition,顶点
     GLKVertexAttribNormal,法线
     GLKVertexAttribColor,颜色值
     GLKVertexAttribTexCoord0,纹理0
     GLKVertexAttribTexCoord1 纹理1
     } NS_ENUM_AVAILABLE(10_8, 5_0);
     */
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 0);
//纹理坐标数据
//打开对应attribute开关
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 3);

注1:
頂点配列:開発者は、メソッドの描画時に呼び出し、関数ポインタを設定することを選択することができ、頂点データメモリから直接渡され、それがそれらのメモリに格納される前に、そのデータの一部であり、頂点配列と呼ばれます。

頂点バッファ:高性能実際、事前に予めメモリに渡される頂点データをメモリのブロックを割り当てることです。このメモリ部は、頂点バッファと呼ばれています。
注2:
。(1)iOS 版では、デフォルトでは、パフォーマンス上の理由から、すべての頂点シェーダの属性は(属性)の変数が閉鎖されている
手段、頂点シェーダデータ端末(サーバー)使用できません。すでにglBufferDataメソッドを使用している場合でも、頂点データをメモリから頂点バッファ領域(GPUビデオメモリ)にコピーされる。
したがって、我々は、アクセスプロパティを指定glEnableVertexAttribArray方法によってチャネルを開く必要があります。CPUからコピーするためのアクセスするために、頂点シェーダをできるように。GPU用のデータ
注:GPUの最後にデータが表示されている、すなわち、シェーダが有効か否かによって決定される属性に対応するデータを読み出すことができ、これはGPUの頂点シェーダを読み取ることができglEnableVertexAttribArray機能(サーバであります)データ。

(2)方法简介
glVertexAttribPointer(GLuintのINDX、グリントサイズ、GLenum型、GLboolean正規化され、GLsizeiストライド、CONST GLvoidの*のPTR)

関数は:(からデータを読み取るために、バッファの内部の適切な方法で提供される)頂点のメモリにデータをアップロード
:パラメータのリスト
インデックスを:例えば、インデックス値を修正する頂点属性を指定し、
サイズ:毎回リードの数。(例えば3つの位置(x、y、z)の組成物によって、それは4であり、色(R、G、B、A )、 テクスチャは2である。)を
入力します。各コンポーネントのアレイ内のデータのタイプを指定。シンボリック定数はGL_BYTE、GL_UNSIGNED_BYTE、GL_SHORT、GL_UNSIGNED_SHORT、利用可能な GL_FIXED、 およびGL_FLOAT、初期値GL_FLOAT。
正規化:アクセスされたとき、固定小数点データの値は固定小数点値(GL_FALSE)に(GL_TRUE)または直接変換を正規化するかどうかを指定する
のストライド:連続する頂点の属性との間のオフセットを指定。それが0であれば、頂点は理解されるように属性:彼らは接近して配置されていること。0の初期値
PTR:第一成分の頂点属性、初期値0の第1のアレイへのポインタを指定します。

3.負荷テクスチャデータ(GLBaseEffectを使用して)

 //1.获取纹理图片路径
NSString * filepath = [[NSBundle mainBundle] pathForResource:@"shiyuan1" ofType:@"jpg"];
//2.设置纹理参数
//纹理坐标原点是左下角,但是图片显示原点应该是左上角.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1),GLKTextureLoaderOriginBottomLeft, nil];
GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];
    
//3.使用苹果GLKit 提供GLKBaseEffect 完成着色器工作(顶点/片元)
cEffect = [[GLKBaseEffect alloc]init];
cEffect.texture2d0.enabled = GL_TRUE;
cEffect.texture2d0.name = textureInfo.name;

4.コンテンツ見取り図

#pragma mark -- GLKViewDelegate
//绘制视图的内容
/*
 GLKView对象使其OpenGL ES上下文成为当前上下文,并将其framebuffer绑定为OpenGL ES呈现命令的目标。然后,委托方法应该绘制视图的内容。
*/
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
//1.清除颜色缓存区
glClear(GL_COLOR_BUFFER_BIT);
//2.准备绘制
[cEffect prepareToDraw];
//3.开始绘制
glDrawArrays(GL_TRIANGLES, 0, 6);  
}

結果を描画:
12791315-c681060a35ef7cb5.png
結果を描画.PNG

ここでは、心の形は、OpenGL ES GLKitの概要ロード画像をマッピングしなければ:
12791315-9d6e5a1684509b04.png
マインドマッピング.PNG

共通APIは解決します

1.GLKView
GLKViewはデフォルトを達成するためにビューでのOpenGL ESのレンダリングコンテンツを使用する:
1.新規ビューを初期化します

- (instancetype)initWithFrame:(CGRect)frame context:(EAGLContext *)context;

2. View Agentの

@property (nullable, nonatomic, assign) IBOutlet id <GLKViewDelegate> delegate;

コンテキストをレンダリングするために使用される3のOpenGL ESビューコンテンツ

@property (nonatomic, retain) EAGLContext *context;

4.設定のフレームバッファオブジェクト

drawableColorFormat 颜⾊渲染缓存区格式
/*
GLKViewDrawableColorFormatRGBA8888 = 0,
GLKViewDrawableColorFormatRGB565,
GLKViewDrawableColorFormatSRGBA8888,
*/
drawableDepthFormat 深度渲染缓存区格式
/*
GLKViewDrawableDepthFormatNone = 0,
GLKViewDrawableDepthFormat16,
GLKViewDrawableDepthFormat24,
*/
drawableStencilFormat 模板渲染缓存区的格式
/*
GLKViewDrawableStencilFormatNone = 0,
GLKViewDrawableStencilFormat8,
*/
drawableMultisample 多重采样缓存区的格式
/*
GLKViewDrawableMultisampleNone = 0,
GLKViewDrawableMultisample4X,
*/

フレームバッファ特性

drawableHeight 底层缓存区对象的⾼度(以像素为单位)
drawableWidth 底层缓存区对象的宽度(以像素为单位)

6.基礎となるオブジェクトは、OpenGL ESのフレームバッファにバインドされています

- (void)bindDrawable;

7.描画可能に関連付けられたビューを削除/削除ビューは、フレームバッファオブジェクト

- (void)deleteDrawable;

8.絵画図含有量とは、新たな画像オブジェクトとして返し

@property (readonly, strong) UIImage *snapshot;

9.布尔值(BOOL),指定视图是否响应使得视图内容无效的消息

@property (nonatomic) BOOL enableSetNeedsDisplay;

10.立即重绘视图内容

- (void)display;

11.绘制视图内容(必须实现代理)

//GLKViewDelegate ⽤用于GLKView 对象回调⽅方法
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect;

2. GLKViewController
GLKViewController 管理OpenGL ES 渲染循环的视图控制器
1.视图控制器的代理

@property (nullable, nonatomic, assign) IBOutlet id <GLKViewControllerDelegate> delegate;

2.配置视图的帧速率

//视图控制器调用视图以及更新视图内容的速率
@property (nonatomic) NSInteger preferredFramesPerSecond;
//视图控制器调用视图以及更新其内容的实际速率
@property (nonatomic, readonly) NSInteger framesPerSecond;

3.控制帧更新

//Bool值,渲染循环是否已暂停
@property (nonatomic, getter=isPaused) BOOL paused;
//Bool值,当前程序重新激活活动状态时视图控制器是否自动暂停循环渲染
@property (nonatomic) BOOL pauseOnWillResignActive;
//Bool值,当前程序变为活动状态时视图控制器是否自动恢复呈现渲染
@property (nonatomic) BOOL resumeOnDidBecomeActive;

4.获取有关视图view的更新信息

//视图控制器自创建以来发送的帧更新数
@property (nonatomic, readonly) NSInteger framesDisplayed;
//⾃视图控制器第⼀次恢复发送更新事件以来经过的时间量
@property (nonatomic, readonly) NSTimeInterval timeSinceFirstResume;
//自上次视图控制器恢复发送更新事件以来更新的时间量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastResume;
//⾃上次视图控制器调用委托⽅法以及经过的时间量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastUpdate;
//⾃上次视图控制器调用视图display 方法以来经过的时间量
@property (nonatomic, readonly) NSTimeInterval timeSinceLastDraw;

5.渲染循环回调方法--更新视图内容,处理更新事件,
在这里,其实系统还有一个方法用于更新视图:- (void)update;

//在显示每个帧之前调用
- (void)glkViewControllerUpdate:(GLKViewController *)controller;

注:
如果不对GLKViewController进行子类化,则会调用glkViewControllerUpdate进行视图更新,如果GLKViewController被子类化,并且手动实现了- (void)update;则此时就不会调用glkViewControllerUpdate,相当于update覆盖了glkViewControllerUpdate,其实本质上update和glkViewControllerUpdate是相同的。

6.暂停/恢复通知

//在渲染循环暂停或者恢复之前调用
- (void)glkViewController:(GLKViewController *)controller willPause:(BOOL)pause;

3.GLKit 纹理加载GLTextureLoader
GLKTextureInfo类创建OpenGL纹理信息。该类包含以下属性:

name : OpenGL上下文中纹理名称
target : 纹理绑定的目标
height: 加载的纹理高度
width : 加载的纹理宽度
textureOrigin : 加载纹理中的原点位置
alphaState : 加载纹理中alpha分量状态

GLTextureLoader 简化从各种资源文件中加载纹理:

  1. 初始化
//初始化一个新的纹理加载到对象中
- (instancetype)initWithSharegroup:(EAGLSharegroup *)sharegroup;
//初始化一个新的纹理加载对象
- (instancetype)initWithShareContext:(NSOpenGLContext *)context;

2.从文件资源中加载纹理

//从文件加载2D纹理图像并从数据中创建新的纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options  error:(NSError * __nullable * __nullable)outError; 
//从文件中异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block; 

URLアドレスからの3負荷テクスチャ

//用URL加载2D纹理图像并从数据中创建新的纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//用URL异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;

4.メモリからテクスチャデータを作成します。

//从内存空间加载2D纹理图像并从数据中创建新的纹理
+ (nullable GLKTextureInfo *)textureWithContentsOfData:(NSData *)data options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从内存空间异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithContentsOfData:(NSData *)data options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;

5. CGImagesからテクスチャを作成します。

//从Quartz加载2D纹理图像并从数据中创建新的纹理
+ (nullable GLKTextureInfo *)textureWithCGImage:(CGImageRef)cgImage options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从Quartz异步加载2D纹理图像,并根据数据创建新纹理
- (void)textureWithCGImage:(CGImageRef)cgImage options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;

6. URLからロードされたキューブテクスチャを作成します。

//从单个URL加载⽴方体贴图纹理图像,并根据数据创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从单个URL异步加载⽴方体贴图纹理图像,并根据数据创建新纹理
- (void)cubeMapWithContentsOfURL:(NSURL *)url options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;

7.キューブをロードするためのリソースファイルからテクスチャを作成します。

//从单个文件加载⽴方体贴图纹理对象,并从数据中创建新纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从单个文件异步立方体贴图纹理图像,并根据数据创建新纹理
- (void)cubeMapWithContentsOfFile:(NSString *)path options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;
//从一系列文件加载立方体贴图纹理图像.并根据数据创建新的纹理
+ (nullable GLKTextureInfo*)cubeMapWithContentsOfFiles:(NSArray<id> *)paths options:(nullable NSDictionary<NSString*, NSNumber*> *)options error:(NSError * __nullable * __nullable)outError;
//从一系列文件异步立方体贴图纹理图像,并根据数据创建新纹理
- (void)cubeMapWithContentsOfFiles:(NSArray<id> *)paths options:(nullable NSDictionary<NSString*, NSNumber*> *)options queue:(nullable dispatch_queue_t)queue completionHandler:(GLKTextureLoaderCallback)block;

4.GLKitライトGLKBaseEffectは
1エフェクトの名前

//给Effect(效果)命名
 NSString  *label; 

2.構成モデルビュー変換します

//绑定效果时应用于顶点数据的模型视图,投影和纹理变换
GLKEffectPropertyTransform  *transform;

コンフィギュレーション・照明効果

//⽤于计算每个片段的光照策略,
GLKLightingType  lightingType;

注:
GLKLightingTypePerVertex 表示在三⻆形中每个顶点执⾏光照计算,然后在三角形进行插值。
GLKLightingTypePerPixel 表示光照计算的输⼊在三角形内插入,并且在每个片段执行光照计算。

4.光構成

//布尔值,表示为基元的两侧计算光照
GLboolean  lightModelTwoSided;
//计算渲染图元光照使⽤用的材质属性
GLKEffectPropertyMaterial *material;  
//环境颜色,应⽤效果渲染的所有图元
GLKVector4  lightModelAmbientColor;
//场景中第一个光照属性,第二个光照属性,第三个光照属性
GLKEffectPropertyLight   *light0, *light1, *light2; 

5.設定のテクスチャ

//第⼀个纹理属性,第二个纹理属性
GLKEffectPropertyTexture  *texture2d0, *texture2d1;
//纹理应⽤于渲染图元的顺序
NSArray<GLKEffectPropertyTexture*> *textureOrder; 

6.設定の微粒化

//应用于场景的雾属性
GLKEffectPropertyFog  *fog;  

7.色情報を設定します

//布尔值,表示计算光照与材质交互时是否使用颜色顶点属性
GLboolean  colorMaterialEnabled;
//布尔值,指示是否使用常量颜⾊
GLboolean  useConstantColor;
//不提供每个顶点颜色数据时使用常量颜⾊
GLKVector4  constantColor; 

描画エフェクトの準備8.

//准备渲染效果
- (void) prepareToDraw;

これまでのOpenGL ESは、これらのフォローアップが間近に迫っていきます基本的な共通APIをGLKit。誤記、注釈誤差た場合、また、間違った方法を使用して記入してください。THX。

おすすめ

転載: blog.csdn.net/weixin_34234823/article/details/90807520