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连接谷歌云盘的时候卡壳了,可是把明月给难为坏了,搜索到的简体中文教程倒是很多,但没有一个提到这个“坑”,最…

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

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

基于Matlab的数据可视化

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

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

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

C#中的栈和队列

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

安卓篇-unidbg初步测试

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

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

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

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

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

【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;包括逐周期过流保护、过载保护、软启动、芯片过温保护、可编程输出过压保护功能…

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

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

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

《从C/C++到Java入门指南》- 17.命令行参数

命令行参数 一直写代码的童鞋可能留意到了&#xff0c;main函数中会传入一个String args[]的字符串数组。 这个数组由JVM接收用户输入并传给main函数。 import java.util.*; public class Main {public static void main(String[] args) {for (String arg : args) {System.out…

FLINK-运行架构

为什么要学习Flink运行架构&#xff1f; 虽然现在大厂的开发工具都非常高效、只需要进行参数配置、Flink-sql写业务逻辑&#xff0c;但是在资源配置逻辑优化上不可避免需要了解底层的组件配置。面试时可能也会被问到FLINK是如何进行资源分配、作业运行的等。 以下是在学习时记录…

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…

Python学习—open函数,json与pickle知识点,Os模块详解

目录 1. Open函数 2.json与pickle模块 json模块 1. json.dumps() 2. json.dump() 3. json.loads() 4. json.load() pickle 模块 1. pickle.dumps() 2. pickle.dump() 3. pickle.loads() 4. pickle.load() 3.Os模块 1. Open函数 在Python中&#xff0c;open() 函数…

Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署

目录 环境准备 导入项目包 配置jenkins 构建项目 配置项目上线 修改项目代码测试 环境准备 本实操项目环境基于https://blog.csdn.net/Lzcsfg/article/details/140359830 首先在node01主机中操作&#xff0c;本次操作需要java8的版本&#xff0c;将之前安装的java17卸…

IoTDB 分段查询语句详解:GROUP BY + 时序语义

GROUP BY 查询子句的时序语义展开&#xff0c;IoTDB 支持的分段方式总结&#xff01; 存储的数据通过分析来发挥价值&#xff0c;当一组被存储的数据通过查询得到分析后的结果时&#xff0c;这些数据才真正在数据库中实现了价值闭环。 在关系型数据库中&#xff0c;GROUP BY 子…