GLKViewController類是支持OpenGL ES特有的行爲和動畫計時的UIViewController的內建子類。
GLKView 這是cocoa Touch UIView的的內建子類。GLKView簡化了通過用 Core Animation層來自動創建並管理幀緩存和渲染緩存共享內存所需要做的工作。
GLKBaseEffect是GLKit提供的另一個內建類。GLKBaseEffect的存在是爲了簡化OpenGL ES的很多常用操作 GLKBaseEffect隱藏了iOS設備支持的多個OpenGL ES版本之間的 差異。在應用中使用GLKBaseEffet能減少需要編寫的代碼量。
直接上代碼:
#import <GLKit/GLKit.h>
@interface OpenGLESViewController : GLKViewController
{
GLuint vertexBufferID;
}
@property (strong, nonatomic) GLKBaseEffect *baseEffect;
@end
/////////////////
#import "OpenGLESViewController.h"
@implementation OpenGLESViewController
@synthesize baseEffect;
typedef struct {
GLKVector3 positionCoords;
}
SceneVertex;
static const SceneVertex vertices[] =
{
{{-0.5f, -0.5f,0.0}},
{{ 0.5f, -0.5f,0.0}},
{{-0.5f, 0.5f, 0.0}}
};
- (void)viewDidLoad
{
[superviewDidLoad];
GLKView *view = (GLKView *)self.view;
NSAssert([viewisKindOfClass:[GLKViewclass]],
@"View controller's view is not a GLKView");
// 初始化一個內建的EGALContext實例,這個實例會封裝一個特定於某個平臺的OpenGL ES上下文
view.context = [[EAGLContextalloc]
initWithAPI:kEAGLRenderingAPIOpenGLES2];
//設置接下來會用的OpenGL ES上下文
[EAGLContext setCurrentContext:view.context];
self.baseEffect = [[GLKBaseEffectalloc] init];
self.baseEffect.useConstantColor =GL_TRUE;
self.baseEffect.constantColor =GLKVector4Make(
0.8f, // Red
1.0f, // Green
1.0f, // Blue
1.0f);// Alpha
glClearColor(0.9f,0.0f, 0.0f,1.0f); // background color
glGenBuffers(1, // STEP 1 第一個參數表示生成緩存標識符的數量
&vertexBufferID); // 當前情況下,標示符被生成,並保存在vertexBufferID中
glBindBuffer(GL_ARRAY_BUFFER, // STEP 2 指定標示符緩存到當前緩存,同一時刻每種類型智能綁定一種緩存
vertexBufferID); // 目前只支持2種類型的緩存 GL_ARRAY_BUFFER用於指定一個頂點屬性數組
glBufferData( // STEP 3 複製應用頂點數數據到當前上下文所綁定的頂點緩存中
GL_ARRAY_BUFFER, // 用於指定要更新當前上下文所綁定的哪一個緩存
sizeof(vertices),// 指定要複製的這個緩存的字節大小
vertices, // 要複製緩存的字節地址
GL_STATIC_DRAW); // 提示了緩存在未來的運算中可能將會被怎樣使用
// GL_STATIC_DRAW提示會告訴上下文,緩存中的內容適合複製到GPU控制的內存,
//因爲很少對其進行修改 這個信息會幫助OpenGl優化內存的使用。使用GL_DYNAMIC_DRAW作爲提示會告訴上下文,緩存內的數據會頻繁改變,同時提示OpengGL ES以不同的方式處理緩存的存儲。
}
/**
每當一個GLKView實例需要被重繪時,他都會讓保存在視圖的上下文屬性中的OpenGL ES上下文爲當前上下文
*/
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
[self.baseEffectprepareToDraw];
glClear(GL_COLOR_BUFFER_BIT);// 設置當前綁定的幀緩存的像素顏色渲染緩存中的每一個像素顏色爲前面使用
// glClearColor函數設定的值
glEnableVertexAttribArray( // STEP 4 啓動頂點緩存渲染操作 OpenGL ES所支持的每一個
GLKVertexAttribPosition); // 渲染操作都可以單獨的使用保存在當前OpenGL ES上下文中設置來開啓或者關閉
/**
* glVertexAttribPointer 函數會告訴OpenGL ES頂點數據在哪裏,以及怎麼解釋爲每個頂點保存數據
*
*/
glVertexAttribPointer( // STEP 5
GLKVertexAttribPosition, // 指示當前綁定的緩存包含每個頂點的位置信息。
3, // 每個位置有3個部分(這裏指即有三個座標值)
GL_FLOAT, // 每個部分(座標)都是浮點型
GL_FALSE, // 告訴OpenGL ES小數點固定數據是否可以被改變
sizeof(SceneVertex),// sizeof(GLKVector)指示在緩存中沒有額外的字
// 節。即頂點數據是密封的。
NULL); // 告訴OpengGL ES可以從當前綁定的頂點緩存的 開始位置訪問頂點數據
glDrawArrays(GL_TRIANGLES, // STEP 6 告訴GPU怎麼處理在綁定的頂點緩存內的頂點數據
0, // 指定需要渲染第一點的位置
3);// 指定需要渲染的頂點的數量
}
/////////////////////////////////////////////////////////////////
// 在試圖控制器最終被卸載的時候被調用,卸載的視圖將不再被繪製,因此任何只是在繪製時需要的OpenGL ES緩存都可以安全地刪除所以第七步是刪除不再需要的頂點緩存 和上下文
- (void)viewDidUnload
{
[superviewDidUnload];
GLKView *view = (GLKView *)self.view;
[EAGLContext setCurrentContext:view.context];
// 設置vertexBufferID爲0是避免在對應的緩存被刪除以後還使用其無效的標示符。
if (0 !=vertexBufferID)
{
glDeleteBuffers (1, // STEP 7
&vertexBufferID);
vertexBufferID = 0;
}
//設置視圖的上下文屬性爲nil並設置當前上下文爲nil,以便讓cocoa touch收回所有上下文的內存和其他資源
((GLKView *)self.view).context =nil;
[EAGLContextsetCurrentContext:nil];
}
@end
歡迎轉載~~~
代碼地址 http://download.csdn.net/detail/u011883764/7024503