實現(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);
}