GPU渲染管线概述

1.顶点着色器

顶点着色器是流水线的第一个阶段,它的输入来自于CPU。顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器。
顶点着色器需要完成的工作主要有:坐标变换和逐顶点光照。当然,除了这两个主要任务外,顶点着色器还可以输出后续阶段所需的数据。
坐标变换,顾名思义,就是对顶点的坐标进行某种变换。例如我们可以通过改变顶点位置来模拟水面,布料等。
一个最基本的顶点着色器必须完成的一个工作是:把顶点坐标从模型空间转换到齐次剪裁空间。类似下面代码:

o.pos=mul(UNITY_MVP,v.position);

2.裁剪

由于我们的场景可能会很大,而摄像机的视野范围很有可能不会覆盖所有的场景物体,一个很自然的想法就是,那些不在摄像机视野范围内的物体不需要被处理,而裁剪就是为了完成这个目的而被提出来的。
一个图元和摄像机的关系有3种:

  • 完全在视野内
  • 部分在视野内
  • 完全在视野外
    部分在视野内的图元需要裁剪,例如一条线段的一个顶点在视野内,而另一个顶点在视野外,那么视野外部的顶点应该使用一个新的顶点来代替,这个新的顶点位于这条线段和视野边界的交点处。

3.屏幕映射

这一步输入的坐标仍然是三维坐标系。屏幕映射的任务是把每个图元的x和y坐标转换到屏幕坐标系下,屏幕坐标系是一个二维坐标系,它和我们用于显示画面的分辨率有很大关系。
屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远。
opengl的屏幕坐标原点是左下角,而directx是左上角,如果你发现你得到的图像是倒转的,那么很有可能就是这个原因造成的。

4.三角形设置

由这一步就进入了光栅化阶段,从上一个阶段输出的信息是屏幕坐标下的顶点位置以及和它们相关的额外信息,如深度值、法线方向、视角方向等,光栅化有两个最重要的目标:计算每个图元覆盖了哪些像素,以及为这些像素计算他们的颜色。光栅化的第一个流水线阶段是三角形设置,这个阶段会计算光栅化一个三角网格所需的信息。
具体来说,上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角形网格表示数据的过程就叫做三角形设置,它的输出是为了下一个阶段做准备。

5.三角形遍历

三角形遍历阶段将会检查每个像素是否被一个三角形网格所覆盖。如果被覆盖的话,就会生成一个片元,而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换。
三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。

6.片元着色器

片元着色器是另一个非常重要的可编程着色器阶段,片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器输出的数据插值得到的。而它的输出是一个或多个颜色值。
这一阶段可以完成很多重要的的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然和经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹理坐标了。

7.逐片元操作

逐片元操作是opengl中的说法,在directx中,这一阶段被称为输出合并阶段。
这一阶段有几个主要任务:

  • 决定片元的可见性。涉及很多测试工作,如深度测试,模版测试等。
  • 如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行合并

    至此,整个GPU渲染管线就结束了。

转载于:https://www.cnblogs.com/qiaogaojian/p/6507544.html

### Android GPU 渲染管线解析 在 Android 中,GPU渲染管线是一个复杂的多阶段过程,涉及多个层次的抽象和操作。以下是关于 Android GPU 渲染工作流的关键点: #### 1. **Render Hardware Interface (RHI)** Android 使用 Render Hardware Interface 来抽象不同平台上的图形 API 差异[^1]。所有的渲染命令都会通过 RHI 层传递并被翻译成适用于具体渲染器的指令。这意味着开发者可以编写一次代码,并让其运行于多种底层图形接口之上。 #### 2. **图像调整与缩放** 当涉及到图像尺寸变化时,存在两种主要的操作模式:`resizing` 和 `scaling`[^2]。 - **Resizing**: 这是一种软件级别的管道操作,会返回一个新的位图对象,该对象具有不同的分辨率。 - **Scaling**: 则是在画布级别完成的一种通常由硬件加速的操作,原始位图保持不变,只是绘制过程中进行了放大或缩小。 对于 Android 应用程序来说,在决定采用哪种方法之前需要考虑具体的场景需求以及性能影响。 #### 3. **Pipeline State Object (PSO)** 类似于 DirectX 12 所引入的概念,现代图形框架也会定义自己的 Pipeline State Objects(Pipeline States)[^3]。虽然定义可能略有差异,但核心理念相同——即预先配置好整个渲染管线的状态设置以提高效率。此状态包含了诸如着色器、输入布局以及其他资源绑定的信息。 #### 4. **CPU & GPU 协同作用下的引擎管线** 在一个完整的游戏或者应用开发环境中,渲染不仅仅依赖于 GPU 能力;实际上它还牵涉到了大量的 CPU 计算来准备数据供 GPU 处理[^4]。例如 Unreal Engine 每帧执行超过二十次以上的 pass 操作,每次的结果都将作为下一轮计算的基础输入给定至相应的 shader 函数当中去。 #### 5. **优化考量因素** 针对 GPU 性能调优方面需要注意的是实际表现往往受到诸多变量的影响而难以简单评估[^5]。尽管厂商提供了诸如每秒钟可处理多少个顶点/像素这样的理论数值指标,但由于流水线内部各环节之间相互依存关系的存在使得最终效果远比单纯罗列参数更为复杂。因此,在进行任何类型的性能改进前都需要先做好详尽的度量分析工作。 ```java // 示例代码展示如何启用 GPU Profiler 在 Android Studio 中查看渲染情况 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 启动 GPU Profiler 查看当前设备上的渲染性能 Debug.startMethodTracing("gpu_rendering"); // 假设此处有大量绘图逻辑... Debug.stopMethodTracing(); } } ``` 以上就是有关 Android 平台上 GPU 渲染流程的一个概述说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值