图形学之Unity渲染管线流程分析
作者:小紫苏 发布时间:2023-09-25 05:27:36
下图是《Unity Shader 入门精要》一书中的渲染流程图;
ApplicationStage阶段:准备场景信息(视景体,摄像机参数)、粗粒度剔除、定义每个模型的渲染命令(材质,shader)——由开发者定义,不做讨论;
GemetryStage阶段:顶点着色器、曲面细分着色器、几何着色器、裁剪、屏幕映射;
RasterizerStage阶段:三角形设置遍历,片元着色器、逐片元操作;
每个阶段具体操作如下图(虚线框是可选阶段):
模型空间——矩阵变换——齐次裁剪空间——透视除法——NDC标准设备坐标——屏幕映射
齐次裁剪空间是视景体空间(台体);
CVV:标准视体-也就是NDC坐标系对应的空间;
透视除法:顶点坐标除以w分量,将当前z深度所在的截面缩放为(2,2,2)的截面坐标;所以w分量记录了z深度信息;
硬件做透视除法获得NDC归一化设备坐标——再经过屏幕映射获得屏幕坐标系下顶点坐标;
Unity使用OpenGL的NDC,z分量在[-1,1];
OpenGL和DirectX差异
NDC空间——OpenGL为[-1,1],DirectX为[0,1],深度z范围不同;
窗口坐标系——DirectX左上角原点,OpenGL左下角原点;
投影平面——DirectX投影平面就是视景体近截面,OpenGL有视平面;
左右手坐标系——DirectX左手,OpenGL右手,叉乘顺序;
问题:
为什么片元不叫像素?
片元是很多状态的集合,记录了该像素的屏幕坐标,深度信息,法线,UV等;
DrawCall为什么会影响性能?
DrawCall是CPU向GPU添加渲染命令的过程,过程会由CPU向GPU发送数据(模型信息),DrawCall的次数越多CPU消耗性能就越大,DrawCall次数过多会导致每一帧CPU来不及发送全部数据给GPU渲染;
GPU有一个命令缓存区(Command Buffer),CPU的渲染命令都会存储在这里,GPU从命令缓存区依次执行渲染命令;
两种渲染命令:渲染模型(CPU提交模型信息也就是DrawCall)和改变渲染状态(着色器纹理状态改变,更耗时);
一般情况都是GPU渲染完成等待CPU发渲染命令;
来源:https://www.cnblogs.com/littleperilla/p/15680654.html


猜你喜欢
- in查询 <foreach>循环问题当我在做in查询的时候,发现在网上有很多种写法:接口public List<CaseR
- 调用和回调机制在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种:1.同步调用同步调用是最基本并且最简
- 在开发中,遇到了sql语句报错,但是并没有回滚的情况。经过几天的排查,终于找到了事务没有回滚的原因。原来的项目用的是informix的数据库
- 有的人的电脑在使用 IntelliJ IDEA 的svn 时候,无法保存密码,输入密码时,勾选保存密码还是无效。每次都的输入密码,一次浪费2
- @pathvariable与@requestparam碰到的一些问题一、@pathvariable可以将 URL 中占位符参数绑定到控制器处
- 序本文主要研究一下java String的internString.intern()java.base/java/lang/String.j
- groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是R
- Android如何自定义一个view ViewRootImpl绘制流程1、自定义属性在res/values/attrs.xml文件里定义一个
- 以下内容给大家介绍Android数据存储提供了五种方式:1、SharedPreferences2、文件存储3、SQLite数据库4、Cont
- 一、String与Date(java.util.Date)互转 1.1 String -&g
- 本文实例为大家分享了java实现猜拳小游戏的具体代码,供大家参考,具体内容如下User.javaimport java.util.Scann
- —举例(学生排课)—正常思路的处理方法和优化过后的处理方法:比如说给学生排课。学生和课程是一个多对多的关系。按照正常的逻辑 应该有一个关联表
- MAC设置JDK环境变量1、sudo vim ~/.bash_profile2、设置内容 (写自己的JDK路径,有两种方式查看)JAVA_H
- 一、组件生命周期flutter组件只有两种:有状态和无状态组件。由于无状态组件效率高,如果不涉及到组件内部的数据存储,尽量多的使用无状态组件
- ScriptControl接口属性名称类型备注AllowUIBOOL检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面
- Maven热部署,顾名思义就是可以不影响项目在服务器中的运行情况,可以实现项目代码的更新,减少启动,编译时间,达到快速开发的目的,也不需要手
- 微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAd
- 今天要介绍一个概念,对象的克隆。本篇有一定难度,请先做好心理准备。看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和
- 本文实例讲述了WinForm绘制圆角的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co
- 你还在生产节点开放Swagger吗,赶紧停止这种暴露接口的行为吧。学习目标快速学会使用注解关闭Swagger2,避免接口重复暴露。使用教程禁