着色器基础

材质、贴图、着色器

三者的关系:每一个材质都需要制定一个着色器的指令,只有通过做色漆的指令,对应的材质才能明白怎样对物体进行渲染,而着色器可以接受一个或者多个贴图。

材质:

材质定义的是以一种什么方式对一个表面进行渲染,

着色器

简单讲,所谓的着色器就是通过数学算法计算每个偏远颜色值得脚本,这些脚本由开发人员根据自身需要进行编写

贴图

贴图其实就是一张图片,贴图与关照同事具备时,着色器就可以实现对模型的每个片元进行渲染。

ShaderLab语法基础

1.Shader

Shader是一个着色器程序的根命令,每个着色器程序都必须定义唯一一个Shader,其中定义的是材质如何使这个着色器渲染对象。
基本语法如下:
Shader “name”
{
[Properties]
Subshaders{…}
[Fallback]
}
上面的语句定义了一个名为name的Shader,这些内容在材质属性查看器上列于name下。着色器程序通过Preperties来可选的定义一个现实在材质设定界面中的属性列表。

Properties

着色器中有一个Properties列表,不管在着色器程序中定义了什么属性,都会显示在属性查看器中。并且这些属性可以在Inpector中进行编辑和调整而不需要单独的编译器,包含在着色器中的每一个属性都通过索引,属性值通过name来访问描述性会将display name 显示在属性查看器中,其结构如下

Properties{
_RangeValue(“Range Value”,Range(0.1,0.5)) = 0.3;
//分别对应着变量名,属性面板显示名、变量类型、默认值
}

Subshaders

着色器包含着一个子着色器列表,其中至少有一个子着色器,当unity加载一个着色器的程序的时候,他会便利该子列表,获取第一个可以被用户机器所支持的子着色器,如果不存在,unity将会使用降级着色器,也就是执行Fallback。
而真正用于呈现渲染物体的功能是在SubShader中实现的,使用SubShader的目的在于使开发人员针对不同性能的显卡编写不同的着色器程序

SubShder的基本语法如下
SubShader
{
[Tags] [CommonState] Pass{}
}
子着色器可由标签(Tags)、通用状态(CommonState)和一个通道(Pass)列表构成

其中Tags标签有Queue Tags 队列标签、自定义队列标签、RenderTypeTag(渲染类型标签)、DisableBatchingTag(禁用批处理标签)、ForceNoShadowCastingTag(强制不投射阴影标签)、IgnoreProjecttor(忽略投影标签)、CanUseSpriteAtlas Tag(忽略投影标签)、CanuseSpriteAtlas Tag(使用精灵图册标签)、PreviewType Tag(预览类型标签)
1.队列标签:可以用来决定对象被渲染的次序。着色器决定对象所属的渲染队列,任何透明物体都可以通过这种方法确保自身不再透明物体渲染之后渲染。
2.强制不投射阴影标签:当给定前置不投射阴影标签并且该标记为true是,使用子着色器渲染的对象将用不投射阴影
3.忽略投影标签:如果设置为此标签,那么使用该着色器的对象将不会被投影器所影响,这对半透明的物体来说最有用,因为这样她就不会受到投影起的影响而产生阴影。
4.使用精灵图集标签,若果该着色器用于精灵对象上,如果设置为false,当精灵被打包成图集后,着色器就不会起作用
5.预览类型标签,这个标签会指示出材质监视器应该怎样展示材质文件,默认情况是材质球,但是玉兰类型标签也可以设置为Plane或者Skybox显示。

Pass

基本语法:
Pass{
{Name and Tags} [RenderSetup] [textureSetup]
}
基本的渲染通道包含了一个可选的渲染设置命令(RenderSetup)列表和可选的纹理设置命令(TexttureSetup)列表。一个通道能定义它的Name和任意数量的Tags(用于渲染引擎传递通道的意图的名称/值得字符串)

Fallback:

降级定义在所有的子着色器之后,简单的说,如果当前没有恩和子着色器可以运行就会尝试使用降级着色器
常用语法如下:
Fallback “着色器名”
Fallback off:显示声明没有降级并且不会输出任何警告,甚至没有子着色器会被当前的硬件所使用

CustomEditor

开发人员可以为着色器定义CustomEditor(自定义编译器)。执行此操作的时候,unity会检查一该名称拓展MaterialEditor的类如果找到,将会使用该着色器的所有材质。

发布了67 篇原创文章 · 获赞 3 · 访问量 1889

猜你喜欢

转载自blog.csdn.net/lfanyize/article/details/103668812