可编程图形渲染管线

着色程序分为两类:vertex shader program(顶点着色程序)和fragment shader program(片断着色程序)。为了清楚的解释顶点着色和片断着色的含义,我们首先从阐述GPU上的两个组件:Programmable Vertex Processor(可编程顶点处理器,又称为顶点着色器)和 Programmable Fragment Processor(可编程片断处理器,又称为片断着色器)。

顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个可以运行片段程序的单元。

顶点和片段处理器都拥有非常强大的并行计算能力,并且非常擅长于矩阵(不高于4阶)计算,片段处理器还可以高速查询纹理信息(目前顶点处理器还不行,这是顶点处理器的一个发展方向)。

如上所述,顶点程序运行在顶点处理器上,片段程序运行在片段处理器上,哪么它们究竟控制了GPU渲染的哪个过程。图 8展示了可编程图形渲染管线。

对比上一章图 3。中的GPU渲染管线,可以看出,顶点着色器控制顶点坐标转换过程;片段着色器控制像素颜色计算过程。这样就区分出顶点着色程序和片段着色程序的各自分工:Vertex program负责顶点坐标变换;Fragment program负责像素颜色计算;前者的输出是后者的输入。

图 9展示了现阶段可编程图形硬件的输入/输出。输入寄存器存放输入的图元信息;输出寄存器存放处理后的图元信息;纹理buffer存放纹理数据,目前大多数的可编程图形硬件只支持片段处理器处理纹理;从外部宿主程序输入的常量放在常量寄存器中;临时寄存器存放着色程序在执行过程中产生的临时数据。

3.2 Vertex Shader Program

Vertex shader program(顶点着色程序)和Fragment shader program(片断着色程序)分别被Programmable Vertex Processor(可编程顶点处理器)和 Programmable Fragment Processo(可编程片断处理器)所执行。

顶点着色程序从GPU前端模块(寄存器)中提取图元信息(顶点位置、法向量、纹理坐标等),并完成顶点坐标空间转换、法向量空间转换、光照计算等操作,最后将计算好的数据传送到指定寄存器中;然后片断着色程序从中获取需要的数据,通常为“纹理坐标、光照信息等”,并根据这些信息以及从应用程序传递的纹理信息(如果有的话)进行每个片断的颜色计算,最后将处理后的数据送光栅操作模块。

图 10展示了在顶点着色器和像素着色器的数据处理流程。在应用程序中设定的图元信息(顶点位置坐标、颜色、纹理坐标等)传递到vertex buffer中;纹理信息传递到texture buffer中。其中虚线表示目前还没有实现的数据传递。当前的顶点程序还不能处理纹理信息,纹理信息只能在片断程序中读入。

顶点着色程序与片断着色程序通常是同时存在,相互配合,前者的输出作为后者的输入。不过,也可以只有顶点着色程序。如果只有顶点着色程序,那么只对输入的顶点进行操作,而顶点内部的点则按照硬件默认的方式自动插值。例如,输入一个三角面片,顶点着色程序对其进行phong光照计算,只计算三个顶点的光照颜色,而三角面片内部点的颜色按照硬件默认的算法(Gourand明暗处理或者快速phong明暗处理)进行插值,如果图形硬件比较先进,默认的处理算法较好(快速phong明暗处理),则效果也会较好;如果图形硬件使用Gourand明暗处理算法,则会出现马赫带效应(条带化)。

而片断着色程序是对每个片断进行独立的颜色计算,并且算法由自己编写,不但可控性好,而且可以达到更好的效果。

由于GPU对数据进行并行处理,所以每个数据都会执行一次shader程序程序。即,每个顶点数据都会执行一次顶点程序;每个片段都会执行一次片段程序。

3.3 Fragment Shader Program

片断着色程序对每个片断进行独立的颜色计算,最后输出颜色值的就是该片段最终显示的颜色。可以这样说,顶点着色程序主要进行几何方面的运算,而片段着色程序主要针对最终的颜色值进行计算。

片段着色程序还有一个突出的特点是:拥有检索纹理的能力。对于GPU而言,纹理等价于数组,这意味着,如果要做通用计算,例如数组排序、字符串检索等,就必须使用到片段着色程序。让顶点着色器也拥有检索纹理的能力,是目前的一个研究方向。

附:什么是片断?片断和像素有什么不一样?所谓片断就是所有的三维顶点在光栅化之后的数据集合,这些数据还没有经过深度值比较,而屏幕显示的像素都是经过深度比较的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 22:33:35

可编程图形渲染管线的相关文章

【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 图形渲染管线 The Graphics Rendering Pipeline

本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/70544201 这篇文章是解析计算机图形学界"九阴真经总纲"一般存在的<Real-Time Rendering 3rd>系列文章的第二篇.将带来RTR3第二章内容"Chapter 2 The Graphics Rendering Pipeline 图形渲染管线"的总结.概括与提炼. 文章分为全文内

图形渲染管线简介

The Graphics Rendering Pipeline 渲染管线,这章主要讲光栅化渲染管线. 毕业前实习时,也实现过一个简单的软光栅化渲染管线,再复习一下. 在计算机图形学领域,shading指基于表面相对灯光的角度.距灯光的距离.相对于相机的角度和材质的属性等来修改物体/表面/多边形的颜色,进而创造一个具有真实感效果的过程. In computer graphics, shading refers to the process of altering the color of an o

图形渲染管线与shader(更新中)

恢(zheng)复(shi)更(kai)新(shi)后的第一天. 唔-不如来说说图形管线和着色器的事吧.趁着刚给别人讲完.(说来还是一段惨痛的经历-TAT) ? (请自行脑补分割线) ? 着色器,也就是平时各种地方说的shader,是开发者为了开发需求而为GPU(图形处理器)编写的一个小程序.GPU有着高度并行化的特点,但运算的能力就没有CPU那么厉害,无法完成较为复杂的运算.但同时,它往往拥有CPU无法企及的庞大的计算单元数量(Iris 540:48,GTX 980Ti : 2560),这些单

可编程脚本渲染管线SRP

Unity 2018.1 beta中引入的Scriptable Render Pipeline可编程脚本渲染管线,简称SRP.是一种在Unity中通过C#脚本配置和执行渲染的方式.在编写自定义渲染管线之前,必须要先理解渲染管线的含义.本文将帮助你开始学习编写自定义SRP. 本文演示项目,请访问Github下载: https://github.com/stramit/SRPBlog/tree/master/SRP-Demo 什么是渲染管线 渲染管线是将对象显示到屏幕上所需的一系列技术的总称.它包含

[转]OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

直接给出原文链接吧 1.OpenGL图形渲染管线.VBO.VAO.EBO概念及用例 2.OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 3.OpenGL中常用函数详解和VBO VAO详解以及VAO的使用 原文地址:https://www.cnblogs.com/rainbow70626/p/11781336.html

浅谈 GPU图形渲染管线

 图形渲染管道被认为是实时图形渲染的核心,简称为管道.管道的主要功能是由给定的虚拟摄像机.三维物体.灯源.光照模型.纹理贴图或其他来产生或渲染一个二维图像.由此可见,渲染管线了实时渲染技术的底层工具.图像中物体的位置及形状是通过它们的几何描述.环境特征.以及该环境中虚拟摄像机的摆放位置来决定的.物体的外观受到了材质属性.灯源.贴图以及渲染模式(sharding modles)的影响.         很多计算机图形学的书籍都把渲染管线分为三个阶段:应用程序阶段.几何阶段.光栅化阶段. 1.  应

(转载)(官方)UE4--图像编程----图形编程总览

图形编程总览 入门 虚幻引擎 4(UE4)中有许多渲染代码,因此要通过粗略的观察来迅速了解渲染状况是较为困难.阅读代码时,比较好的入手之处是"FDeferredShadingSceneRenderer::Render",这是渲染线程中渲染新帧之处.此外,执行 profilegpu 命令并查看绘制事件也很有帮助.然后,您可以在 Visual Studio 中对绘制事件名称进行 Find in Files 操作,找出对应的 C++ 实现. 请参阅 着色器开发 了解更多关于着色器使用的信息.

实时渲染(一)——图形渲染管线

在渲染管线中是最慢的阶段决定整个渲染的速度. 我们一般使用吞吐量(throughput)来描述一个阶段的处理速度,而不是帧率.因为帧率会受到设备更新的限制而导致实际速度比帧率所标示的更慢. 一个例子: 假设一个设备为60赫兹,这意味着这个设备16.666666ms刷新一次,这时恰好有一管线阶段花费了62.5ms执行完成,由于63大于16.666666*3,小于16.666666*4,所以他实际上想要最终完成工作必须等待下一次设备刷新.所以真实的执行时间折算下来其实不止62.5ms而是趋近于66m

Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)

写在前面的废话: 这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习..感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始. 正文开始: 首先Graphics Pipeline只接收一系列的3D坐标(x,y,z)但是每个使用者的屏幕又只能显示2D像素,比如我的显示器的分辨率(2880X1440)仅仅只存在x和y轴即长和宽.所以我们的opengl 通过接收过来的3D数据会通过Graphics Pipeline转换成有色2D屏幕上的数据.——————Graphics Pi