Unity Shader学习日记 part4 Shader 基础结构

其实在这一篇之前,应该还有一个关于坐标空间转换的内容,但是内容囤积的有些多,就先把Shader的基础结构先记录一下。

笔记主要记录在代码中,所以知识点主要是图和代码的展示。

Unity Shader分类

在Unity中,Shader的种类,主要是这几种 
1.Standard Surface Shder(标准曲面着色器)
        包含标准光照模型的表面着色器模板
2.Unlit Shder
         不包含光照的基本顶点/片元着色器
3.Image Effect Shader
        用于实现屏幕后处理的效果的基本模板
4.Comput Shader
        利用GPU并行计算一些和常规渲染流水线无关的内容
5.Ray Tracing Shader
        用于实现光线追踪效果的着色器


之后学习的也主要是Unlit Shader相关的知识。
 

下面来看看Shader的基本构成,我们创建一个Standard Surface Shder,可以发现它的主要结构是这样的

所以Shader 的主要结构就是这样的,接下来是每个部分的具体结构

着色器名字

        着色器的名字主要用来决定外部材质使用时的路径,在有其他Shader引用时也会用到

Properties部分

        这个部分主要用来定义一些外部属性,这样就可以通过外部赋值的方式来对Shader的数据进行更改。

可以看到属性的结构是这样的

        //属性结构
        // _name ("Display Name",type)=defaultValue[{options}]
        // _name 属性名字,加下划线,方便获取
        // Display Name 材质面板上显示的名字
        // type  具体的类型 (数值,颜色和向量,纹理贴图)
        //defaultValue 将Shader指定给材质的初始化的默认值

既然知道了具体的写法,那么来看看在Shader中的属性能够定义哪些类型。

Shader中的属性类型主要包括数值,颜色和向量,纹理贴图


数值类型

数值(整形,浮点型,范围浮点型)
基础类型是浮点型,整形会被自动转为浮点型

        _intvalue ("IntValue",Int)=0
        _floatvalue("FloatValue",Float)=0
        _rangevalue("RangeValue",Range(1,2))=1.5

颜色和向量类型

颜色RGBA 向量XYZW 都是四个值,所以放一起

        _ColorValue("ColorValue",Color)=(1,1,1,1)//取值0-1,映射0-255   
        _VectorValue("ColorValue",Vector)=(1,1,1,1)//取值不限

纹理贴图

纹理贴图主要包括:

2D纹理,包括漫反射贴图,法线贴图等
2DArray纹理(纹理数组,允许存储多层图像数据,每一层看作一个2D图像,一般使用脚本创建)
Cube(map texture)纹理,立方体纹理,由上下左右6张有联系的2d贴图拼成,如天空盒,反射探针
3D纹理,一般脚本创建,使用不多

        //纹理贴图
        _MainTex ("Texture", 2D) = "white" {}

注意
white:defaultValue
不写:默认为空
 white:白色贴图
black:黑色贴图
gray:灰色贴图
bump:凸贴图
red:红色贴图    

SubShader部分

subshader子着色器,在每一个Shader中,可能会存在多个SubShader,主要是为了设备多种设备,当程序运行时,会逐一去尝试每一个SubShader,直到找到能够使用的SubShader。

来看看他的构成:

        /*组成部分
            标签 Tags  确定什么时候渲染物体和如何渲染物体
            渲染状态  确定渲染时候的剔除方式,深度测试,混合方式等内容
            渲染通道 Pass 具体的代码实现,每个子着色器至少有一个,每定义一个Pass,就会对物体执行一次渲染,
                            对于一些高级的Shader,需要多个Pass叠加,我们需要尽量减少Pass,他会增加渲染消耗
        */

下面来逐一看

标签 Tags

 

        //Tags 标签
        //渲染队列
        Tags { 
            "Queue"="BackGround"//队列号1000,最早渲染的物体,一般用于天空和或者背景
            "Queue"="Geometry"//队列号 2000,一般用于不透明的集合体,当没有声明是,Unity会自动申明
            "Queue"="AlphaTest"//队列号 2450,有透明通道的,需要透明测试的几何体
            "Queue"="Transparent"//队列号 3000,这个队列中的几何体按照由远到近的顺序绘制,半透明的渲染队列,所有进行透明混合的几何体都应该在这个队列中,如玻璃,粒子特效等
            "Queue"="Overlay"//队列号 4000,用于最后的叠加效果,如镜头光晕等
            "Queue"="Transparent+1"//自定义队列,通过队列的加减确定队列顺序
            }
        //渲染类型,对着色器进行分类,用于着色器的替换功能
        //摄像机上有对于的API,通过调用来替换着色器
        Tags{
            "RenderType"="Opaque"//不透明的,一些普通的Shader,如不透明,自发光,反射等
            "RenderType"="Transparent"//透明的,一些半透明效果
            "RenderType"="TransparentCutout"//透明切割,用于透明测试的Shader.如植物叶子等
            "RenderType"="BackGround"//背景,一般用于天空和Shader
            "RenderType"="Overlay"//覆盖,用于GUI纹理,光环,光晕等

            //以下了解即可
            "RenderType"="TreeOpaque"//地形系统中的树干
            "RenderType"="TreeTransparentCutout"//地形系统中的树叶
            "RenderType"="TreeBillboard"//地形系统中的树
            "RenderType"="Grass"//地形系统中的草
            "RenderType"="GrassBillboard"//地形系统中的Billboard草
            }

        //禁用批处理
        //批处理时模型会被转换到世界空间,从而舍弃模型空间
        //可能会导致一些使用模型顶点信息的Shader失效
        
        //总是禁用批处理
        Tags{"DisableBatching"="True"}
        //Tags{"DisableBatching"="False"}//不禁用

        //禁止投射阴影 控制SubShader的物体是否允许投射阴影
        Tags{"ForceNoShadowCasting"="True"}//不投射
        //Tags{"ForceNoShadowCasting"="False"} //投射阴影(默认)


        //禁止投影机
        //物体是否受到投影机的投射
        //忽略投射(一般在一些半透明效果中使用)
        Tags{"IngoreProjector"="True"}//不投射
        Tags{"IngoreProjector"="False"}//投射(默认)

渲染状态 State

        /*
        States 渲染状态 确定渲染时候的剔除方式,深度测试,混合方式等内容

        片元,光栅化阶段生成的像素或像素片段,是像素级操作和计算的基本单位,代表了像素的各种属性(颜色,深度值等)
        基本结构
        渲染状态关键词+空格+状态类型

        剔除方式
        所谓剔除,就是不渲染,主要有正面剔除,背面剔除(默认),和不剔除
        分别是 Cull Front, Cull Back ,Cull Off

        Cull Back

        深度缓冲
        是否写入深入缓冲区(Depth Buffer)
        记录每一个像素的深度值,初始为最大深度,意味着所有像素都在屏幕外,通过深度测试之后,决定是否写入缓冲,最后渲染缓冲区中的像素
        ZWrite On //写入 一般做透明等效果
        ZWrite Off  //不写入(默认)
        深度测试
        主要是保证像素按照正确的顺序进行渲染
        我们可以自定义深度的对比方式,来进行像素的深度测试

        ZTest Less //小于缓冲区的值就通过测试,决定是否写入缓冲 (透明)
        ZTest Greater //大于缓冲区的值就通过测试,决定是否写入缓冲(描边)
        ZTest LEqual //小于等于(默认)
        ZTest GEqual //大于等于
        ZTest Equal //等于
        ZTest NotEqual//不等于
        ZTest Always //总是
        注意:深度测试和混合测试都是在光栅化阶段的逐片元操作中进行的,一般实现一些特殊效果我们回去设置


        混合方式
        设置图像颜色的混合方式,多种颜色的混合,比如透明,半透明,不透明之间的混合
        默认为不混合
        Blend One One //线性减淡
        等等
        其他
        
        注意:这些渲染状态不仅可以在SubShader中申明,也可以在Pass中申明,只是两者的影响范围不同
        */

在这里我们需要了解一下什么是深度测试和颜色混合

深度测试 

        它主要是用在处理一些遮挡关系和透视关系,举个列子,方块A和方块B,相对于摄像机来说,A比B更近,并且两个方块存在遮挡关系,就像这样

        

那么摄像机怎么知道重叠部分怎么渲染呢?没错,深度测试。

在渲染管线中存在深度值缓冲区,里面有初始值,设置为最大,这意味着所有物体都在摄像机之外,都不会渲染。

在渲染片元(像素)的时候,他会去将这个位置的深度值和像素的深度值对比,在默认情况下,如果像素的深度值更小,他就会将这个值写入深度缓冲区(可以不写入),在下次渲染的时候,继续这个流程,知道渲染完成,那么留着缓冲区中的像素就是需要渲染的像素了,这样就能处理遮挡关系了。

需要注意的是,如果没有开启深度写入,当像素通过深度测试后,任然会被渲染。这表示,一个像素是否渲染,取决于是否通过深度测试。

颜色混合 

 和深度测试差不多的道理,这个属性一般用在一些透明效果上。

渲染通道 Pass

 

 //Pass 渲染通道
        //结构
        /*
        Pass 
        {
            名字
            渲染标签
            渲染状态
            着色器相关
        }
        
        名字:主要为了在其他Shader中服用Pass代码
        如:
        Pass{ Name MyPass }
        其他Shader中 UsePass "Lesson1/Test01/MYPASS" 
        unity 会将Pass名字转为大写,所以引用的时候需要大写名字
        

        Pass中的渲染标签
        //和SubShader中的语法相同,只是它具有自己独立的渲染标签

        1.Tags{"LightMode"="标签值"}
        可以指定这个Pass应该在哪个阶段执行
        可以将着色器代码分配给适当的渲染阶段,以实现具体的效果

        Always  始终渲染,不应用光照
        ForwardBase 在向前渲染中使用,应用环境光,主方向光,顶点/sh 光源和光照贴图
        ForwardAdd 在向前渲染中使用,应用附加的每个像素光源(每个光源有一个通道)
        Deferred 延迟渲染中使用,渲染G缓冲区
        ShadowCaster 将对象深度渲染到阴影贴图或深度纹理中
        等等

        2.Tags{"RequoreOptions"="标签值"}
        用于指定满足某些条件时才渲染这个pass

        目前unity只支持SoftVegetation
        仅当Quality窗口开启SoftVegetation时才渲染

        3.Tags{"PassFlags"="标签值"}
        指定一些特定的数据传入着色器中
        目前unity只支持OnlyDirectional
        在向前渲染中使用,这个标志只允许主方向光和环境光/光照探针数据传入
        这意味着非重要的光源数据不会传递到 顶点光源或球谐函数着色器变量

        Pass中的渲染状态
        SubShader中的渲染状态同样在Pass中适用,只是两个的影响范围有所区别
        此外,Pass中还可以使用固定管线着色器的命令

        GrabPass命令
        使用这个命令可以将绘制对象时的屏幕内容抓取到纹理中,在后续的通道中就可以使用这个纹理,从而执行一些高级效果

        如:
        将绘制对象之前的屏幕抓取到_BackGroundTexture纹理中
        GrabPass{
            "_BackGroundTexture"
        }
        注意:这个命令一般写在某个Pass之前,在之后的Pass中就可以利用_BackGroundTexture变量来进行处理
        */

 备用Shader

        /*
            备用Shader
            防止所有SubShader都没办法正常渲染的情况,让画面至少能被渲染
            FallBack "Shader名"
            或者不写(类似于FallBack Off)
        */

那么以上就是Shader的基础结构了,个人笔记,可能存在不全或错误

之后就是学习Shader的具体写法了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

特征点检测与匹配——MATLAB R2022b

特征点检测与匹配在计算机视觉中的作用至关重要,它为图像处理、物体识别、增强现实等领域提供了坚实的基础。 目录 Harris角点检测 SIFT(尺度不变特征变换) SURF(加速稳健特征) ORB(Oriented FAST and Rotated BRIEF) 总结 特征点检测与匹配是计算机视觉中的一项基…

Airflow:HttpSensor实现API驱动数据流程

数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景,Apache Airflow提供了HttpSensor,这是一个内置的Sensor,用于监视HTTP请求的状态,并在满足指定条件时触发后续任务。在这篇博文中&#xff0c…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

JAVA学习记录1

文章为个人学习记录,仅供参考,如有错误请指出。 什么是JAVA? JAVA是一种高级的编程语言,可以用于开发大部分场景的软件,但主要用于服务器的开发。 什么是JDK? 类似于python使用PyCharm来编写代码&#…

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性,后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排,到底部再换第二排,文字与文字之间从…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题,同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉,是否想过为何需要这样分层? 网上大多都是介绍每一层…

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1:函数体内计算sz(sz不作实参传递) 3.2 代码示例2:sz作为实参传递 3…

IDEA 字符串拼接符号“+”位于下一行的前面,而不是当前行的末尾

效果图 IDEA 默认效果是“历史效果”,经过修改后为“预期效果” 设置方式 在设置中找到Editor > Code Style > Java > Wrapping and Braces > Binary expressions > 勾选 Operation sign on next line 即可实现。具体设置如图。

牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形

1. 题目描述 用C语言在屏幕上输出以下图案: 2. 思路 我是先上手,先把上半部分打印出来,然后慢慢再来分析,下面这是我先把整个上半部分打印出来,因为空格不方便看是几个,这里先用&代替空格了 然后这里…

C# 整型、浮点型 数值范围原理分析

总目录 前言 一、整型、浮点型 数值范围列表 二、什么是大小、范围 在上面的列表中,每个数据类型都有自己的Range (范围) 和 Size (大小)。 1. 范围 范围好理解,就是对应数据类型的数据范围,如 sbtyte 的数据范围是 -128~127,超…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一:可以使用管理员权限进行安装。方法二:更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发,今日着手准备开发一个新的 vue 项目时,在…

Qt 5.14.2 学习记录 —— 칠 QWidget 常用控件(2)

文章目录 1、Window Frame2、windowTitle3、windowIcon4、qrc机制5、windowOpacity 1、Window Frame 在运行Qt程序后,除了用户做的界面,最上面还有一个框,这就是window frame框。对于界面的元素,它们的原点是Qt界面的左上角或win…

数据结构大作业——家谱管理系统(超详细!完整代码!)

目录 设计思路: 一、项目背景 二、功能分析 查询功能流程图: 管理功能流程图: 三、设计 四、实现 代码实现: 头文件 结构体 函数声明及定义 创建家谱树头结点 绘制家谱树(打印) 建立右兄弟…

springboot参数注解

在Spring Boot中,创建RESTful API时,通常会使用Spring MVC提供的注解来声明请求参数。以下是一些常用的注解及其用途: 1. RequestBody 用途:用于将HTTP请求的body部分绑定到方法参数上,通常用于接收JSON或XML格式的数…

uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能

在原card组件的cover属性添加图片的话&#xff0c;无法在图片上面绑定 show-menu-by-longpress"true"属性&#xff0c;通过将图片自定义添加可使用该属性。 代码&#xff1a; <uni-card title"标题" padding"10px 0" :thumbnail"avata…

【Springer斯普林格出版,Ei稳定,往届快速见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)

第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2025&#xff09;将于2025年2月21-23日在中国青岛举行。该会议主要围绕电子信息工程、大数据、计算机技术等研究领域展开讨论。会议旨在为从事相关科研领域的专家学者、工程技术人员、技术研发人员提供一…

docker内外如何实现ROS通信

写在前面 在一台电脑上装有docker&#xff0c;docker内外均装有ROS系统&#xff0c;现在想要实现docker内外的ROS通信&#xff0c;怎么办呢&#xff1f; 首先&#xff0c;因为是同一台电脑的docker内外&#xff0c;所以IP本身是互通的&#xff0c;不需要在/etc/hosts中添加IP…

2025年01月07日Github流行趋势

项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;20105今日star数&#xff1a;363项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, shantanuSakpal项目简介&#xff1a;你…

web3与AI结合-Sahara AI 项目介绍

背景介绍 Sahara AI 于 2023 年创立&#xff0c;是一个 "区块链AI" 领域的项目。其项目愿景是&#xff0c;利用区块链和隐私技术将现有的 AI 商业模式去中心化&#xff0c;打造公平、透明、低门槛的 “协作 AI 经济” 体系&#xff0c;旨在重构新的利益分配机制以及…

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…