Unity Shader学习笔记

Shader类型

类型详情
Standard Surface Shader标准表面着色器,基于物理的着色系统,用于模拟各种材质效果,如石头、木材、玻璃、塑料和金属等。
Unlit Shader最简单的着色器,不包含光照但包含雾效,只由最基础的Vertex Shader和Fragment Shader组成。
Compute Shader实现各种屏幕后处理效果的着色器,如泛光、调色、景深、模糊等。
Image Effect Shader在GPU中运行的一段程序,独立于常规渲染管线之外,用于大量并行计算。
Ray Tracing Shader

光线追踪着色器,模拟各种光学效果,如反射、折射、散射、色散等,但计算成本较高。

ShaderLab

基本定义

        ShaderLab是一种在着色器源文件中使用的声明性语言,用于实现“数据驱动”渲染。它允许开发者定义Shader对象的整体结构,以及设置GPU的渲染状态。

        ShaderLab本质上是在底层着色器语言(如CG/HLSL/GLSL)的基础上,提供各种声明信息,这些信息用于驱动渲染管线。

基本结构

Shader的声明

        Shader文件的开头声明Shader的名称以及位置。

//Shader的名称为MyShader,它在Shader下拉菜单中的位置为Custom
Shader "Custom/MyShader"

Properties(属性定义)

        定义着色器中使用的贴图资源或数值参数等,这些属性会在Inspector视图的材质界面中显示,方便设置和修改。

Properties语义块属性
属性类型默认值定义语法示例
Intnumber_Int("Int",Int)=1
Floatnumber _Float("Float",Float)=1.0
Range(min,max)number_Range("Range",Range(0.0,1.0))=0.5
Color(number,number,number,number)_Color("Color",Color)=(1,1,1,1)
Vector(number,number,number,number)_Vector("Vector",Vector)=(0,0,,0,1)
2D"defaulttexture"{}_2D("2D",2D)=""{}
Cube"defaulttexture"{}_Cube("Cube",Cube)="white"{}
3D"defaulttexture"{}_3D("3D",3D)="white"{}
语法结构
    Properties  //属性{//注:Properties中的变量名称通常以下划线开始变量名("面板展示名称",属性类型)=默认值}
Properties语义块代码示例
Properties  //属性
{_Int("Int",Int)=1_Float("Float",Float)=1.0_Range("Range",Range(0.0,1.0))=0.5_Color("Color",Color)=(1,1,1,1)_Vector("Vector",Vector)=(0,0,,0,1)_2D("2D",2D)=""{}_Cube("Cube",Cube)="white"{}_3D("3D",3D)="white"{}
}

Properties语义块代码示例在材质面板的显示结果

SubShader(子着色器)

        Shader文件可以包含多个SubShader,但至少需要有一个;Unity会检查所有的SubShader,并选择第一个能在目标平台上运行的。

        每个SubShader可能包含可选的标签(Tags)、状态设置(例如ZTest、Blend等)以及一个或多个Pass。Pass定义了渲染的具体步骤,包括顶点着色器和片段着色器的代码。

语法结构
SubShader    //子着色器
{//可选的Tags { "标签键名称1"="值" "标签键名称2"="值"}//可选的状态名称 状态指令//示例Cull Off  //关闭剔除ZWrite Off //关闭深度写入//可选的Pass{[Name][Tags][RenderSetup]//other code}
}
SubShader的标签类型
SubShader标签类型
标签类型说明
Queue控制渲染顺序,指定物体属于哪个渲染队列,通过此方式保证所有透明物体可以在所有不透明物体后被渲染
RenderType对着色器进行分类,例如这是一个不透明着色器,或是一个透明着色器,这可被用于着色器替换(Shader Replacement)功能
DisableBatching一些SubShader在使用Unity的批处理功能时会出现问题,例如使用模型空间下的坐标进行顶点动画。这时可通过该标签指明是否对该SubShader使用批处理
ForceNoShadowCasing控制使用该SubShader的物体是否会投射阴影
IgnoreProjector如该标签值为“True”,那么使用该SubShader的物体将不会受Projector的影响,通常用于半透明物体
CanUseSpriteAtlas当该标签用于精灵(Sprites)时,该标签设为“False”
PreviewType指明材质面板将如何预览该材质,默认情况下材质显示为球形。
渲染队列Queue

        渲染队列(Queue)在Unity Shader中用来控制物体在渲染管线中的渲染顺序。渲染顺序决定了物体在屏幕上的呈现顺序,较低的渲染队列值会先被绘制,较高的渲染队列值会后被绘制

队列键名用途示例渲染队列值
Background渲染背景元素,比如天空盒、地面等Tags{"Queue"="Background"}1000
Geometry渲染通常的不透明的3D物体,如场景中的建筑、角色等Tags{"Queue"="Geometry"}2000
AlphaTest用于进行Alpha测试的物体,即剔除透明部分。常用于粒子效果等Tags{"Queue"="AlphaTest"}2450
Transparent渲染透明的物体,如玻璃、水、烟雾等。这些物体通常需要正确地排序和混合。Tags{"Queue"="Transparent"}3000
Overlay渲染UI和2D元素,如文字、按钮、镜头光晕等。这些元素通常需要在其他物体之上渲染,并保持固定的屏幕位置Tags{"Queue"="Overlay"}4000

补充--自定义渲染队列

        有时候,我们可能需要定义一些自定义的渲染队列,以实现更复杂的渲染效果。在Shader中设置自定义渲染队列需要使用Queue标签,并指定一个整数值作为队列的优先级。

Tags {"Queue" = "Geometry+200" //队列值为2200
}
渲染类型RenderType

        定义着色器的渲染类型

类型详情
Opaque不透明的。常用于普通Shader、不透明、自发光、反射等
Transparent

用于半透明效果、如玻璃

TransparentCutout表示物体是有透明度并且有一定范围内的裁剪的,用于透明测试 Shader,比如:植物叶子
Background用于天空盒Shader,场景当中的的背景
Overlay表示物体是覆盖在其他物体上的。这些物体会在后期的渲染队列中进行渲染,如GUI 纹理、Halo(光环)、Flare(光晕)
TreeOpaque用于地形系统中的树叶
TreeBillborad用于地形系统中的 Billboarded 树
Grass用于地形系统中的草
GrassBillboard用于地形系统中的 Billboarded 草

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

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

相关文章

【Vision Pro开发】小白开发如何过渡到visionOS开发 - SOP清单

为什么Unity开发者应该考虑学习Vision OS的原生开发,并解释了开发过程中面临的挑战和优势。我整理了一些关键点,对于刚进入这个赛道的小白开发者可以参考: 1. Vision Pro开发平台选择 - 主要有三种选择:原生开发(Xcode+SwiftUI+RealityKit)、Unity开发和WebXR开发 - 原生开…

30. 梯度下降法及其应用

1. 引言 在深度学习中,损失函数的求解是一个关键步骤。损失函数通常没有解析解,因此需要通过最优化算法来逼近求解。其中,梯度下降法是最常用的优化算法之一。本文将详细介绍梯度下降法的基本概念、理论基础、及其在深度学习中的应用。 2. …

甄选范文“论基于构件的软件开发方法及其应用”,软考高级论文,系统架构设计师论文

论文真题 基于构作的软件开发 (Component-Based Software Development,CBSD) 是一种基于分布对象技术、强调通过可复用构件设计与构造软件系统的软件复用途径。基于构件的软件系统中的构件可以是COTS (Commercial-Off-the-Shelf)构件,也可以是通过其它途径获得的构件(如自…

命名空间知识点

命名空间基本概念 概念 命名空间是用来组织和重用代码的。 作用 就像是一个工具包,类就像是一件一件的工具,都是申明在命名空间中的。 命名空间的使用 基本语法 namespace 命名空间名 { 类 类 } namespace MyGame {class GameObject{} }namesp…

2970.力扣每日一题7/10 Java(暴力枚举)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 解题思路 解题方法 时间复杂度 空间复杂度 Code 解题思路 incre…

图论---无向图中国邮路的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 程序流程图: 数学原理: 本质上是找到一条欧拉回路,考虑图中的边权重、顶点的度数以及如何通过添加最少的额外边来构造欧拉回路,涉及到欧…

完善kobj_type结构体

1、实现kobj_type的release函数 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h>static void dynamic_kobj_release(struct kobject *kobj); struct my_kobject …

链表 OJ(一)

移除链表元素 题目连接&#xff1a; https://leetcode.cn/problems/remove-linked-list-elements/description/ 使用双指针法&#xff0c;开始时&#xff0c;一个指针指向头节点&#xff0c;另一个指针指向头节点的下一个结点&#xff0c;然后开始遍历链表删除结点。 这里要注…

泛型集合:Java中的类型安全与类型擦除

引言 泛型是Java 5引入的一项重要特性&#xff0c;它为编译时类型安全提供了支持。在集合框架中&#xff0c;泛型发挥着至关重要的作用&#xff0c;允许开发者指定集合中元素的类型&#xff0c;从而避免了类型转换的错误和运行时异常。此外&#xff0c;Java中的类型擦除机制虽然…

Spring-Data-Elasticsearch

简介 Spring Data for Elasticsearch 是 Spring Data 项目的一部分&#xff0c;该项目旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型&#xff0c;同时保留特定于存储的特性和功能。 Spring Data Elasticsearch 项目提供了与 Elasticsearch 搜索引擎的集成。Spring…

推荐一款功能强大的 GPT 学术优化开源项目GPT Academic:学术研究的智能助手

今天&#xff0c;我将向大家介绍一个强大的开源项目—GPT Academic&#xff0c;它或许正是你一直在寻找的理想工具。 已一跃成为 60.4k Star 的热门项目 GPT Academic 目前在 GitHub 上已经揽获了 60.4k 的 Star&#xff0c;这不仅反映了它的受欢迎程度&#xff0c;更证明了它…

硅纪元AI应用推荐 | 百度橙篇成新宠,能写万字长文

“硅纪元AI应用推荐”栏目&#xff0c;为您精选最新、最实用的人工智能应用&#xff0c;无论您是AI发烧友还是新手&#xff0c;都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能&#xff0c;开启智慧新时代&#xff01; 百度橙篇&#xff0c;作为百度公司在202…

法律智能的新纪元:Transformer模型在智能法律咨询的突破性应用

法律智能的新纪元&#xff1a;Transformer模型在智能法律咨询的突破性应用 在法律领域&#xff0c;准确、高效的信息处理能力对于提供专业咨询服务至关重要。随着人工智能技术的飞速发展&#xff0c;Transformer模型凭借其卓越的语言理解能力&#xff0c;在智能法律咨询系统中…

【网络安全】Oracle:SSRF获取元数据

未经许可&#xff0c;不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司&#xff0c;拥有庞大的客户群体。与许多大型运营公司一样&#xff0c;Acme 采用了Apiary的服务&#xff0c;使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…

我的前端实习之旅

在大学的最后一年&#xff0c;我获得了一个宝贵的机会——在一家外包公司担任前端开发实习生。这一经历不仅让我得以将所学知识应用于实践&#xff0c;还教会了我许多课本之外的重要课程。 加入公司的第一天&#xff0c;我就意识到学术和职业环境之间的差异。我被分配到一个正…

PostgreSQL16安装Mac(brew)

问题 最近需要从MySQL切换到PostgreSQL。我得在本地准备一个PostgreSQL。 步骤 使用brew安装postgresql16: arch -arm64 brew install postgresql16启动postgresql16: brew services start postgresql16配置postgresql环境变量&#xff0c;打开环境变量文件&#xff1a; …

LabVIEW优化氢燃料电池

太阳能和风能的发展引入了许多新的能量储存方法。随着科技的发展&#xff0c;能源储存和需求平衡的方法也需要不断创新。智慧城市倡导放弃石化化合物&#xff0c;采用环境友好的发电和储能技术。氢气系统和储存链在绿色能源倡议中起着关键作用。然而&#xff0c;氢气密度低&…

从零开始实现大语言模型(三):Token Embedding与位置编码

1. 前言 Embedding是深度学习领域一种常用的类别特征数值化方法。在自然语言处理领域&#xff0c;Embedding用于将对自然语言文本做tokenization后得到的tokens映射成实数域上的向量。 本文介绍Embedding的基本原理&#xff0c;将训练大语言模型文本数据对应的tokens转换成Em…

JEECG框架t:datagrid表格/EasyUI框架DataGrid表格设置nowrap:false部分列不起作用或者完全不起作用

nowrap属性对于英文字母&#xff0c;数字无效&#xff0c;设置列宽度&#xff0c;也不能自动换行或者由于某些样式冲突导致直接不起作用的情况下&#xff0c;可采用以下办法解决换行问题。 解决办法&#xff1a;定义一个formatter方法&#xff0c;实现换行 /*** 表格列宽度不够…

PHP框架详解:Symfony框架

PHP框架详解&#xff1a;Symfony框架 Symfony是一个由SensioLabs创建的高性能PHP框架&#xff0c;以其模块化、灵活性和可扩展性而著称。作为PHP开发的顶级框架之一&#xff0c;Symfony在全球范围内被广泛应用于构建复杂和高性能的Web应用程序。本文将详细介绍Symfony框架的特…