OpenGL ES 学习笔记二之简单图形

标准化设备坐标(Normalized Device Coordinates, NDC)

OpenGL ES 学习笔记二之简单图形_第1张图片

图片来自:http://learnopengl-cn.readthedocs.io/zh/latest/

//方式一 列出所有顶点

GLfloat vertices[] = {

// 第一个三角形

0.5f, 0.5f, 1.0f,  // 右上角

0.5f, -0.5f, 0.5f,  // 右下角

-0.5f, 0.5f, -1.0f,  // 左上角

// 第二个三角形

0.5f, -0.5f, 0.0f,  // 右下角

-0.5f, -0.5f, 0.0f, // 左下角

-0.5f, 0.5f, 0.0f  // 左上角

};

- (void)viewDidLoad {

[super viewDidLoad];

GLKView * viewGl = (GLKView *)self.view;

self.glView = viewGl;

self.glView.context = self.glContext;

viewGl.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;  //颜色缓冲区格式

[EAGLContext setCurrentContext:self.glContext];

[self configVAO];

[self setupBaseEffect];

// Do any additional setup after loading the view, typically from a nib.

}

- (EAGLContext *)glContext

{

if (!_glContext) {

_glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

}

return _glContext;

}

- (void)configVAO

{

//顶点数据缓存

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition); //顶点数据缓存

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

}

//创建着色器效果

- (void)setupBaseEffect{

self.mEffect = [[GLKBaseEffect alloc] init];

}

/**

*  渲染场景代码

*/

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

//启动着色器

[self.mEffect prepareToDraw];

glClearColor(0.3f, 0.6f, 1.0f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//绘制

glDrawArrays(GL_TRIANGLES, 0, 3);

}

OpenGL ES 学习笔记二之简单图形_第2张图片

读取前三个点,画出三角形,如果读取6个顶点,则将画出2个三角形。

//绘制

glDrawArrays(GL_TRIANGLES, 0, 6);


加入颜色,在VAO下方设置设置颜色数据

glEnableVertexAttribArray(GLKVertexAttribColor); //颜色

glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

效果如下:

OpenGL ES 学习笔记二之简单图形_第3张图片

使用索引绘制相同图形

//方式二 列出所有不同顶点,根据索引读取

GLfloat verticesIndex[] = {

0.5f, 0.5f, 0.0f,  // 右上角

0.5f, -0.5f, 0.0f,  // 右下角

-0.5f, -0.5f, 0.0f, // 左下角

-0.5f, 0.5f, 0.0f  // 左上角

};

GLuint indices[] = { // 注意索引从0开始!

0, 1, 3, // 第一个三角形

1, 2, 3  // 第二个三角形

};

顶点数据缓存,加入索引

- (void)configVAO

{

//顶点数据缓存

GLuint buffer;

glGenBuffers(1, &buffer);

glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(verticesIndex), verticesIndex, GL_STATIC_DRAW);

GLuint indicesBuffer;  //索引数组

glGenBuffers(1, &indicesBuffer);  //申请一个标识符(索引数组buffer)

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);

//GL_STATIC_DRAW表示此缓冲区内容只能被修改一次,但可以无限次读取。

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition); //顶点数据缓存

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

glEnableVertexAttribArray(GLKVertexAttribColor); //颜色

glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (GLfloat *)NULL + 0);

}

修改渲染方式

glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(indices[0]), GL_UNSIGNED_INT, 0);

效果如下:


OpenGL ES 学习笔记二之简单图形_第4张图片

你可能感兴趣的:(OpenGL ES 学习笔记二之简单图形)