首页 > 其他分享 >unity实时渲染部分

unity实时渲染部分

时间:2023-05-21 11:03:14浏览次数:27  
标签:片段 渲染 Shader 实时 shader unity 顶点 像素 着色器




1.1 现代GPU渲染流水线

首先,图形渲染流水线以顶点数据作为开始,当GPU获取到CPU传递的顶点数据之后,整个图形渲染流水线正式开始运作



unity实时渲染部分_unity


图形渲染流水线的第一个站点是顶点着色器(Vertex Shader),它允许使用者通过程序进行配置。在顶点着色器中,顶点坐标会从模型空间变换到裁剪空间。除此之外,这个阶段还可以通过Shader程序对顶点进行处理,以实现一些特殊的效果。



unity实时渲染部分_unity_02


装配图元(Primitive Assembly)阶段将顶点着色器输出的顶点数据装配成指定的几何图元,基本图元包括:点、线、面。

光栅化(Rasterization)是将几何图元转变为片段(Fragment)的过程。屏幕上显示的图像都是由像素组成,而3D物体是由点、线、面这些基本图元组成的,要让几何图元能在屏幕上显示为像素就需要经过光栅化处理。该阶段包含两部分工作:

首先,确定屏幕坐标中的哪些整型栅格区域被基本图元占用。

其次,分配颜色值和深度值到各个区域。



unity实时渲染部分_unity_03


片段在经过视锥体裁切之后就会被传递到片段着色器,它最主要目的是计算每一个像素的颜色,这个阶段也可以通过shader程序进行配置。在这个阶段中,片段着色器会计算光照、阴影、纹理等所有的颜色数据,最终计算出像素的颜色

当所有像素的颜色都确定下来以后,会进入到测试(Test)和混合(Blending)阶段。在这个阶段会检测所有像素的深度值,将当前片段的深度值与深度缓存中的数值对比,从而判断这个像素的前面是否有物体对它进行遮挡,进而决定这个像素是否应该被丢弃。



unity实时渲染部分_顶点着色器_04


通过测试的像素会与已经绘制好的图像进行混合,从而得到最终的颜色。

帧缓存(Frame Buffer)是图形渲染流水线的最后一个“站点”,帧缓存中存储着用于渲染到屏幕上的像素,等待下一步输出到屏幕上



unity实时渲染部分_顶点着色器_05


1.2 什么是shader

shader,着色器。它是通过编写代码实现的,因此本质上也是程序。只不过shader程序和一般程序不一样,它并不是运行在CPU上,而是运行在GPU上,其目的是告诉GPU如何计算和输出图像。



unity实时渲染部分_Powered by 金山文档_06


shader所处的阶段只是渲染管线中的一部分,它主要是由顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)组成

编写shader的语言主要有两种:

基于Direct 3D的HLSL,由微软开发,在自家Windows平台兼容性良好,因此成为游戏开发的首选



unity实时渲染部分_顶点着色器_07


基于OpenGL的GLSL,具有良好的移植性,可以在不同平台上使用



unity实时渲染部分_unity_08


NIVIDIA希望显卡的程序开发独立于DX和GL的图形库,于是联合微软开发了CG语言,和HLSL愈发极为相似。使用CG编写的Shader拥有跨平台性,因此CG语言是编写Unity Shader的首选语言。

1.3 Shader和材质的关系与区别

shader实际上是一段程序,它负责把输入的顶点数据按照代码里指定的方式进行处理,并对输入的颜色或贴图等进行计算,然后输出数据。图像绘制单元获取到输出的数据便可将图像绘制出来,最终呈现在屏幕上。



unity实时渲染部分_着色器_09


Shader程序代码加上开放的参数设置以及关联的贴图等资源,为实现某种效果而打包储存在一起,最终得到的就是材质(material)。材质是shader的实例化资源,一个shader可以实例化为多个材质,并调节为不同的材质效果。最后把材质指定给某个模型就可以渲染初出应的效果。

1.4 Shader的组织架构

shader实际上是一段程序。



unity实时渲染部分_顶点着色器_10


无论选择任何语言编写Shader,无论编写的shader是何种类型,Unityshader总是通过ShaderLab语言进行包装并组织结构。通常情况下,Shader的大致结构如下所示:

shader "Name"
{
Properties
{
//开放到材质面板的属性
}
Subshader
{
//顶点片段着色器
//或者表面着色器、固定函数着色器(基本没了)
}
Subshader
{
//更加精简的版本;在旧图形设备上运行
}
……
Fallback "Name"
}

首先,最开始定义的是Shader的名称,然后定义开放出来的所有属性,接下来是真正的Shader代码。Shader中可以编写多个子着色器(Subshader),但至少需要一个。在应用程序运行过程中,GPU会先检测第一个子着色器能否正常运行,如果不能正常运行就会再检测第二个以此类推。假如当前GPU的硬件版本太旧,以至于所有的子着色器都无法正常运行时,则执行最后的回退(Fallback)命令,运行指定的一个基础着色器。



unity实时渲染部分_unity_11


如果编写的是顶点片段着色器,每个子着色器中还会含有一个甚至多个Pass。在运行的过程中,如果某个子着色器能够在当前GPU上运行,那么该子着色器内的所有Pass会依次执行,每个Passde的输出的结果会以指定的方式与上一步的结果进行混合,最终输出。



unity实时渲染部分_着色器_12


如果编写的是表面着色器(Surface Shader),着色器的代码也是包含在子着色器中,但与定点片段着色器不同的是,表面着色器不会再嵌套Pass。系统在编译表面着色器的时候会自动生成多个对应的Pass,最终编译出来的shader本质就是顶点片段着色器。

标签:片段,渲染,Shader,实时,shader,unity,顶点,像素,着色器
From: https://blog.51cto.com/u_136836/6318744

相关文章

  • 使用ORBSLAM2进行kineticV2稠密建图,实时转octomap建图以及导航
    决定总结最近一个月的工作,这个月在orbslam2的基础上,使用kineticV2完成了稠密点云地图的重建,实现了点云的回环,并使用octomap转换成实时的八叉树地图,导航部分已经有了思路,打算下个月所一个基于octomap的航迹生成能用在视觉的导航上。一、传感器和依赖包安装PC性能:Dellxps13内存16GB......
  • Unity ZSpace相关操作文档
    适用范围开发文档适用于Unity5.5及更新的版本,包括Unity2017,Unity2018,Unity2019。zSpace插件构建Unity开发人员无需修改zSpace插件中的任何内容即可使用它的所有功能。但是了解插件体系结构对加快应用的开发。本节着重探讨插件结构。ZCoreMonoBehaviourzSpace插件包括一个......
  • Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
    @TOC前言最近在学习UGUI的打图集,之前一直在用SpritePacker和SpriteAtlas打图集,现在记录下另一种打图集方式:TexturePacker主要是讲如何自动打图集到Unity,并且不丢掉九宫格信息,以及一些参数的设置环境准备1.unity版本2019.4.10f12.TexturePacker安装官网,支持正版,支持正版,支持正版ht......
  • Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
    开发背景好多开发者可能疑惑,外部数据实时预览播放,到底有什么用?是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.26......
  • 【ThinkPHP6系列学习-3】模板渲染
    视图功能由\think\View类配合视图驱动(也即模板引擎驱动)类一起完成,新版仅内置了PHP原生模板引擎(主要用于内置的异常页面输出),如果需要使用其它的模板引擎需要单独安装相应的模板引擎扩展。视图相关的配置在配置目录的view.php配置文件中进行定义。通常可以直接使用think\faca......
  • 从零玩转Websocket实时通讯服务之前后端分离版本-websocket
    title:从零玩转Websocket实时通讯服务之前后端分离版本date:2021-10-2500:47:12.945updated:2021-12-2617:43:10.496url:https://www.yby6.com/archives/websocketcategories:-OSS-mysql-api-单例模式-websokcettags:前言公司项目需要用到消息提示,那么......
  • 实用教程丨如何将实时数据显示在前端电子表格中(一)
      AuthorAlexZhangCategorySpreadJSTagsSpreadJS,前端电子表格,实时数据,RealTimeData   前言数据(包括股票、天气和体育比分)在不断更新为新信息时最为有用。SpreadJS是一个非常通用的JavaScript电子表格组件,它还可以轻松地使用、显示并......
  • 实验十七 实时时钟实验
    实验十七实时时钟实验实验目的1.学习模拟I2C总线的软件实现方法。2.了解实时芯片PCF8563的读写方法。3.掌握单片机读写实时时钟芯片PCF8563的模块程序设计方法。实验说明实时时钟(RTC)器件介绍实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种......
  • Echrtas 实时渲染
    1.实时曲线图业务场景:每个时间节点产生一个数据,且时间节点间隔不固定坐标轴配置:X轴类型设定为time,Y轴类型设定为value数据格式:每个节点的数据都是一个数组,第一个数组为时间,第二个元素为值//渲染参数varoption={ti......
  • Unity中级客户端开发工程师的进阶之路
    上期UWA技能成长系统之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习,可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将所需学习内容按......