美文网首页
一步步学习计算机视觉 in IOS番外篇(一)图片从加载到渲染的

一步步学习计算机视觉 in IOS番外篇(一)图片从加载到渲染的

作者: milawoai | 来源:发表于2020-06-29 23:31 被阅读0次

    图片展示到屏幕的流程

    让我们来看下一张图片展示的全过程:


    image.png

    1)读入UIImage
    在代码中,我们读取图片一般需要一个path,无论是本地图片还是远程图片,我们获取到的实际上是一个二进制数据串,用UIImage来表示。

    1. 用UIImage为UIImageView赋值

    3)系统侦测数据变化
    一个系统提供的隐式事务CATransaction捕获了UIImageView图层树的变化。在下一个runloop到来时,Core Animation提交了这个CATransaction,开始准备渲染所需的位图BitMap数据。

    4)解压缩UIImage数据到位图BitMap
    位图实际上是个像素数组,对应着图片上的每一个点。如果提供bmp文件,确实不需要解压缩,但是平常使用最为广泛的png或jpg图片都是压缩后的位图。需要对齐进行解压缩。

    1. GPU进行坐标变换
      一张1000*1000的BitMap,我们可以对其变形渲染到任意尺寸的UIImageView上,GPU需要对坐标进行转换,计算出实际的屏幕坐标。

    6)顶点着色器

    它把一个单独的顶点作为输入。顶点着色器主要的目的是把3D坐标转为另一种3D坐标(后面会解释),同时顶点着色器允许我们对顶点属性进行一些基本处理。

    7)图元装配阶段

    将顶点着色器输出的所有顶点作为输入(如果是GL_POINTS,那么就是一个顶点),并所有的点装配成指定图元的形状;

    8)几何着色器

    图元装配阶段的输出会传递给几何着色器(Geometry Shader)。几何着色器把图元形式的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状。

    9)光栅化阶段

    几何着色器的输出会被传入光栅化阶段(Rasterization Stage),这里它会把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。

    10)片段着色器

    片段着色器的主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。

    11)测试与混合

    在所有对应颜色值确定以后,最终的对象将会被传到最后一个阶段,我们叫做Alpha测试和混合(Blending)阶段。这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。

    相关文章

      网友评论

          本文标题:一步步学习计算机视觉 in IOS番外篇(一)图片从加载到渲染的

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