美文网首页
OpenGL ES 学习笔记二之简单图形

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

作者: 春雨霏霏_____ | 来源:发表于2017-08-25 11:51 被阅读0次

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

    图片来自: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);

    }

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

    //绘制

    glDrawArrays(GL_TRIANGLES, 0, 6);

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

    glEnableVertexAttribArray(GLKVertexAttribColor); //颜色

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

    效果如下:

    使用索引绘制相同图形

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

    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 学习笔记二之简单图形

          本文链接:https://www.haomeiwen.com/subject/jarudxtx.html