Shader入门精要总结(一)渲染流水线

渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。
流水线主要分成三个阶段:应用阶段,几何阶段,光栅化阶段。(概念)

一.概述

在这里插入图片描述

1. 应用阶段

 这个阶段由应用主导,通常由CPU负责,开发者对这个阶段拥有绝对控制权。
在这一阶段,主要有三个任务

  • 首先,需要准备好场景数据,例如相机,视椎体,场景中的模型,光源
  • 其次,为了提高渲染性能,需要做一个粗粒度剔除的工作,把那些不可见的物体剔除,这样就不再需要移交几何阶段
  • 最后,设置好每个模型的渲染状态,包括但不限于使用的材质,使用的纹理,使用的shader ,最终输出渲染图元,即渲染所需几何信息,一般是点,线,三角面等,这些图元最终会被传递到下一阶段。

2. 几何阶段

几何阶段用于处理所有和我们要绘制的几何相关的事情,这一阶段通常在GPU进行

3. 光栅化阶段

这一阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并输出最终的图像,这一阶段也是在GPU进行

二.CPU和GPU通信

在这里插入图片描述

1. CPU流水线

渲染流水线的起点是CPU,即应用阶段,大致三个阶段

  • 把数据加载到显存,例如顶点位置信息,法线方向,顶点颜色,纹理坐标等
  • 设置渲染状态,这些状态定义了场景中的网格是怎样被渲染的
  • 调用drawcall

2. GPU流水线

主要是几何阶段和光栅化阶段。
GPU的流水线接收顶点数据作为输入,这些顶点数据由应用阶段加载到显存,再由drawcall指定。
顶点着色器,通常用于实现顶点的空间变换,顶点着色等功能,完全可编程
曲面细分着色器,一个可选的着色器,它用于细分图元。
几何着色器,一个可选的着色器,它可被用于执行逐图元的着色操作,或者用于产生更多的图元。
裁剪,将不在摄像机视野范围内的顶点裁剪掉,并剔除某些三角图元的面片,此阶段可配置
屏幕映射,负责把每个图元的坐标转换到屏幕坐标系中,不可配置和编程

1. 几何阶段

  1. 顶点着色器
     输入来自CPU,处理单位是顶点,输入进来的每一个顶点都会调用一次顶点着色器,其本身不能创建或销毁任何顶点,而且无法得到顶点与顶点之间的关系,正是因为其相互独立性,GPU可以利用本身的特性并行化处理每一个顶点,这意味着这一阶段的处理速度会很快。
     主要工作是坐标变换逐顶点光照
    坐标变换,顶点着色器可以在这一步改变顶点的位置,最基本的工作是,把顶点坐标从模型空间转换到齐次裁剪坐标空间
    o.pos = UnityObjectToClipPos(v.vertex),接着再由硬件做透视除法最终得到归一化的设备坐标NDC
    在这里插入图片描述
  2. 裁剪
    在这里插入图片描述
  3. 屏幕映射
    此步的输入坐标仍然是三维坐标系下的坐标,其任务是把每个图元的x和y坐标转换到屏幕坐标系
    由于输入的坐标范围在-1到1,因此过程实际是一个缩放的过程。
    屏幕映射不会对z坐标做任何处理,屏幕坐标系和z坐标一起构成了一个坐标系,叫窗口坐标系
    屏幕映射得到的屏幕坐标决定了这个顶点对应屏幕上哪个像素以及距离这个像素有多远

2. 光栅化阶段

从上一个阶段输出的信息是屏幕坐标系下的顶点位置以及它们相关的额外信息,如z坐标(深度值),法线方向,视角方向等。
此阶段有两个重要目标:

  1. 计算每个图元覆盖了哪些像素
  2. 以及为这些像素计算它们的颜色
  • 三角形设置
    这个阶段会计算光栅化一个三角形所需的信息。
    上一阶段输出的都是三角网格的顶点,即三角网格每条边的两个端点,但如果要得到整个三角形网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标,为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式,此过程就叫三角形设置

  • 三角形遍历
    此阶段将会检查每个像素是否被一个三角形网格所覆盖,如果被覆盖,就生成一个片元,这个阶段也被称为扫描变换
    其会使用三角网格的3个顶点信息对整个覆盖区域的像素进行插值
    在这里插入图片描述
    此步输出得到一个片元序列,一个片元并不是真正意义上的像素,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色,这些状态包括但不限于屏幕坐标,深度信息,以及几何阶段输出的顶点信息,法线,纹理坐标等。

  • 片元着色器
    前面的阶段并不会影响屏幕上每个像素的颜色值,而是会产生一系列数据信息,用来表述一个三角网格是怎样覆盖每个像素的。
    这一阶段可以完成很多重要渲染技术,其中最重要的技术之一是纹理采样。
    片元着色器只能影响单个片元

  • 逐片元操作
    此阶段的任务主要有

  1. 决定每个片元的可见性,这涉及很多测试工作,例如深度测试,模板测试等
  2. 如果一个片元通过了所有测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区的颜色进行混合
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debian Linux下rclone挂载谷歌云盘碰到的坑

可能是明月好久没有使用境外服务器挂载境外的云盘缘故吧,今天一个代维客户需要他的Linux服务器挂载谷歌云盘好进行云备份,本来是个很简单的事儿,没想到在rclone连接谷歌云盘的时候卡壳了,可是把明月给难为坏了,搜索到的简体中文教程倒是很多,但没有一个提到这个“坑”,最…

【C++】位运算与相关算法问题

1.基础的位运算 在位运算中,比较重要的就是1.按位与(&),2.按位或(|),3.按位异或(^)。 &:有0则为0。 |:有1则为1。 ^:&…

秋招突击——7/20——科大讯飞笔试相关——提前{图像叠加、世界杯积分问题、直角三角形个数}——正式{持续输出中位数,二次幂和三次幂的序列表示}

文章目录 引言提前图像叠加世界杯积分问题个人实现参考实现 直角三角形个数个人实现 正式等待时间期望值中位数输出个人实现 二次幂和三次幂序列个人实现 总结 引言 昨天用了牛客网做了一下作业帮的笔试,做的一塌糊涂,但是提醒我要练习使用牛客网的环境…

HJ99 自守数

HJ99 自守数 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 625,76^2 5776,9376^2 87909376。请求出n(包括n)以内的自守数的个数 数据范围: 1≤𝑛≤10000 1≤n≤10000 输入描述: i…

基于Matlab的数据可视化

基于Matlab的数据可视化 一、二维图形的绘制(一)基本图形函数(1)plot函数(2)fplot函数(3)其他坐标系的二维曲线 (二)图形属性设置(1)线…

c++应用网络编程之四Linux常用的网络IO模型

一、网络IO模型的实际应用 在前面学习了基本的网络IO模型,那么这种抽象的网络IO模型如何在实际的编程中应用呢?这其实就是理论与实际如何产生联系的一个过程。在现实世界中,有了理论的指导,下一步就是要把相关的理论如何与具体的…

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中,HTTP(HyperText Transfer Protocol&…

C#中的栈和队列

什么是栈 栈和队列是非常重要的两种数据结构,在软件设计中应用很多。栈和队列也是线性结构,线性表、栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到眼制。栈的操作只能在表的一端进行,队列的插入操作在表…

安卓篇-unidbg初步测试

前言:目前app的进度是c层的md5魔改 已经做好,又套了一层java层的加密。刚好可以再熟悉一下unidbg 最新版的app ,作为demo测试一下。 分析先看下app 的反编译的结果,很明显,源码很清晰 ,之前的混淆方式一点用没有。 然后跳过去 /* loaded from: classes4.dex */ public c…

HALCON数据结构

一、HALCON数据结构简介 1、HALCON中有两类参数:图形参数和控制参数。 2、HALCON算子参数中,图形输入参数、图形输出参数、控制输入参数和控制输出参数。 3、图形参数有:图像(image)、区域(region)和轮廓(XLD) 4、控制参数有:…

FPGA实验5:4位加法计数器

实验目的及要求 掌握时钟信号、进程和BUFFER端口的运用;了解计数器的设计、仿真和硬件测试,进一步熟悉VHDL语句、语法及应用等。 实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计4位加法计数器,进行波形仿真和分析、引脚分配…

人工智能与机器学习原理精解【2】

文章目录 机器学习基础一般化流程回归线性回归julia实现最小二乘法原理最小二乘法的原理线性回归中的最小二乘法最小二乘法的优点与局限性最小二乘法算法过程一、线性回归模型二、目标函数三、求解算法四、算法步骤四、计算公式五、注意事项 回归理论概述回归的基本概念回归模型…

4 Java的基本程序设计结构(基本语法3)- 字符串、面向对象(进阶)

文章目录 前言一、java中的 究竟比较的是什么?二、字符串1 String(1)String的两种构造方式(2)字符数组转字符串、字节数组转字符串(3)字符串的 拼接(4)字符串的内存结构…

2024睿抗机器人开发者大赛CAIP编程赛题解(c++)

题目地址(补题) PTA | 程序设计类实验辅助教学平台 RC-u1 热҈热҈热҈ 简单模拟题&#xff0c;没什么好说的 : #include<bits/stdc.h> using namespace std ; const int N 55 ;int a[N] ;int main(){int n , w ; cin >> n >> w ;for(int i1;i<n;i)…

【Android面试八股文】荣耀面试算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵

文章目录 1. 算法题:输入一个N阶方阵(0<N<10),输出此方阵顺时针旋转M(0<=M<=10000)次后的方阵1.1 题目描述1.2 算法实现1.2.1 步骤说明:1.2.2 算法实现1.2.3 代码实现:1.2.4 程序说明:1.2.5 示例详细讲解如何将一个矩阵顺时针旋转90度1. 算法题:输入一个N阶方…

Spring -- 三层架构

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 应用分层 介绍 在阿里的开发手册里,关于工程结构部分,定义的常见工程的应用分层结构 那么什么是应用分层呢? 应用分层是一种软件开发设计思想,他将应用程序分层N个层次.这N个层次分别负责各…

Oracle小白菜鸟从入门到精通教程

前言 Oracle公司&#xff08;甲骨文&#xff09;是全球最大的信息管理软件及服务供应商&#xff0c;成立于1977年&#xff0c;总部位于美国加州Redwood shore&#xff0c;面向全球开放oracle认证。Oracle开发的关系数据库产品因性能卓越而闻名&#xff0c;Oracle数据库产品为财…

Hi6274 反激式20瓦电源芯片

HI6274为高性能多模式 PWM 反激式20瓦电源芯片。HI6274较少的外围元器件、较低的系统成本可设计出高性能的"无Y"开关电源。HI6274提供了极为全面和性能优异的智能化保护功能&#xff0c;包括逐周期过流保护、过载保护、软启动、芯片过温保护、可编程输出过压保护功能…

云原生项目纪事系列 - 项目管理的鲜活事例

大规模云原生系统的新颖性、建设性和挑战性&#xff0c;吸引着许多有数学思想、哲学意识和美学观念的系统架构师&#xff0c;老模也是其中一员。 老模即是文史家庭出身&#xff0c;又有理工学业背景&#xff0c;他基于平时记录的翔实细节&#xff0c;秉持客观原则&#xff0c;使…

【Langchain大语言模型开发教程】记忆

&#x1f517; LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Langchain的历史记忆 ConversationBufferMemory 2、基于窗口限制的临时记忆 ConversationBufferWindowMemory 3、基于Token数量的临时记忆 ConversationTokenBufferMemory 4、基于历史…