美文网首页OpenGL ES课题
固定着色器渲染三角形(OpenGL ES)

固定着色器渲染三角形(OpenGL ES)

作者: lenka01 | 来源:发表于2021-10-05 16:29 被阅读0次

    与前面OpenGL中讲到的三角形渲染类似,接下来我们将在iOS系统下探索如何渲染一个三角形。

    1.了解GLKit

    在学习如何渲染图形之前,我们需要了解一个官方提供的framework,它就是GLKit.那么它是什么呢?简单地解释下,就是苹果为了方便开发者使用OpenGL ES的api,在其基础之上包装了一层面向对象的开发模式(OpenGL面向过程开发)。使大家更加方便高效的接触OpenGL ES的图形绘制。GLKit提供了很多载体,这里我们介绍下,经常使用对象。

    1.1 GLKView

    GLKView是苹果基于OpenGL ES之上封装得一个渲染视图(当然其它平台也会有对应的视图或者window),它能够提供我们绘图的能力,也是苹果早期底层图形渲染的基础框架。

    1.2 EAGLContext

    CGContext类似,EAGLContext是我们渲染图形的上下文。

    1.3 GLKBaseEffect

    GLKBaseEffect是一个面向对象的着色器,它里面包含了顶点着色器和片段着色器。

    2.开始渲染

    首先,我们需要创建一个渲染视图GLKView.

    2.1 GLKView创建

    - (void)setupGLKView {
        // 初始化 EAGLContext
        EAGLContext *contxt = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
        // 设置当前的上下文,替换默认的。
        [EAGLContext setCurrentContext:contxt];
        _context = contxt;
    
        // 出初始化GLKView
        _glkView = [[GLKView alloc] initWithFrame:self.view.bounds context:contxt];
        _glkView.delegate = self;
        // 设置渲染缓存样式,通常有三个附加:颜色、深度、模板。
        _glkView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
        _glkView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
        _glkView.drawableStencilFormat = GLKViewDrawableStencilFormat8;
        _glkView.backgroundColor = UIColor.clearColor;
        [self.view addSubview:self.glkView];
        // 清除画布背景色,并设置成新的背景色
        glClearColor(0.2, 0.2, 0.2, 1.0);
    }
    

    2.2 顶点数据创建

    - (void)setupVertexBuffer {
    
        // 三角形 (顶点xyzw + 顶点颜色rgba)
        GLVertex vertex[] = {
            { {-0.5, 0, 0, 1}, {1, 0, 0, 1} },
            { {0, 0.5, 0, 1}, {1, 0, 0, 1} },
            { {0.5, 0, 0, 1}, {1, 0, 0, 1} },
        };
    
        // 创建并绑定顶点缓存
        GLuint vertextBufferID;
        glGenBuffers(1, &vertextBufferID);
        glBindBuffer(GL_ARRAY_BUFFER, vertextBufferID);
        // 拷贝数据到顶点缓存上 cpu -> gpu
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);
    
    
        //打开顶点坐标访问权限,iOS系统中默认关闭了Attribute通道。导致顶点着色器无法访问顶点数据
        glEnableVertexAttribArray(GLKVertexAttribPosition);
        glVertexAttribPointer(GLKVertexAttribPosition, 4, GL_FLOAT, GL_FALSE, sizeof(GLVertex), NULL + offsetof(GLVertex, position));
        // 打开顶点坐标颜色访问权限
        glEnableVertexAttribArray(GLKVertexAttribColor);
        glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(GLVertex), NULL + offsetof(GLVertex, color));
    }
    

    2.3 初始化固定着色器

    - (void)setupEffect {
        _baseEffect = [[GLKBaseEffect alloc] init];
        _baseEffect.label = @"GLKBaseEffect";
        // 使用固定颜色,未开启GLKVertexAttribColor时,默认使用自定颜色
        _baseEffect.useConstantColor = GL_TRUE;
        _baseEffect.constantColor = GLKVector4Make(0, 1, 0, 1);
    }
    

    绘制部分

    #pragma mark - GLKViewDelegate
    - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    // 清除颜色缓存
        glClear(GL_COLOR_BUFFER_BIT);
    // 准备绘制
        [_baseEffect prepareToDraw];
    // 开始绘制,从顶点缓存中获取数据。
    //GL_TRIANGLES为基元(图元)连接类型,第二个参数表示从第几个顶点开始绘制,一般为0。第三个参数表示有几个顶点。
        glDrawArrays(GL_TRIANGLES, 0, 3);
    }
    

    绘制结果

    三角形.png

    相关文章

      网友评论

        本文标题:固定着色器渲染三角形(OpenGL ES)

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