千家信息网

unity3d中图片渲染流程是什么

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Processor Unit)图形
千家信息网最后更新 2025年01月24日unity3d中图片渲染流程是什么

这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

相关名词

GPU(Graphic Processor Unit)

图形处理单元

GLSL(OpenGL Shading Language)着色语言

是用来在OpenGL中着色编程的语言,也即开发人员写的短小的自定义程序,他们是在显卡的 GPU 上执行的,代替了固定的渲染管线的一部分,使渲染管线中不同层次具有可编程性。比如:视图转换、投影转换等。GLSL 的着色器代码分成2个部分:Vertex Shader(顶点着色器)和Fragment(片断着色器)

顶点着色器(VertexShader)

一般用来处理图形每个顶点变换(旋转/平移/投影等)

顶点着色器是OpenGL中用于 计算顶点属性 的 程序 。顶点着色器是逐顶点运算的程序,也就是说 每个顶点数据都会执行一次顶点着色器,当然这是 并行 的,并且顶点着色器运算过程中无法访问其他顶点的数据。

一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归一化坐标系的运算,就是在这里发生的。

片元着色器程序(FragmentShader)

一般用来处理图形中每个像素点颜色计算和填充

片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是逐像素运算的程序,也就是说 每个像素都会执行一次片段着色器 ,也是 并行 的。

顶点 & 顶点数据

顶点指的是我们在绘制一个图形时它的顶点位置数据。这个数据可以直接存储在数组中或者将其缓存到GPU内存中。

画图一般是先画好图像的骨架,然后再往骨架里面填充颜色。顶点数据就是图像的骨架,OpenGL中的图像都是由图元组成。在OpenGLES中,有3种类型的图元:点、线、三角形。

顶点数组(VertexArray) & 顶点缓冲区(VertexBuffer)

开发者可以选择设定函数指针,在调用绘制方法的时候,直接由内存传入顶点数据,也就是说这部分数据之前是存储在 内存 当中的,被称为 顶点数组 。而性能更高的做法是,提前分配一块 显存 ,将顶点数据预先传入到显存当中。这部分的显存,就被称为 顶点缓冲区 。

光栅化(Rasterization)

是把 顶点数据转换为片元的过程 ,将图转化为一个个栅格组成的图象。把物体的数学描述以及与物体相关的颜色信息转换为屏幕上用于对应位置的像素及用于填充像素的颜色。

光栅化包含了两部分的工作。第一:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二:分配一个颜色值和一个深度值到各个区域。

纹理

可以理解为图片。

图片加载的工作流程

UIImage *image = [UIImage imageWithContentsOfFile:@"filePath"];

从磁盘中加载一张图片,这个时候的图片并没有解压缩;

imageView.image = image;

然后将生成的 UIImage 赋值给 UIImageView ,这一步确认显示图片,CPU 才开始解码;

接着一个隐式的 CATransaction 捕获到了 UIImageView 图层树的变化;

在主线程的下一个 runloop 到来时,Core Animation 提交了这个隐式的 transaction ,这个过程可能会对图片进行 copy 操作。

受图片是否字节对齐等因素的影响,这个 copy 操作可能会涉及以下部分或全部步骤:

  1. 分配内存缓冲区用于管理文件 IO 和解压缩操作。

  2. 将文件数据从磁盘读到内存中。

  3. 将压缩的图片数据解码成未压缩的 位图 形式。

  4. 最后 Core AnimationCALayer 使用未压缩的位图数据渲染 UIImageView 的图层。

  5. CPU 计算好图片的Frame,图片解压 后就会交给 GPU 来做图片渲染。

解压缩

  1. 解压默认是在 主线程 中执行的。

  2. 图片的解压缩是一个非常耗时的 CPU 操作,所以只有在 确认要显示时,CPU 才会对其进行解压缩。

  3. 解压过的图片会缓存起来,不会重复解压。

  4. 在子线程提前对图片进行强制解压缩,而强制解压缩的原理就是对图片进行重新绘制,得到一张新的解压缩后的位图。其中,用到的最核心的函数是 CGBitmapContextCreate

CPU / GPU渲染过程中具体分工

CPU: 计算视图 frame,图片解码,需要绘制纹理图片通过数据总线交给 GPU

GPU: 纹理混合,顶点变换与计算,像素点的填充计算,渲染到帧缓冲区。

时钟信号: 垂直同步信号V-Sync / 水平同步信号H-Sync。

iOS设备双缓冲机制: 显示系统通常会引入两个帧缓冲区,是 CPU 与 GPU 协作完成的

渲染流程

  1. GPU 获取获取图片的坐标

  2. 将坐标交给 顶点着色器 (顶点计算)

  3. 将图片 光栅化 (获取图片对应屏幕上的像素点)

  4. 片元着色器 计算 (计算每个像素点的最终显示的颜色值)

  5. 从帧缓存区中渲染到屏幕上

感谢各位的阅读!关于"unity3d中图片渲染流程是什么"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0