Unity(三) Shader着色器初探

学习3D开发技术的时候无可避免的要接触到Shader,那么Shader是个什么概念呢?其实对于开发同事来说还是比较难理解的,一般来说Shader是服务于图形渲染的一类技术,开发人员可以通过其shader语言来自定义显卡渲染页面的算法,从而达到按照自己的想法来渲染出目标效果。

1. Unity Shader

不同的图形API会对应不同的Shader语言,感兴趣的可以去了解下更多这方面的内容。Unity目前开发阶段基于Windows平台开发和运行,一般采用Direct3D或OpenGL,如需要兼容其他平台可在打包的时候选取对应平台如安卓、IOS等,并关注切换后是否存在”粉色“的情况,如出现模型表面为”粉色“,一般是Shader出现不兼容错误,需要修复。

在编码之前我们需要先来了解下Unity常见的几种Shader:

1. Surface Shaders 表面着色器

        Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。

2. Vertex/Fragment Shaders 顶点/片段着色器(重要)

        一般的顶点+片段着色器的工作原理如下图所示

a. 顶点处理(顶点着色器)

        主要执行坐标转换和逐顶点光照的任务,坐标转换是将顶点坐标从模型空间转换到齐次裁剪空间中,可以使用UnityObjectToClipPos()函数来实现。

b. 图元处理

        在裁剪空间中进行裁剪(Clipping)、背面剔除(Back-Face Culling)、屏幕映射(ScreenMapping)等操作。为的是剔除不需要的顶点/面,并做好三维坐标到二维屏幕坐标的转换。

c. 光栅化

        是将变换到屏幕空间的图元离散化为片元的过程。

d. 片段处理(片段着色器)

        (1). 纹理贴图 - Textures

        纹理贴图也称为纹理映射,是将图像信息映射到三角形网格上的技术,以此来增加物体表面的细节,令物体更具有真实感。

        (2). 光照计算 - Lighting

        光照由直接光和间接光组成,计算光照最常用的就是phong模型了,它是一个经验模型,参数信息都是经验得到的,并没有实际的物理意义,所以利用Phong模型会出现违背物理规则的时候。

漫反射Difuse + 镜面发射Specular + 环境光Ambient = Phong

         (3). 混合与测试

        输出合并(Output-Merger):在DirectX中,该阶段被称为输出合并阶段,而OpenGL将其称为逐片元操作(Per-Fragment Operations),从称呼中就可以看出,这个阶段主要是对每一个片元进行一些输出合并操作,包括Alpha测试、模板测试、深度测试和混合等,它的主要任务是决定片元的可见性,对通过测试的片元颜色进行混合

        Alpha测试:通过片元数据,可以获取该片元的alpha值,如果alpha值小于某个数的话,则直接将该片元丢弃,不进行渲染

        模板测试:GPU会首先读取模板缓冲区中该片元位置的模板值,然后将该值和读取到的参考值进行比较,例如小于时舍弃该片元,或者大于等于时舍弃该片元。

        深度测试:近处的物体会遮挡远处的物体,这种效果我们可以通过深度测试来模拟实现。

        混合:对于半透明物体,我们就需要使用混合操作来让这个物体看起来是透明的

e. 帧缓存

        可以简单理解为一个临时画布,GPU渲染完成的信息会存放在帧缓存区,等待使用,上述各种测试也是在帧缓冲区进行的

以下这个图更容易理解:

自己理解简而言之就是:

描点(坐标变换)-> 

连线(三角面)->

形成格子(光栅化)->

上色(纹理、光照、) ->

后期处理(测试、混合)

2. 几个和Shader相关的概念

(1)网格(Mesh)

        网格Mesh是GameObject的3D骨架,它是有顶点(Vertex)定义的一个2D多边形,这些顶点是3D空间中存储为XYZ坐标。网格还包括法线,Shader通过法线让面看起来更光滑。

(2)贴图、纹理(Maps、textures)

        纹理(Texture):2D 图像文件,它像一张纸一样环绕GameObject,以设置网格中的颜色、镜面反射或金属度、物理纹理和其他属性。图像文件的数据被组织为通道(RGB/RGBA)。

        底图纹理(Base Map Texture):一个常规 RGB 或 RGBA 彩色图像文件,用于定义对象表面的漫反射(即颜色)

        平铺纹理(Tiled Texture):平铺纹理的纹理设计为围绕任何网格平铺。每个文件中的地图就像地板上的瓷砖一样简单地重复

        UV贴图:对于像球体这样的基元和像我们的块这样的简单形状,纹理贴图在哪些点与对象的网格对齐并不重要。但是在角色模型等详细对象上,纹理贴图与网格的对齐非常重要

        Alpha裁剪(Alpha Clip):根据Mesh网格填充纹理,避免大量计算。(也可用于溶解效果、消失/出现效果)

        凹凸贴图(Bump Texture):使用凹凸贴图,着色器将表面细节的外观添加到网格中,而无需实际添加多边形。这种技术对性能更好。使用法线贴图和高度贴图(normal maps and height maps)

        法线贴图:通过设置顶点位置,使着色器创建表面上的片段(像素)面向不同方向的错觉。

        高度贴图:设置网格中每个像素的相对高度

        遮挡贴图(Occlusion Map):遮挡贴图为这些遮挡区域添加阴影。

        发射贴图(Emission Map):制作发光效果的贴图

(2)反射

        环境光遮蔽AO(Occlusion):大部分情况下,AO通过构造一个发射光线的半(hemisphere)来计算。半球上表面布满朝各个方向发射的光线,然后判断这些光线是否与其它的物体相交。如果光线到达背景或者天空,那么就增加这个光线发出点的表面亮度,如果与其他物体相交,则不用。(靠得非常近的物体之间的阴影效果会非常明显)

        漫反射(Base map):

        1. 反照率(Albedo):描述了漫反射的测量。它通常指定为常规颜色,表示为红色、绿色和蓝色的三个值(RGB 值)。RGB 值可以转换为色调、饱和度和亮度(亮度)的值。反照率颜色的亮度对应于漫反射的量,色调和饱和度描述了从表面逸出的光的质量。

        2. 地图(Map):地图可以是纯色的,也可以用 2D 图像指定以增加表面的变化。

        镜面反射(Specular):镜面反射作为材料的一种属性,是一种指定表面看起来像金属的方法。您可以使用两种工作流程来指定材质中的金属外观——Specular、Metallic

        平滑度(Smoothness):平滑度,也称为光泽度或光泽度,使镜面反射成为焦点。

3. 如何编写Shader

(1). ShaderLab

        ShaderLab 是一种在着色器源文件中使用的类C语言的声明性语言。它使用嵌套大括号语法来描述 Shader 对象。其结构如下:

Shader "Examples/ShaderSyntax"
{CustomEditor = "ExampleCustomEditor"Properties{// 此处是材质属性声明}SubShader{// 此处是定义子着色器的其余代码Pass{// 此处是定义通道的代码}}Fallback "ExampleFallbackShader"
}

ShaderLab是一种声明式语言格式来编写Shader,可在代码自由编写Shader支持的所有特性和属性,并设置回退行为。

(2). HLSL

都是着色语言,作为中间语言(Intermediate Language),即交给GPU可以理解的语言。

因为Microsoft和NVIDIA合作,所以Cg/HLSL实际上是同一种语言。而ShaderLab内部可以嵌套Cg/HLSL语言编写着色代码,需要嵌套在命令CGPROGRAM和ENDCG之间。如下:

Pass {// Pass 的标签和状态设置CGPROGRAM// 编译指令#pargma vertex vert#pargma fragment frag// CG代码ENDCG// 其他设置
}</pre>

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

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

相关文章

【Electron】electron与cljs的处理

实现效果: 前言&#xff1a; 如何用cljs的方式&#xff0c;编写electron应用&#xff0c;可以实现多窗体应用 要使用ClojureScript&#xff08;CLJS&#xff09;编写一个 Electron 应用程序&#xff0c;并实现多窗体功能&#xff0c;您可以按照以下步骤进行操作&#xff1a; …

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

Qt 5.15集成Crypto++ 8.8.0(MSVC 2019)笔记

一、背景 笔者已介绍过在Qt 5.15.x中使用MinGW&#xff08;8.10版本&#xff09;编译并集成Crypto 8.8.0。 但是该编译出来的库&#xff08;.a和.dll&#xff09;不适用MSVC&#xff08;2019版本&#xff09;构建环境&#xff0c;需要重新编译&#xff08;.lib或和.dll&#xf…

分布式、锁、延时任务

1. redission redission 原理 Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案) 2.zk 2.1 指令 ls / / 下有哪些子节点 get /zookeeper 查看某个子节点内容 create /aa “test” delete /aa set /aa “test01” 2.2 创建节点 模式 默认创建永久 create -e …

redis(1)-hiredis-Windows下的编译

1.linux编译说明文档 GitHub - sewenew/redis-plus-plus: Redis client written in C 2.hiredis 编译 2.1 hiredis下载 https://github.com/redis/hiredis.git 2.2 hiredis cmake编译 2.2.1 配置生成:ConfigeGenerateOpen Project 配置源目录&#xff1a;…

【直接运行TS文件的三种方法】

直接运行TS文件的三种方法 文章目录 直接运行TS文件的三种方法法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 js 文件法二&#xff1a;用 ts-node 直接运行 ts法三&#xff1a;webstorm中直接运行ts(TypeScript) 法一&#xff1a;将 ts 编译成 js&#xff0c;然后运行 …

解决:AD装配输出拾放文件出现闪退问题

PCB在装配输出过程中&#xff0c;需要导出拾放文件&#xff0c;但是今天每次执行这个过程&#xff0c;AD软件就会直接闪退。 重启AD把项目管理器中没有关掉的一系列乱七八糟文件手动关闭关闭AD软件再次重启AD&#xff0c;打开项目重新导出。

04JVM_语法糖

一、编译期处理 语法糖java编译器把*.java源码编译为*.class字节码的过程中&#xff0c;自动生成和转换的一些代码&#xff08;添加的class字节码&#xff09;&#xff0c;减轻程序员的负担。 1.默认构造器 默认构造器没有写任何的构造方法&#xff0c;但经过编译器编译成字…

Spark2x原理剖析(二)

一、概述 基于社区已有的JDBCServer基础上&#xff0c;采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务&#xff0c;通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作&#xff0c;也不影响用…

Newman+Jenkins实现接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…

Fourier傅里叶变换的线性性质和位移性质

Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1​(…

2024苹果手机软件备份软件工具iMazing

很多人都会忘记备份iOS 资料&#xff0c;或者因为设置备份时间、位置等不到位&#xff0c;导致需要用的时候找不到备份。接下来&#xff0c;小编就来教大家iMazing软件备份功能的几个设置小技巧&#xff0c;都在软件界面的“选项”内调整&#xff0c;减少备份过程中的出错。 图…

OpenHarmony社区运营报告(2023年8月)

本月快讯 2023年8月3日&#xff0c;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;发布了Beta2版本。OpenHarmony 4.0 Beta2在系统能力、应用框架、分布式通信、媒体功能、安全性等方面进行了全面升级。其中&#xff0c;ArkUI增强了界面组件能力&#x…

Docker Swarm

Docker Swarm提供 Docker 容器集群服务&#xff0c;是 Docker 官方对容器云生态进行支持的核心方案。将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Swarm mode内置 kv 存储功能&#xff0c;提供了众多的新特性&#xff0c;比如&a…

报错ssh: Could not resolve hostname

…按照网上好多教程试了一下&#xff1a; 新建密钥&#xff0c;添加到gitee&#xff0c;重新测试。修改host&#xff0c;加入gitee的ip地址到里面去。修改.gifconfig配置文件&#xff0c;配置成ssh的仓库链接。 这上面的方法都不行&#xff0c;后面发现一篇文章&#xff1a;SS…

c语言flag的使用

flag在c语言中标识某种状态或记录某种信息&#xff0c;可以通过修改flag中来控制程序流程,判断某种状态是否存在或记录某种信息 操作:(1)初始化 (2)赋值 (3)判断 (4)修改 (5)去初始化 #include <stdlib.h>int power_state_check;int main() {int i 0;power_state_check…

GC 算法与种类

对于垃圾收集&#xff08;GC&#xff09;, 我们需要考虑三件事情&#xff1a;哪些内存需要回收&#xff1f;如何判断是垃圾对象&#xff1f;垃圾回收算法有哪些&#xff1f; 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的&…

计算机视觉领域经典模型汇总(2023.09.08

一、RCNN系列 1、RCNN RCNN是用于目标检测的经典方法&#xff0c;其核心思想是将目标检测任务分解为两个主要步骤&#xff1a;候选区域生成和目标分类。 候选区域生成&#xff1a;RCNN的第一步是生成可能包含目标的候选区域&#xff0c;RCNN使用传统的计算机视觉技术&#x…

1905. 统计子岛屿

给你两个 m x n 的二进制矩阵 grid1 和 grid2 &#xff0c;它们只包含 0 &#xff08;表示水域&#xff09;和 1 &#xff08;表示陆地&#xff09;。一个 岛屿 是由 四个方向 &#xff08;水平或者竖直&#xff09;上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。 如…

记录第一次带后端团队

在过去的一个半月里我第一次作为后端开发组长角色参与公司项目从0到1的开发&#xff0c;记录这一次开发的经历。 1、背景介绍 首先说明一下背景。我所在的公司是做智慧社区相关业务&#xff0c;开发的项目是系统升级工具&#xff0c;方便公司实施同事安装和升级系统。 参与后…