首页 > 其他分享 >第二章 渲染流水线

第二章 渲染流水线

时间:2023-06-22 22:12:33浏览次数:20  
标签:渲染 像素 片元 顶点 流水线 第二章 着色器

第二章 渲染流水线

目录

渲染流水线

渲染流水线是一个概念上的流水线,它与GPU流水线不同,渲染流水线并不在硬件上实现。

1. 应用阶段

①准备好所有的场景数据,例如摄像机的位置、视锥体、模型、光源等。
②为了提高渲染的性能,我们还要进行一个culling(剔除)的工作,比如:一个三角形有两个面,通常后面的面是不可见的,这就利用了backface-culling 的思想。
③设置渲染的状态,比如材质、纹理、Shader等
④输出渲染图元

2. 几何阶段

处理图元信息,将其转化为顶点的信息。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一个阶段。

3. 光栅化阶段

根据传来的屏幕顶点信息,逐像素处理。

CPU与GPU之间的通信

1. 把数据加载到显存中

渲染所需的数据从硬盘中加载到内存(RAM),再从内存中加载到显存(VRAM),具体如下图所示。

2. 设置渲染状态

渲染状态定义了场景中的网格是怎么被渲染的。比如:

  • 使用哪个顶点顶点着色器(Vertex Shader),用于确定顶点位置。
  • 使用哪个片元着色器(Fragment Shader),用于指定颜色、光照、阴影等效果。
  • 使用什么光源
  • 使用什么材质
    如下图所示

3. 调用draw call

CPU向GPU发出一个draw call, GPU根据手头的数据和渲染状态,开始进行渲染。

GPU流水线

接下来,我们将对所有的流水线阶段进行详细的解释。

顶点着色器

顶点着色器的主要任务是:坐标变换和逐顶点光照

坐标变换将模型坐标转移到齐次裁剪坐标系

裁剪

由于我们的场景很大,其中有很多图元并不完全在视野内。我们将这些图元分成三类:

  • 完全在视野内:直接传递给下一个阶段。
  • 完全不在视野内:不需要传递。
  • 不完全在视野内:视野内的顶点保留,视野外的顶点去掉,图元与坐标系边界的交点变成新的顶点。这个过程叫做裁剪。
    具体如图

屏幕映射

从齐次裁剪坐标系转换到屏幕坐标系,根据屏幕大小进行缩放。这个变换保留了(x,y)的值。
但同时,z的值并不会被抛弃,它决定了顶点的深度,也就决定了谁覆盖谁的问题。z值和屏幕坐标系共同组成了窗口坐标系

三角形设置

从三角形设置阶段就进入了光栅化阶段。光栅化阶段有两个最重要的目标:计算每个图元覆盖了哪些像素,以及为这些像素计算它们的颜色。
在上一个阶段我们得到了三角形的顶点坐标,但是只有顶点坐标是无法画出三角形的,我们需要对给定的两个顶点,求出他们连线所经过的所有像素坐标。为下一个阶段做准备。

三角形遍历(扫描变换)

逐像素检查每个像素是否被一个三角形覆盖,如果是的话,就生成一个片元。

片元着色器

前面的光栅化阶段实际上并不会影响屏幕上每个像素的颜色值,而是会产生一系列的数据信息,用来表述一个三角网格是怎样覆盖每个像素的。而每个片元就负责存储这样一系列数据。真正会对像素产生影响的阶段是下一个流水线阶段——逐片元操作(Per-Fragment Operations) 。
片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器中输出的数据插值得到的。而它的输出是一个或者多个颜色值。

逐片元操作

逐片元操作是OpenGL里面的说法,在DX中用输出合并阶段来表示。
这一阶段的主要任务有:
①确定每个片元的可见性,通过深度测试、模板测试等确定
②将所有通过测试的片元存入颜色缓冲区进行混合

模板测试通常用于限制渲染的区域。

对于不透明物体,开发者可以关闭混合(Blend) 操作。这样片元着色器计算得到的颜色值就会直接覆盖掉颜色缓冲区中的像素值。但对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的。

总结:什么是Shader

  • Shader是GPU流水线上一些可高度编程的阶段。
  • 一些特定位置的着色器,如顶点着色器、片元着色器。
  • 依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传递数据,用片元着色器来进行逐像素的渲染。

标签:渲染,像素,片元,顶点,流水线,第二章,着色器
From: https://www.cnblogs.com/anchuan114/p/17498386.html

相关文章

  • 关于 Spartacus 服务器端渲染的 404 Not found 页面处理
    当启动Spartacus时,路由由Router逻辑处理。将评估四种不同类型的路由:路由应由自定义路由路径处理;客户添加了硬编码路由,并且我们应该优先考虑这些路由。路由是PLP(产品列表页)或PDP(产品详情页)。路由是CMS(内容管理系统)内容页面。路由是未知的(404页面未找到)。当向Sparta......
  • [Leetcode] 0733. 图像渲染
    733.图像渲染点击上方,跳转至leetcode题目描述有一幅以 mxn 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。你也被给予三个整数sr, sc和newColor。你应该从像素 image[sr][sc] 开始对图像进行上色填充。为了完成上色工作,从......
  • 第三章 流水线技术
    3.1流水线的基本概念3.1.1什么是流水线流水线技术把一个重复的过程分解为若干个子过程,每个子过程由专门的功能部件来实现。把多个处理过程在时间上错开,依次通过各功能段,这样,每个子过程就可以与其他的子过程并行进行。流水线中的每个子过程及其功能部件称为流水线的级或段,段与......
  • C++ primer plus学习之第二章
    1.引用:intival=1024;int&refval=ival;//正确,refval时ival的别名int&re;//错误,引用必须被初始化int&ii=42;//错误:不能为非常量引用绑定字面值constint&ii=42;//正确:可以为常量引用绑定字面值2.初始化空指针int*p=0;int*p=NULL;int*p=nullptr;//最好用这个任何非零指......
  • 利用react-json-view最JSON数据进行渲染
    1.安装npminstall--savereact-json-view2.使用importReactJsonfrom"react-json-view";constA=()=>{letsrc={"content-length":"675","x-b3-parentspanid":"06c634eea567252a",&quo......
  • Three.js教程:动画渲染循环
    推荐:将NSDT场景编辑器加入你的3D工具链其他系列工具:NSDT简石数字孪生动画渲染循环threejs可以借助HTML5的API请求动画帧window.requestAnimationFrame实现动画渲染。请求动画帧window.requestAnimationFrame//requestAnimationFrame实现周期性循环执行//requestAnimationF......
  • React - 07 类组件的渲染逻辑
    1.ES6类的知识ES6类的继承2.创建类组件创建类组件创建一个构造函数(类)+要求必须继承React.Component/PureComponent这个类+我们习惯于使用ES6中的class创建类「因为方便」+必须给当前类设置一个render的方法「放在其原型上」:在render方法中,返回需要渲染的......
  • Vue实战(09)-列表渲染:让你的页面秒变爆款!
    1最基础的循环<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Vue中的列表渲染</title><scriptsrc="../vue.js"></script></head><body>......
  • keyshot10免费下载-keyshot10(3D动画渲染)软件 软件大全
    KeyShot10添加了新的关键帧动画和其他动画功能、用于输出到全彩3D打印、AR/Web交互等的新智能导出选项、新的灯光管理器和用于更好地控制几何和模型的新工具、RealCloth2.0和改进焦散以获得更逼真的材料和照明,以及改进的降噪和萤火虫过滤器以加快视觉创建。KeyShot10继续......
  • 一文看完Vue3的渲染过程
    Vue3官网中有下面这样一张图,基本展现出了Vue3的渲染原理:本文会从源码角度来草率的看一下Vue3的运行全流程,旨在加深对上图的理解,从下面这个很简单的使用示例开始:import{createApp,ref}from"vue";createApp({template:`<divclass="card"><butt......