0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPU管线各个阶段知识点详细的分析理解

Dbwd_Imgtec 来源:未知 作者:胡薇 2018-04-28 16:28 次阅读

GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段。GPU管线涵盖了渲染流程的几何阶段和光栅化阶段,但对开发者而言,只有对顶点和片段着色器有可编程控制权,其他一律不可编程。

简单总结GPU管线,这阶段中主要是对图元进行操作。首先,将由应用阶段加载到显存中的顶点数据(由drawCall指定后)作为输入传递给顶点着色器。接着,顶点着色器首先对图元的每个顶点设置模型视图变换及投影变换(即右乘MVP矩阵),然后将变换后的顶点按照摄像机视椎体定义(即透视投影,或正投影)进行裁剪,将不在视野内的顶点去掉并剔除某些三角面片。最后到几何阶段的屏幕映射,负责把修改过的图元的坐标转换到屏幕坐标系中(即投影到屏幕上)。

到光栅化阶段,这一阶段主要目的是将每个图元转换为多个片段,并生成多个片段的位置,由片段着色器负责计算每个片段的颜色值。同时,在这阶段片段着色器通常会要求输入纹理,从而对每个片段进行着色贴图。每个片段在被发送到帧缓冲区之前,还会经历一些操作,这些操作可能会修改片段的颜色值,其中包括深度测试,模板测试,像素所有权测试,与当前缓冲区相同位置颜色混合等等。

最后,帧缓冲区内容被交换到屏幕进行显示。

下面会对各个阶段每个知识点进行详细的分析理解。

一、顶点着色器

顶点着色器是一段类似C语言的程序(即OpenGL的GLSL,或只支持微软的HLSL,或Unity的Cg),由程序员提供并在GPU上执行,对每个顶点都执行一次运算。顶点着色器可以使用顶点数据来计算改顶点的坐标,颜色,光照和纹理坐标等。在渲染管线中,每个顶点都独立的被执行。原因在于顶点着色器本身不能创建或删除顶点,也无法得到顶点与顶点之间的关系,如无法知道两个顶点是否属于同一个三角网格。正因这独立性,GPU可以并行化处理每一个顶点,提高处理速度。

顶点着色器最重要的功能是执行顶点的坐标变换和逐顶点光照。坐标变换是改变顶点的位置,把顶点坐标从模型空间转换到齐次裁剪空间(即将本地坐标系转换为裁剪坐标系)。通过改变顶点位置可以实现很多酷炫的shader效果,如模拟水面,布料等等,这里后面添加实例学习例子再详细说明。顶点着色器的另一功能是向后续阶段的片段着色器提供一组易变(Varying)变量,用于插值计算。

二、图元装配

在顶点着色器程序输出顶点坐标之后,各个顶点按照绘制命令(DrawArrays或DrawElements)中的图元类型参数和顶点索引数组被组装成一个个图元,并对其进行如下图的图元操作:

裁剪,处于视椎体以外的图元将被丢弃,若该图元与视椎体相交则会发生裁剪产生新图元,如下图:

注意一点,透视裁剪是比较影响性能的过程,因为每个图元都需要和6个裁剪面进行相交计算并产生新图元。所以一般在x轴,y轴超出屏幕(由glViewPort定义)的部分,这些顶点在视口变换的时候被更高效的直接丢弃,无须产生新图元。

视椎体在OpenGL中可以通过gluPerspective来定义对应的大小结构,在Cocos2dx引擎中,Director类的setProjection方法就定义了cocos的渲染用到的视椎体,大家可以阅读对应的代码了解学习下。

经过视椎体裁剪后的顶点坐标经过透视分离(指由硬件做透视除法),得到范围是[0,1]的归一化的设备坐标,最后映射到屏幕或者视口上。

三、片段着色器

补充:其实在光栅化之前,要判断图元的朝向,是面向还是背对观察者,以决定是否需要丢弃图元。在OpenGL可通过glFrontFace指令来决定哪个方向为正,并通过glCullFace决定需要保留哪一面(别忘了要先打开剔除状态设置才可以调用指令 glEnable(GL_CULL_FACE);)。这样设计的好处是能减少一些不必要的绘制,并减少对GPU的浪费。

回到正题,片段着色器同上述的顶点着色器,只是它作用的对象是每一片段,对其进行着色贴图。片元着色器的输入是根据那些从顶点着色器中输出的数据插值得到的,其中最重要的渲染技术之一是纹理采样。在顶点着色器阶段输出每一顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点各自纹理坐标进行插值运算后便得到其覆盖片元的纹理坐标,从而在片元着色器中进行纹理采样。如下图:

四、逐片元操作

这里篇幅原因不一一分析每种测试操作,大家可以通过看书了解对应的用途。下面举混合操作来分析一下。下图是简化流程图:

对于不透明的物体,可以直接关闭混合Blend操作,这样片元着色器计算得到的颜色值直接覆盖更新缓冲区的颜色值。但对于半透明物体就必须开启使用混合操作从而让物体看起来是透明的。开发过程中无法得到透明效果的原因,往往有可能是没有开启混合功能的原因。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4402

    浏览量

    126562
  • OpenGL
    +关注

    关注

    1

    文章

    84

    浏览量

    29021

原文标题:GPU渲染之OpenGL的GPU管线

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    运放知识点

    `运放知识点`
    发表于 08-20 20:58

    【信盈达】C语言知识点的总结

    一、嵌入式C/单片机C/标准C知识点知识点1:嵌入式C、标准C、单片机C区别知识点2:程序组成和程序原则知识点3:变量类型(函数、数组、指针、结构体等类型)知识点4:常用的运算符和关系
    发表于 10-08 14:41

    使用PADS软件进行PCB设计,有哪些基础知识点

    使用PADS软件进行PCB设计,有哪些基础知识点?发现知识点很多、很杂、很乱,有没有聚合归纳统一的内容给到
    发表于 08-20 12:07

    电机与电气控制基础的知识点

    电机就是我们平时俗称的“马达”,电机是依据电磁感应定律实现电能转换或传递的一种电磁装置。电机的主要作用是产生驱动转矩,作为用电器或各种机械的动力源。而电机与电气控制技术的一些基础的知识点是不论是在学习还是工作中都是需要牢记的。今天分享的就是关于电机与电气控制基础的一些基本的知识点
    发表于 01-22 06:54

    嵌入式Linux内存管理知识点

    这个内存管理的知识点还真的需要我们专门的去理解一下,今天大家一起来学习学习嵌入式Linux内存管理的知识
    发表于 03-04 06:22

    电机与拖动知识点及其试题

    电机与拖动知识点分析一、基本知识与基础知识知识点常考题目二、直流电机一、基本知识与基础
    发表于 06-29 07:10

    关于RTC时钟的知识点

    :STM32之RTC实时时钟这个里面比较详细,还添加了例程。STM32 RTC实时时钟这个链接里面详细讲述RTC中的主要的几个寄存器。下面记录一些关于rtc的知识点:RTC 时钟源 (R...
    发表于 08-11 08:27

    STM32外部中断的知识点

    STM32_外部中断,从程序入手,深度解读每条程序,理解知识点
    发表于 08-13 08:57

    STM32外部中断知识点概述

    STM32外部中断概述知识点(1)知识点(2)知识点(3)中断服务函数外部中断常用库函数外部中断的一般配置步骤知识点(1)STM32的每个IO都可以作为外部中断输入。STM32的中断控
    发表于 08-16 07:43

    关于蓝牙模块基础知识点介绍的太详细

    关于蓝牙模块基础知识点介绍的太详细
    发表于 10-08 06:56

    萌新求助,求大神详细解析单个光耦的硬件电路的知识点

    萌新求助,求大神详细解析单个光耦的硬件电路的知识点
    发表于 10-14 08:14

    萌新求助,求大佬详细介绍霍尔信号/编码器信号与电机转向的知识点

    萌新求助,求大佬详细介绍霍尔信号/编码器信号与电机转向的知识点
    发表于 10-19 06:31

    STM32F407VGT单片机各类知识点介绍

    单片机型号:STM32F407VGT本章为系列指南第一章,主要是介绍一下项目思路,并且尽可能列出从零开始着手开发这个项目过程中,所需要理解的各类知识点,关于这些知识点,如果需要更详细
    发表于 01-19 08:17

    v4l2_pipeline_pm_use的知识点分析,错过后悔

    v4l2_pipeline_pm_use的知识点分析,错过后悔退出while循环的条件是什么?
    发表于 03-10 06:39

    Python的知识点总结详细说明

    本文档的主要内容详细介绍的是Python的知识点总结详细说明。
    发表于 09-29 17:13 14次下载
    Python的<b class='flag-5'>知识点</b>总结<b class='flag-5'>详细</b>说明