Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unity高级开发-Shader开发(3)-Shader编程

Unity高级开发-Shader开发(3)-Shader编程

作者头像
孙寅
发布于 2020-06-02 09:55:45
发布于 2020-06-02 09:55:45
2K00
代码可运行
举报
文章被收录于专栏:宜达数字宜达数字
运行总次数:0
代码可运行
1、什么是shader程序:

一段规定好输入(颜色,贴图),输出(渲染器能够读懂的点和颜色的对应关系)的程序。

shader分类:
  • 1、表面着色器: 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。(本篇介绍这个)
  • 2、片断着色器: 可以做的事情更多,比较难写。 使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。
2、shader的结构:

着色器:本身就是一段代码,专业性非常强的代码。就是指着色器有哪些输入。这些子着色器由运行的平台选择。它包含:1.属性定义、2.多个或者至少一个子着色器、3.还有一个处理后的结果即回滚。而回滚就是计算着色时,用来处理所有的子着色器不能运行的情况。

3、关于Shader脚本
3-1、创建一个自己的shader脚本
3-2、如何选择我们创建的shader
4、shader脚本介绍
4-1、Properties : 属性
  • 数值和范围
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name(“display name”, Range(min,max)) = number
name(“display name”, Float) = number
name(“display name”, Int) = number
name("display name", Rect) = "name"{ options }

这些定义一些数值属性,每个等号后面表示默认的取值,name是给开发者给这个值起的可以在代码中访问的名字,display name则是在材质面板上显示的名字

  • 颜色和向量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name(“display name”,Color) = (number,number,number,number)
name(“display name”, Vector) =  (number,number,number,number)

定义颜色值RGBA和向量值(xyzw),在Shader的数学中,是一样的。Color会在属性面板上出现一个可供用户使用的调色面板按钮。Vector则是在面板上出现可以填写数字的栏

  • 贴图
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name(“display name”, 2D) = number
name(“display name”, Cube) = number
name(“display name”, 3D) = number
 // 后面texGen 是纹理生成模式(ObjectLinear , SphereMap,CubeReflect,CubeNormal),一般自定义的shader不会使用这些模式
name(“display name”, 3D) = "white"{ texGen Eyeliner }

定义2D贴图,CubeMap和3D贴图,等号后面都是默认的图,都是空字符串或者是Unity定义的“white”,"black","gray","bump".

  • 补充 Unity内定的一些属性列表: [HideInInspector] 不显示对应的属性值 [NoScaleOffset] 默认贴图面板带有tiling和offset属性,这个让它们不显示 [Normal] 该帖图放进来是法线图 [HDR] 该帖图期望是HDR的图 ,HDR:高动态光照渲染(High-Dynamic Range,简称HDR)图像
4-2、SubShader - 子着色器的实现

一个Shader中可以有多个SubShader(子着色器)实现,子着色器定义了一个渲染通道的列表,并可选是否为所有通道初始化所需要的通用状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SubShader
{
    Cull off // 双面显示
Blend One One
     Tags{"TagName1" = "Value1"
              "TagName2" = "Value2"
        }
  // 每一个SubShader必须要有一个Pass,可以有多个Pass,用来控制被渲染的几何体对象
  Pass{   // Pass里面就是整段渲染过程的实现
     
        }
}
  • RenderState 渲染状态 通道设置显示硬件的各种状态,例如能打开alpha混合,使用雾等 Cull off/Back/Front // 双面显示/背面不显示/正面不显示 设置多边形剔除模式 ZTest(Less/Greater/LEqual/GEqual/Equal/NotEqual/Always)默认Lequal 设置深度写模式,是否次物体的像素深度会被记录(默认记录),半透明物体默认不记录 ZWrite On/off 开启alpha测试 AlphaTest(Less/Greater/LEqual/GEqual/Equal/NotEqual/Always) 设置alpha混合模式 () Blend SourceBlendMode DestBlendMode
    • Blend SourceBlendMode DestBlendMode 混合模式

编辑查看混合原理

右键显示源文件查看混合原理

image.png

  • Fog{ Fog Block} 设置雾参数 Fog{Fog Commands} Mode Off/Global/Linear/Exp/Exp2 Color ColorValue Density FloatValue Range FloatValue
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fog{
  Mode Linear
  Color(1,1,1,1)
  Density 1000
}

RenderState

  • ColorMask RGB/A/0 设置颜色遮罩,0就是关闭所有颜色通道的渲染
  • Offset offsetFactor ,offsetUnits ,设置深度偏移
  • Color Color value 设置当顶点关照关闭时所使用的颜色
  • SeparateSpecular On/Off 开启或关闭顶点光照相关的平行高光颜色
  • ColorMaterial/AmbientAndDiffuse/Emission 当计算顶点光照时使用顶点颜色。
  • Material{Material Block} 定义一个使用顶点光照管线的材质
  • Lighting On/Off 开启或关闭顶点光照
  • Tags 标签 标签主要是告诉硬件什么时候调用该着色器,比如操作手册,2:30后执行什么步骤,这就是标签。
    • 标签属性
      • 1:Rendering Order - Queue tag : 渲染队列,就是渲染顺序
        • Queue有四种选择 1-Background : 最早被调用,用来渲染天空盒或者背景 2-Geometry : 默认值,用来渲染非透明物体(普通情况下,场景中的大部分物体就是非透明的) 3-Transparent :用于渲染透明物体(从后往前的顺序渲染) 4-Overlay : 最后渲染,用来渲染叠加效果(如镜头光晕等)
    • 2:RenderType tag : 渲染类型 主要告诉系统什么类型要怎么显示? Opaque: 不透明,最常用(带法线贴图的,自发光的,反射,地形) Transparent:半透明物体(粒子,字体) TransparentCutout:透明遮罩shader Background:天空Shaders Overlay:GUITexture,Helo,Flare shaders TreeOpaque:枝干 TreeTransparentCutout:树叶 TreeBillboard: 树的面片,效果会好一些 Grass:草 GrassBillboard:草的面片
    • 3:其他标签 ForceNoShadowCasting tag 不产生阴影 IgnoreProjector tag 不被Projectors影响

我们在Unity中可以通过相机方法: RenderWithShader Render the camera with shader replacement.设置渲染shader SetReplacementShader Make the camera render with shader replacement. 设置渲染替换shader

4-3、SubShader - LOD 着色器的设定值

LOD:调整根据设备图形性能来调整画质时可以进行比较精确的控制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
关于
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

如何进行质量设定? http://www.ceeger.com/Components/class-QualitySettings.html

4-4、Input

Input其实是需要我们去定义的结构,这给我们提供了一个机会,可以把所需要参与计算的数据都放到这个Input结构中,传入surf函数使用;

UV mapping的作用是将一个2D贴图上的点按照一定规则映射到3D模型上,是3D渲染中最常见的一种顶点处理手段。 变量前面加一个uv_MainTex: 就代表提取它的uv值(其实就是两个代表贴图上点的二维坐标 ), surf程序中直接通过访问uv_MainTex来取得这张贴图当前需要计算的点的坐标值了

4-5、surf

SurfaceOutput是已经定义好了里面类型输出结构,但是一开始的时候内容暂时是空白的,我们需要向里面填写输出,这样就可以完成着色了。先仔细看看INPUT吧,现在可以跳回来看上面定义的INPUT结构体了:

4-6、FallBack
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Fallback Off    明确表示没有后援的shader
Fallback "name" 指定后援名字
4-7、Pass(通道)

Pass{[Name and Tags] [RenderSetup][TextureSetup]} Pass{[名字和设定标签][渲染设定][贴图设定]} SubShader里面的Tags是针对SubShader进行设定,而这里面的Tags是针对Pass(通道)做一些设定

  • Tags 用来控制光照管道(环境光照,顶点光照和像素光照)中Pass的任务和一些其他选项。 LightMode tag 光照模式标签 Always:总是渲染,没有光照应用 ForwardBase:用于正向渲染,环境主要方向灯和电光/SH等的应用 ForwardAdd:用于正向渲染,附加的像素光被应用,每个光照一个Pass PrepassBase:用于延迟光照,渲染法线/镜面指数 PrepassFinal:用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色。 Vertex:用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用 VertexLMRGBM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。 VertexLM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染 ShadowCaster:将物体当作阴影产生者来渲染 ShadowCollector:正向渲染对象的路径,将对象阴影收集到屏幕空间缓冲区中。

顶点着色器与片段着色器所有的代码要写在CGPROGRAM 与 ENDCG里面,顶点着色器返回的就是一个顶点信息,而像素着色器返回的就是一个Color值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pass{
CGPROGRAM
#pragma vertex vert   //预编译指令 表示是一个顶点光照的名字, vert是顶点光照方法的名字,下方的代码有这个函数
#pragma fragment frag // 预编译指令,表示是一个片段着色器名字,frag是片段着色器方法的名字,下面有这个函数的实现
ENDCG
}
  • 预编译指令

为什么再次申明这个属性:

我们用来实例的这个shader其实是由两个相对独立的块组成的,外层的属性声明,回滚等等是Unity可以直接使用和编译的ShaderLab;而现在我们是在CGPROGRAM...ENDCG

这样一个代码块中,这是一段CG程序。对于这段CG程序,要想访问在Properties

中所定义的变量的话,必须使用和之前变量相同的名字进行声明。于是其实sampler2D _MainTex;

做的事情就是再次声明并链接了_MainTex,使得接下来的CG程序能够使用这个变量。

  • Pragma Target 2.0 与Target 3.0,Target 3.5的区别 如果想让我们写的着色器代码在不同的GPU运行,那么使用2.0就好,这是通用的。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma target 2.0
Works on all platforms supported by Unity. DX9 shader model 2.0.
Limited amount of arithmetic & texture instructions; 8 interpolators; no vertex texture sampling; no derivatives in fragment shaders; no explicit LOD texture sampling.

较高的着色器编译目标允许使用更现代的GPU功能 具体参考文档Unity User Manual (5.6)/Graphics/Graphics Reference/Shader Reference/Writing vertex and fragment shaders/Shader Compilation Target Levels Unity跨平台中,Shader可以通过根据平台来进行,不指定那么就会支持所有平台

属性中的Color和Vector对应CG中的float4类型 属性中的Range和Float对应CG中的Float类型 属性中的2D纹理对应CG中Sampler2D类型 属性中的CUBE和Rect纹理对应CG中SamplerCUBE 和 Sampler RECT类型 顶点数据的获取: appdata_base :包含顶点位置,法线和纹理坐标 appdata_tan:包含顶点位置,切线,法线和纹理坐标 appdata_full:包含顶点位置,法线,两张贴图和纹理坐标,顶点颜色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Name    Value
UNITY_MATRIX_MVP    Current model * view * projection matrix. // 模型坐标系 * 观察坐标系 * 投影坐标系
UNITY_MATRIX_MV Current model * view matrix.
UNITY_MATRIX_V  Current view matrix.
UNITY_MATRIX_P  Current projection matrix.
UNITY_MATRIX_VP Current view * projection matrix.
UNITY_MATRIX_T_MV   Transpose of model * view matrix.
UNITY_MATRIX_IT_MV  Inverse transpose of model * view matrix.
_Object2World   Current model matrix.
_World2Object   Inverse of current world matrix.
5、参考文档

https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html https://onevcat.com/2013/08/shader-tutorial-2/ http://www.tuicool.com/articles/JvYJ3em http://www.itnose.net/detail/6143450.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化
这些代码不需要包含在任何Pass语义块中,在使用时,我们只需要在Pass中直接指定需要使用的顶点着色器和片元着色器函数名即可。CGINCLUDE类似于C++中头文件的功能。由于高斯模糊需要定义两个Pass,但它们使用的片元着色器代码是完全相同的,使用CGINCLUDE可以避免我们编写两个完全一样的frag函数。
立羽
2024/07/08
1K0
unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化
Unity Shader入门
b.Shader分类。Shader中文翻译为“着色器”,含义是:可编程图形管线。主要分为:Vertex Shader和fragment Shader,即定点Shader和片段Shader。上面有一个概念是“图形管线”,简单解释就是:计算机处理图形显示的处理流水线。
全栈程序员站长
2022/09/20
8680
【Shader】Shader官方示例[通俗易懂]
官方示例原文地址:https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
全栈程序员站长
2022/07/31
1.2K0
【Shader】Shader官方示例[通俗易懂]
【unity shaders】:Unity中的Shader及其基本框架
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。 所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。
Tencent JCoder
2022/05/06
2.2K0
【unity shaders】:Unity中的Shader及其基本框架
Unity高级开发-Shader开发(1)-渲染管线
学习Shader(着色器)必须先要了解渲染管线。如果不了解,那么就不能说你了解Shader
孙寅
2020/06/02
1.2K0
Unity3D学习笔记3——Unity Shader的初步使用
在上一篇文章《Unity3D学习笔记2——绘制一个带纹理的面》中介绍了如何绘制一个带纹理材质的面,并且通过调整光照,使得材质生效(变亮)。不过,上篇文章隐藏了一个很重要的细节——Unity Shader。Shader(着色器)是渲染管线中可被用户编程的阶段,依靠着色器可以控制渲染管线的细节。现代图像渲染技术,都把Shader封装成与Material(材质)相关的组件。所以这篇文章,我们就初步学习下在Unity中使用Shader。
charlee44
2021/08/06
4.4K0
Unity3D学习笔记3——Unity Shader的初步使用
《Unity Shader入门精要》笔记(二)
Unity Shader定义了渲染所需的各种代码、属性和指令;材质则允许我们调整这些属性,并将其最终赋给相应的模型。 通俗讲就是:Shader制定了渲染的规则,材质是让这个物体在这个规则下调整渲染效果。
代码咖啡
2021/12/06
1.9K0
《Unity Shader入门精要》笔记(二)
Shader经验分享
流水线 1.应用阶段:(CPU)输出渲染图元,粗粒度剔除等 比如完全不在相机范围内的需要剔除,文件系统的粒子系统实现就用到粗粒度剔除。 2.几何阶段:(GPU)把顶点坐标转换到屏幕空间,包含了模型空间 到世界空间 到观察空间(相机视角view) 到齐次裁剪空间(投影project2维空间,四维矩阵,通过-w<x<w判断是否在裁剪空间) 到归一化设备坐标NDC(四维矩阵通过齐次除法,齐次坐标的w除以xyz实现归一化) 到屏幕空间(通过屏幕宽高和归一化坐标计算)。 a.顶点着色器:坐标变换和逐顶点光照,将顶点空间转换到齐次裁剪空间。 b.曲面细分着色器:可选 c.几何着色器:可选 d.裁剪:通过齐次裁剪坐标的-w<x<w判断不在视野范围内的部分或者全部裁剪,归一化。 e.屏幕映射:把NDC坐标转换为屏幕坐标 3.光栅化阶段:(GPU)把几何阶段传来的数据来产生屏幕上的像素,计算每个图元覆盖了哪些像素,计算他们的颜色、 a.三角形设置:计算网格的三角形表达式 b.三角形遍历:检查每个像素是否被网格覆盖,被覆盖就生成一个片元。 c.片元着色器:对片元进行渲染操作 d.逐片元操作:模板测试,深度测试 混合等 e.屏幕图像 ------------------------------------------------------- 矩阵: M*A=A*M的转置(M是矩阵,A是向量,该公式不适合矩阵与矩阵) 坐标转换: o.pos = mul(UNITY_MATRIX_MVP, v.vertex);顶点位置模型空间到齐次空间 o.worldNormal = mul((float3x3)_Object2World,v.normal);//游戏中正常的法向量转换,转换后法向量可能不与原切线垂直,但是不影响游戏显示,而且大部分显示也是差不多的。一般用这个就行了。 o.worldNormal = mul(v.normal, (float3x3)_World2Object);顶点法向量从模型空间转换到世界空间的精确算法,公式是用_Object2World该矩阵的逆转置矩阵去转换法线。然后通过换算得到该行。 ------------------------------------------------------- API: UNITY_MATRIX_MVP 将顶点方向矢量从模型空间变换到裁剪空间 UNITY_MATRIX_MV 将顶点方向矢量从模型空间变换到观察空间 UNITY_MATRIX_V 将顶点方向矢量从世界空间变换到观察空间 UNITY_MATRIX_P 将顶点方向矢量从观察空间变换到裁剪空间 UNITY_MATRIX_VP 将顶点方向矢量从世界空间变换到裁剪空间 UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵 UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间转换到观察空间 _Object2World将顶点方向矢量从模型空间变换到世界空间,矩阵。 _World2Object将顶点方向矢量从世界空间变换到模型空间,矩阵。 模型空间到世界空间的矩阵简称M矩阵,世界空间到View空间的矩阵简称V矩阵,View到Project空间的矩阵简称P矩阵。 --------------------------------------------- _WorldSpaceCameraPos该摄像机在世界空间中的坐标 _ProjectionParams _ScreenParams _ZBufferParams unity_OrthoParams unity_Cameraprojection unity_CameraInvProjection unity_CameraWorldClipPlanes[6]摄像机在世界坐标下的6个裁剪面,分别是左右上下近远、 ---------------------------- 1.表面着色器 void surf (Input IN, inout SurfaceOutput o) {}表面着色器,unity特殊封装的着色器 Input IN:可以引用外部定义输入参数 inout SurfaceOutput o:输出参数 struct SurfaceOutput//普通光照 { half3 Albedo;//纹理,反射率,是漫反射的颜色值 half3 Normal;//法线坐标 half3 Emission;//自发光颜色 half Specular;//高光,镜面反射系数 half Gloss;//光泽度 half Alpha;//alpha通道 } 基于物理的光照模型:金属工作流Surfa
bering
2019/12/03
2.3K0
表面着色器(Surface Shader)的写法(一)
而这个结构体的用法,其实就是对这些需要用到的成员变量在surf函数中赋一下值,比如说这样: [cpp] view plain copy
bering
2019/12/03
2.4K0
《Unity Shader入门精要》笔记:初级篇(1)
本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载。 本篇博客会补充一些扩展内容(例如其他博客链接)。 本篇博客还会提供一些边读边做的效果截图。文章内所有数学公式都由Latex在线编辑器生成。 本篇博客主要提供一个“glance”,知识点的总结。如有需要请到书店购买正版。 博客提及所有官方文档基于2022.2版本,博客会更新一些书中的旧的知识点到2022.2版本。 如有不对之处欢迎指正。 我创建了一个游戏制作交流群:637959304 进群密码:(CSGO的拆包密
[Sugar]
2022/09/21
8490
《Unity Shader入门精要》笔记:基础篇(1)
小插曲:看到具体数学冷汗直冒,细一看,嗷不是那本书呀。《具体数学》:别听《Unity Shader入门精要》里面说什么程序员的三大浪漫,真程序员就该手撕《具体数学》!
[Sugar]
2022/09/21
1.2K0
Unity Shader
对于透明物体的处理,是游戏引擎的一个重要能力,通常通过模型的 透明通道 alpha 来控制物体的透明情况,alpha取值范围为
ruochen
2021/11/26
3.5K0
Unity Shader-描边效果[通俗易懂]
描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果。最近又跑回去玩了玩《剑灵》,虽然出了三年了,感觉在现在的网游里面画面仍然算很好的了,剑灵里面走近或者选中NPC的一瞬间,NPC就会出现描边效果,不过这个描边效果是渐变的,会很快减弱最后消失(抓了好久才抓住一张图….)
全栈程序员站长
2022/07/26
2.4K0
Unity Shader-描边效果[通俗易懂]
UnityShader 表面着色器简单例程集合
0.前言 这些简单的shader程序都是写于2015年的暑假。当时实验室空调坏了,30多个人在实验室中挥汗如雨,闷热中学习shader的日子还历历在目。这些文章闲置在我个人博客中,一年将过,师弟也到了学shader的时候,这些例程虽然很简单,刚接触shader时却可以练练手,所以从个人博客中中搬了出来。而对于有一个月以上shaderLab编程经验的同学来说,这篇文章可以不用看了:-) 1.表面着色器概述 表面着色器只存在于Unity中,算是Unity微创新自创的一套着色器标准。它使得shader的书写门槛降
Tencent JCoder
2018/07/02
3.4K1
Unity性能调优手册7:渲染优化,DrawCall,剔除,Shader,LOD,TextureStreaming
翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/ 本章介绍围绕Unity图形功能的调整实践。
立羽
2023/10/26
3.6K0
Unity性能调优手册7:渲染优化,DrawCall,剔除,Shader,LOD,TextureStreaming
Unity Shader常用函数,标签,指令,宏总结(持续更新)
UnityObjectToClipPos(v.vertex); 最基本的顶点变换,模型空间 ==》裁剪空间 mul(unity_ObjectToWorld, v.vertex); 顶点:模型空间 ==》世界空间,多用于顶点着色器 UnityObjectToWorldNormal(v.normal); 法线:模型空间 ==》世界空间,多用于顶点着色器,float3(归一化后fixed3) UnityWorldSpaceLightDir(i.worldPos.xyz); 仅前向渲染,世界空间顶点位置 ==》世界空间光源方向,多用于片元着色器,一般会顺带归一化(fixed3) UnityWorldSpaceViewDir(i.worldPos.xyz); 世界空间顶点位置 ==》世界空间视线方向,多用于片元着色器,一般会顺带归一化(fixed3) P.S.一般[0,1]范围内的尽量用低精度fixed类型,如单位矢量,颜色等 Tags{"lightmode"="forwardbase"}(字符串不区分大小写,编译时会自动转为所有字母大写) 指示光照模型为前向渲染的基本模式 #include "UnityCG.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写) 包含大量基本内置函数,宏等,一般自带 #include "lighting.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写) 包含基本光照属性,如 _LightColor0 UNITY_LIGHTMODEL_AMBIENT(使用大写) 环境光,一般取前三个分量rgb(xyz);基本光照模型需要有环境光,漫反射,高光等 基本纹理&法线贴图: TRANSFORM_TEX(v.uv, _MainTex); 基本纹理变换,用于顶点着色器,相当于v.uv*_MainTex_ST.xy + _MainTex_ST.zw;(其中xy存缩放,zw存偏移,对应面板参数);_MainTex_ST需额外定义 tex2D(_MainTex, i.uv); 基本纹理采样,用于片元着色器;一般会定义染色属性并与之相乘得到反射率(albedo),反射率作为环境光和漫反射计算的因子 UnpackNormalWithScale(packedNormal, _BumpScale); 反映射法线贴图采样结果得到顶点空间中的法线方向,同时计算凹凸映射的缩放;packedNormal为法线贴图直接采样结果,_BumpScale为凹凸缩放值;法线贴图必须进行导入设置为Normal Map UnityObjectToWorldDir(v.tangent.xyz); 方向(切线):模型空间 ==》世界空间,多用于顶点着色器 cross(worldNormal, worldTangent)*v.tangent.w 计算副法线,cross(,)两个向量叉积,用于得知两个坐标轴求第三个坐标轴朝向,w控制朝向的正负;知道三个朝向就可以构造变换矩阵了 TANGENT_SPACE_ROTATION 得到从模型空间到顶点空间的变换矩阵rotation,随后可直接进行如下计算,例如: mul(rotation, ObjSpaceLightDir(v.vertex)); 模型空间顶点位置 ==》模型空间光源方向==》顶点空间光源方向 mul(rotation, ObjSpaceViewDir(v.vertex)); 模型空间顶点位置 ==》模型空间视线方向==》顶点空间视线方向 多光源&前向渲染&光照衰减: Tags{"lightmode"="forwardbase"}(第一个Pass,全局性通用计算,只计算一次,不用开启混合) Tags{"lightmode"="forwardadd"}(第二个Pass,根据光源数目不同可能多次计算,需开启混合) 前向渲染的两种标签,分别位于不同的两个Pass,指示每个Pass的光照模式 #pragma multi_compile_fwdbase #pragma multi_compile_fwdadd 前向渲染的两种指令,只有每个Pass配置正确指令才可能得到正确的光照变量,如光照衰减值 UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz); 用于第二个Pass分别计算每个光源的衰减,atten为输出的衰减值,i为片元着色器的输入结构体,其内部数学运算根据各个光照的类型不同复杂度不一,具体可参考:https://github.com/candycat1992/Unity_Shaders_Book/issues/47 接收投影: SHADOW_COORDS(idx) 声明阴影纹理采样的坐标,用于顶点着色器输出结构体,idx为下一个可用插值寄存器(TEXCOORD)的索引值 TRANSFER_SHADOW(o); 用于在顶点着色器
汐夜koshio
2020/03/19
2.1K0
Github霸榜:从零开始学3D着色器编程
Shader,是运行在GPU上的程序,中文称为着色器。它的主要用途是对三维物体进行着色处理,对光与影进行计算,以及控制纹理颜色的呈现等,最终,将游戏引擎中的几何数据转化为屏幕上的模型、场景以及特效。
新智元
2019/05/17
2.3K0
Github霸榜:从零开始学3D着色器编程
Unity Shader基础
Unity中,我们需要配合使用材质和unity shader,它们的关系和流程是:
Zero Two
2024/07/14
2550
Unity Shader基础
关于材质球中渲染光照一些理解
Specular Highlights:镜面光 Reflection: 遮罩反射 一个Cubemap 一个texture来描述我们对象的那些部分是可以反射的,而哪些不可以。记住,黑色表示没有任何反射性,而白色表示可以完全反射。下面的图片是我们将会用到的texture
孙寅
2020/06/02
8410
Unity 通用透明物体漫反射Shader
对于至今为止Shader学习内容的一个总结,算是一个比较综合通用的shader了,因为是漫反射所以暂时没有计算高光部分,之后再出一个带高光版本的。
汐夜koshio
2020/03/19
8940
推荐阅读
相关推荐
unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化
更多 >
交个朋友
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验