Shader学习过程(一)

Shader入门教程(一) 学习Unity有一段时间了,都说Unity想要进阶得学会Shader编程,因此花了一阵子来学习Shader编程。学了之后才发现,Shader并没有我原先想的那么复杂,掌握它的原理和语法后,我们也能用shader编写出自己想要的特效,好了,下面我开始详细介绍shader的入门知识。我在这篇文章中主要介绍的内容有 ①Shader基础知识 ②Unity中Shader知识介绍 ③Surface Sha 阅读详情

最近加入一家公司,开始让我学习做特效,我一脸懵逼,不会啊!浅薄的理解了一下粒子系统又开始学习Shader 的编写。在没了解之前还以为Shader会和C#一样,上手简单,但是到直到现在,还没理解Shader的逻辑。老天了,送我一个大佬吧!
经过最近的学习,整理了以下自己对Shader编写的认知,都比较浅薄,有错误希望大佬及时指出。
就写一下自己整理的Shader的框架吧。

*1. 名字(自己命名)

2. 属性 Properties{}

2.1

属性名字由一个下划线开始,括号中的第一个参数,是属性显示在材质面板上的名字。第二个参数,是数据类型。
**

2.2 _MainTex

_MainTex(“Base(RGB)”,2D)=“white” {}–(变量名(显示名,类型)=默认值)

2.3

不同类型的属性:

		2D-2D贴图 
		Color-颜色 
		Float-浮点数 
		Range()-带范围的浮点数 
		Cube-CubeMap天空盒 
		Rect-非2的幂次方纹理 
		Vevtor-四维向量

3. SubShader

3.1 SubShader

SubShader{ //标签,可选 [Tags]  //状态,可选 [RenderSetup]  Pass{} //Other Passes }

3.2 标签

3.2.1 "Queue"标签,定义渲染顺序。

		预制值为:
			1.“BackGround”: 值1000。比如用于天空盒
			2.“Geometry”:值为2000。大部分物体在这个队列。不透明的物体也在这里。
			3.“AlphaTest”:值为2450。已进行AlphaTest的物体在这个队列。		
			4.“Transparent”:值为3000。透明物体。
			5.“Overlay”:值为4000。比如镜头光晕。
			6.用户可以定义任意值,比如"Queue"="Geometry+10"	

3.2.2 "RenderType"标签。Unity可以运行时替换符合特定RenderType的所有Shader

			Camera.RenderWithShader或者Camera.SetReplacementShader配合使用。
			1.“Opaque”:绝大部分不透明的物体都使用这个;
			2.“Transparent”:绝大部分透明的物体、包括粒子特效都使用这个;
			3.“Background”:天空盒都使用这个;
			4.“Overlay”:GUI、镜头光晕都使用这个;
			5.还有其他可参考Rendering with Replaced Shaders;用户也可以定义任意自己的RenderType字符串。

3.2.3

“ForceNoShadowCasting”,值为"true"时,表示不接受阴影。

3.2.4

“IgnoreProjector”,值为”true”时,表示不接受Projector组件的投影。

3.2.5

"LIghtMode"指定Pass和Unity的哪一种渲染路径(“Rendering Path”)搭配使用。
ForwardBase :向前渲染
ForwardAdd
Always :永远都渲染,但不光照处理
ShadowCaster,用于渲染产生阴影的物体。
ShadowCollector,用于收集物体阴影到屏幕坐标Buff里。

3.3

		LOD级别(默认时是200)
		VertexLit及其系列 = 100

		Decal,Reflective VertexLit = 150
		Diffuse = 200

		Diffuse Detail
		Reflective Bumped Unlit
		Reflective Bumped VertexLit = 250

		Bumped, Specular = 300

		Bumped Specular = 400

		Parallax = 500

		Parallax Specular = 600

4.Pass中一般写以下代码

4.1

Color Color 设定对象的纯颜色,可以是括号中的四个值,也可以是被方框包围的颜色属性名称

4.2

Material{Material Block} 材质被用于定义对象的材质属性,关于材质块的内容可以看下面的介绍

4.3

Lighting On/Off 定义上述材质块的定义是否有效,On时材质块效果有效,Off时颜色通过Color命令直接给出

4.4

SeparateSpecular On/Off 开启独立镜面反射,这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。

4.5

ColorMaterial AmbientAndDiffuse | Emission
使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。

5

定义着色器

5.1

fixed function shader (固定功能着色器)

5.2

vertex and fragment shader (顶点片段程序着色器)

5.3

surface shader (表面着色器)

6.

6.1定义变量

sampler2D :图片类型
Shader中的数据类型。数据类型的精度够用就好。颜色和单位向量,使用fixed;其他情况,尽量使用half;否则才使用float。
	float :32位高精度浮点数。
	half :16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。
	fixed :11位低精度浮点数。范围是[-2, 2],精度是1/256。 
	saturate :是指 饱和处理,大于1就变成1,小于0就变成0

6.2. 定义结构体

7. 光照计算

Material{Materila Block} 这个模块控制了顶点光照的信息,包括漫反射、高光、环境光等
Diffuse : Color 默认颜色组件,基本颜色
Ambient : Color 环境颜色组件,物体在被RenderSettings里面设置的环境光照射时的颜色
Specular : Color 高光反射颜色
Shininess : Number 高光的锐利度,在0到1之间,0时高光巨大,1时高光尖锐。
Emission : Color 自发光,当物体没有被任何光线照射时的颜色。
最终颜色:Ambient * RenderSettings ambient setting +(Light Color * Diffuse + Light Color * Specular) + Emission	

8. 片元着色器

9.

9.1

Lighting On/Off 控制顶点光照开关

9.2

Cull Back/Front/Off 控制剔除的面

9.3

ZTest(Less/Greater/LEqual/GEqual/Equal/NotEqual/Always)
深度测试模式,小于、大于、小于等于、大于等于、等于、不等于、一直时,才显示。

9.4

ZWrite On/Off
深度写入的开关

9.5

Fog{Fog Block} 这个模块可以给物体单独设置雾的效果。

9.6

AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue
透明度测试,小于、大于、小于等于、大于等于、等于、不等于某值时显示

9.7

Blend SourceBlendMode DestBlendMode
设置混合模式。

9.8

Color Color value
当Light off时设置颜色

9.9

ColorMask RGB | A | 0 | any combination of R, G, B, A
过滤颜色,如果参数是RGB的一种或几种时,将过滤参数的颜色,如果是0,将过滤所以颜色

9.10

Offset OffsetFactor , OffsetUnits
设置Z缓存深度偏移

9.11

SeparateSpecular On | Off
控制顶点光照的高光开关,如果开了,那么在物体最终颜色基础上再加上高光颜色

9.12

ColorMaterial AmbientAndDiffuse | Emission
使用材质颜色代替环境光、漫反射或者自发光

10.

回滚 FallBack Shader基本框架的最后是指定一个回滚函数Fallback,用来处理所有的子着色器都不能运行时的情况

~~肯定有错误的地方,希望大佬路过能提醒一下,不要让我一个萌新走上弯路。~~  
Shader Graph学习(一) 前言 在Unity2018.1之后新增了Shader Graph功能。(emmm,现在都2020了,只怪自己平时关注新知识太少了)Shader Graph可以在一个可视化的面板中完成shader功能的实现,一句代码都不需要写,大大降低了shader的开发难度。 官方文档:https://docs.unity3d.com/Packages/com.unity.shadergraph@7.2/ma... 阅读详情

相关推荐

【Unity Shader实战】卡通风格的Shader(一)

呜,其实很早就看到了这类Shader,

candycat 7万+

Shader基础学习(一)

目录 1.什么是Shader 2.Unity Shader使用的什么语言 3.Shader的创建 4.材质与Shader的关系 5.Shader框架 1.什么是Shader Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。 Unity Shader则更加简单我们只需要在一实现的效果是什么样子的其他的一切都可以交给unity处理。 2.Unity Shader使用的什么语言 由于unity是一个跨平台的游戏...

m0_52021450的博客 5080

Shader山下(一)第一个Shader

学习Unity3D就得学Shader,然而新手学习Shader往往不知道从何处下手,没有找对门,谈何入门。 本系列主要介绍Shader的一些基础知识,希望可以带你找对门,然后入得了门。

凯奥斯的注释 5138

Unity shader入门精要(学习总结)

shader 入门精要学习记录

Mq110m的博客 5263

Unity中Shader编译目标级别

针对不同平台的特性,所做的一些功能。

楠溪泽岸的博客 2105

unity shader 入门之路(一)创建一个shader

unity shader 第一步

Testiness_Wind的博客 1万+

Shader学习路线

本文系统性地介绍了Unity Shader的学习路径,分为四个阶段:基础概念(1-2周)建立核心概念和工具使用;深入核心(2-3周)掌握自定义光照和特效;高级技术(2-4周+)学习法线贴图、屏幕后处理和性能优化;精通阶段则聚焦NPR、PBR等专业领域。强调循序渐进的学习方式,建议从SurfaceShader入手,逐步过渡到手写Shader,并注重调试和性能优化。推荐结合《UnityShader入门精要》等经典教材和CatlikeCoding等实践教程,通过理论+实践的方式系统掌握Shader开发技能。

weixin_53163894的博客 1405

Shader 笔记一 表面着色器 Surface Shader

参考 猫都能学会的Unity3D Shader入门指南(一) 猫都能学会的Unity3D Shader入门指南(二) https://docs.unity3d.com/Manual/SL-SurfaceShaders.html 概念 Shader和Material: Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作...

王王王渣渣的博客 2271

Shader的学习(简单Shader)

1.什么是OpenGL、DirectX Shader可以认为是一种渲染命令,有OpenGL或者DirectX进行解析,来控制渲染图形 GLSL shader语言用于OpenGL HLSL shader语言用于DirectX 使用CG编写的shader可以跨平台,既可以在OpenGL上解析,也可以在DirectX上解析。 2.unity shader的分类 使用ShaderLab编写Unity中的Shader, 分类1:表面着色器 Surface Shader,相当于对顶点/片元着色器进行了

qq_42720695的博客 1062

【Unity-Shader】Unity60个内置Shader代码浅析(一)

Sunset虽然还没有正式开始工作,但已经有一点小忙了,总是感觉有好多好多不得不做的事,即使身心都有点疲倦。这次带来的是Unity内置的60个Shader代码的浅析的第一部分。往后会像制作ARPG那样陆续更新。 今天,在蛮牛群里,和几位同为学习者的群友进行了一番讨论,问题是,在游戏公司实习进行学习好还是自学好。个人认为,如果想要从事游戏开发相关方面的职业,首先提升自身能力以达到某一标准水平

Sunset的博客 6712

Unity Shader探索之路(一)

最近一直在学习Unity的shader,从一开始的UnityShader入门精要,到现在的ShaderGraph可以说是对于Shader的认识也在不断加深。想要彻底理解Shader并不是已是一件易事。我们必须对计算机图形学具有一定的知识储备,同时对于线性代数的矩阵运算也要充分掌握。所以在我们刚开始入门Shader的时候我们才会非常吃力,为了掌握Unity的Shader我们更重要的是掌握正确的学习方法。 第一步:了解计算机的渲染流水线 第一步也是最难的一部,因为渲染管线的知识往往与计算机图形学进行挂钩,如果

Le11eL的博客 3778

Unity Shader小白之旅(一)

2019.11.5 星期二 Unity里面我们经常见到一些炫酷的场景及特效,shader外门人的我表示很眼馋。心里总是幻想着,自己能够做出来这样的效果就好了。 经过查阅了一些资料之后也知道自己该去看一些什么内容。于是自己抱着满腔热血的去查看了一些零散的相关内容的文章,绝大多数都提到渲染管线及计算机图形学及光学这些等等。也尝试看过一些相关基础的内容(渲染管线及计算机渲染流程),看了一小段时间...

weixin_45219064的博客 215

Unity Shader 学习笔记(一)——Shader基础

一、什么是Shader? 简单来说shader就是一个告诉计算机以某种方式描绘物体的程序。 二、编写语言 使用Nvidia CG语言、微软HLSL语言编写,但都包含在Unity的 ShaderLab 语言中。 三、常用的Shader类型 Vertex&Fragment Shader(顶点片元着色器):是最基本的,也是非常强大的一种类型。一般用于2D的物体以及场景或者做一些特效。 Surface Shader:在系统编译后是一个复杂的Vertex&Fragment ..

L人青的博客 769

Shader之小白入门学习一

Shader之小白入门学习一前言什么是ShaderShader编程语言什么是Unity Shader 前言 Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在,就如我一样想学但是又不知道如何去学,或者学了一段时间发现Get不到它的点,是种感觉游离在外,无法开窍,学完之后过一阵就依旧是一脸懵逼。从本章开始打算一步步学习并熟练运用Shader,这也是我第一次写博客记录自己学习生活,如有哪...

qq_31018233的博客 734

Unity Shader之路(一)什么是Unity Shader?

Unity Shader前言什么是UnityShaderUnity Shader和材质的关系 前言 众所周知,要想当游戏开发工程师,Unity中的Shader编写不得不摸,这一系列文章我将描写我的Shader学习之路,致敬冯乐乐的书Unity Shader入门精要,此篇什么是Unity Shader?希望能给后人一点方向 我们刚开始接触Unity的时候,总是会遇到材质,但是不了解材质都是什么,为什么可以在很多材质中选择,为什么有时候选择了其他材质后就不能达到我们想要的结果,为什么资源商店有那么多的材质,山.

TurboQ珞珈 2238

Unity3D Shader实现动态星空

主要为大家详细介绍了Unity3D Shader实现动态星空,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

虚幻引擎的Shader课堂之Global Shader

关于虚幻引擎UE的Global Shader的介绍,以及实际案例和代码的展示

weixin_60051564的博客 2646

DAC8568控制器实战:如何用STM32实现多通道同步输出(附完整代码)

本文详细介绍了如何使用STM32微控制器驱动TI的DAC8568多通道DAC控制器,实现高精度的多通道同步模拟信号输出。内容涵盖硬件设计要点、SPI时序精准配置、驱动层命令构建,并重点解析了通过LDAC引脚实现同步更新的核心策略,提供了完整的代码框架和实战案例,帮助工程师快速解决多通道同步输出的工程难题。

weixin_29179311的博客 169

【Shader 学习资料】随着自己的学习过程不定期更新

写在前面 在UnityShader的学习过程中发现还是需要多阅读各方面的资料,许多时候都能找到答案。 可以没事多翻翻官方文档的shader板块. 其作为想明白实现思路之后的操作细节参考还是可以的,但是会发现官方文档上许多细节都没有记叙,包括制作步骤一类的,都无法或者难以通过官方文档一探究竟。且很多更详细的资料目前没有在官方文档里看到(可能是我眼瞎)。 因此这时候就查阅书籍吧,目前觉得冯乐乐的Uni...

weixin_41688521的博客 236

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 425

【K8S系列】Kubernetes 中 Service 的流量不均匀问题【已解决】

在 Kubernetes 中,Service 是一种抽象,用于定义一组 Pod 的访问策略。当某些 Pod 接收的流量过多,而其他 Pod 的流量较少时,可能会导致负载不均衡。这种情况不仅影响性能,还可能导致某些 Pod 过载,影响应用的可用性。本文将详细分析此问题的原因及其解决方案。

颜淡慕潇 8738
上一篇: Unity 组件Particle System的学习
下一篇: Unity 多个视频合为一个视频无障碍播放
刘星看流星
博客等级 码龄9年 8粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值