OpenGLES使用(1)

實現(xiàn)一個正六邊形旋轉(zhuǎn)效果.

屏幕錄制2020-12-08 上午10.23.35.2020-12-08 10_27_15.gif

時序圖:

OpenGLES旋轉(zhuǎn)六邊形.png

大致代碼

1.開啟OpenGLES上下文

 EAGLContext * context = [[EAGLContext alloc]initWithAPI:(kEAGLRenderingAPIOpenGLES3)];
 [EAGLContext setCurrentContext:context];

2.獲取紋理圖片

NSString * path = [[NSBundle mainBundle]pathForResource:@"image" ofType:@"png"];
UIImage * img = [UIImage imageWithContentsOfFile:path];
GLKTextureInfo * info = [GLKTextureLoader textureWithCGImage:img.CGImage options:@{GLKTextureLoaderOriginBottomLeft : @1} error:nil];

3.設(shè)置紋理.開啟光照

//設(shè)置紋理.使用baseEffect
self.baseEffect = [[GLKBaseEffect alloc]init];
self.baseEffect.texture2d0.name = info.name;
self.baseEffect.texture2d0.target = info.target;
//開啟光照效果
self.baseEffect.light0.enabled = YES;
self.baseEffect.light0.diffuseColor = GLKVector4Make(1, 1, 1, 1);
self.baseEffect.light0.position = GLKVector4Make(-0.5, -0.5, 5, 1);

4.開辟緩存區(qū)

//開辟一個頂點數(shù)據(jù)空間
self.vertexs = malloc(sizeof(CCVertex) * kCoordCount);
<省略頂點數(shù)據(jù).請查看源碼>
//開辟緩存區(qū)
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
//將數(shù)據(jù)從cpu拷貝到gpu
glBufferData(GL_ARRAY_BUFFER, sizeof(CCVertex) * kCoordCount, self.vertexs, GL_STATIC_DRAW);

5.開啟頂點通道

參數(shù)解釋: 此處的3.指的是xyz笛卡爾三維坐標值
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(CCVertex), NULL + offsetof(CCVertex, positionCoord));

6.開啟紋理通道

參數(shù)解釋: 此處的2.指的是紋理坐標系的值
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(CCVertex), NULL + offsetof(CCVertex, textureCoord));

7.開啟法線通道

參數(shù)解釋: 此處的3.指的是法線坐標系的值
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(CCVertex), NULL + offsetof(CCVertex, normal));

8.最后在代理方法中使用GL_TRIANGLES圖元進行連接

//代理方法
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    //開啟深度測試
    glEnable(GL_DEPTH_TEST);
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    [self.baseEffect prepareToDraw];
    
    //開始繪制--開始繪制
    glDrawArrays(GL_TRIANGLES, 0, kCoordCount);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容