本篇文章给大家谈谈Unity Shader 基础学习:深入浅出Shader结构解析,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
模型是物体的形状,由一堆三角形组成。纹理是一张图片。 Shader是一段描述渲染过程和方法的代码。材质用于描述物体的渲染。不同材质的物体渲染结果是不同的。
2. 默认的新建材质
2.1 在Unity 中新建一个场景并保存,如果场景带了默认的天空盒,把天空盒去掉。
如何删除默认的天空盒:Unity菜单中的Window-Lighting-Settings,面板中将Environment-Skybox Material设置为None。
在新创建的场景中,默认会有一个相机Camera,位于(0,0,-10)
2.2 创建一个 Cube
在场景的层次结构视图中右键单击-3D Object-Cube,或在Unity 菜单中右键单击GameObject-3D Object-Cube。新创建的Cube的默认位置是(0,0,0)。选择多维数据集并查看检查器视图。 Cube 有一个组件MeshRender
2.3 创建一个 Shader 文件
Unity菜单Assets-Create-Shader-Unlit Shader会在对应目录生成NewUnlitShader.shader文件并重命名为01_Default.shader
2.4 创建一个材质
Unity菜单Assets-Create-Material,创建材质并重命名为01_Default.mat
2.5 为 Cube 指定材质和shader
新创建的Cube组件MeshRender有属性material,如图:
网格渲染
将新创建的Material拖到MeshRender组件的材质数组的第一个元素上,然后在该材质下选择我们新创建的01_Default着色器,并在该着色器的属性中指定一个贴图。步骤如下:
指定材质的着色器和贴图
可以看到Cube的渲染结果为:
简单来说,Cube就是GameObject有MeshRender组件,MeshRender有材质,材质可以指定shader和纹理。也就是说,通常shader+纹理共同决定材质,然后将材质赋值给MeshRender来决定GameObject的渲染结果。
3. Shader 结构分析
我们打开新创建的01_Default.shader文件,代码如下:
着色器“Shader_Examples/01_Default”
{
特性
{
_MainTex("纹理", 2D)="白色"{}
}
子着色器
{
标签{ "RenderType"="不透明" }
详细程度100
经过
{
CG程序
#pragma 顶点vert
#pragma 片段片段
//使雾发挥作用
#pragma multi_compile_fog
#include "UnityCG.cginc"
结构体应用程序数据
{
float4 顶点: 位置;
float2 uv : TEXCOORD0;
};
结构体v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 顶点: SV_POSITION;
};
采样器2D _MainTex;
float4 _MainTex_ST;
v2f vert(应用程序数据v)
{
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);
o.uv=TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
返回o;
}
固定4 碎片(v2f i) : SV_Target
{
//对纹理进行采样
fixed4 col=tex2D(_MainTex, i.uv);
//应用雾
UNITY_APPLY_FOG(i.fogCoord, col);
返回列;
}
ENDCG
}
}
}可以看到Unity Shader的基本结构。
3.1 Shader名字
着色器"Shader_Examples/01_Default" 着色器的“搜索路径”和名称。当我们为材质指定shader时,我们会在编辑器中看到这个路径和名称,它是用来指定shader的。
3.2 Shader 属性
Shader属性会出现在材质面板中供我们调整。它们可以是值、纹理、颜色等。01_Default 中只有一个纹理属性。
特性
{
_MainTex("纹理", 2D)="白色"{}
}
3.3 SubShader
通常,一个Shader 具有一个或多个SubShader 定义块。当Shader执行时,会按照SubShader的顺序从上到下选择第一个可以在目标平台上运行的SubShader。如果两者都不支持,则将使用Fallback 指定的Shader。如果未指定Fallback,则不会渲染。
SubShader的结构通常是这样的
子着色器{
//选修的
[标签]
//选修的
[渲染设置]
经过
{
}
经过
{
}
}
3.3.1 SubShader 的标签 Tags
Tags 是一个字符串类型的键值结构,用来告诉Unity如何以及何时渲染这个对象。标签的结构一般为:
Tags { "TagName1"="TagValue1", "TagName2"="TagValue2" } SubShader 支持的标签类型如下:
标签类型
3.3.2 SubShader 的状态设置 RenderSetup
RenderSetup可以设置渲染状态,比如是否启用深度测试、指定混合函数等。UnityShader中常见的渲染状态设置:
RenderSetup
3.4 Pass
可以在SubShader 中指定多个通道。每个Pass定义了一个完整的渲染过程。过多的Pass 会导致渲染性能下降。我们通常希望使用尽可能少的Pass。
Pass也可以指定Tags,但Tags类型与SubShader不同。 Pass还可以指定一个RenderSetup,与SubShader可以指定的相同。不同之处在于,由SubShader 指定的RenderSetup 将应用于其所有Pass,而由Pass 指定的RenderSetup 将仅应用于其自身。 Pass 可以通过Name "MyPass" 指定一个名称
通过标签类型
3.5 顶点/片元着色器
我们创建了一个Unity Unlit Shader,它是ShaderLab封装的着色器,称为顶点/片段着色器。顶点着色器和片段着色器需要在每个Pass语句块中定义。装置的实施。
OK,关于Unity Shader 基础学习:深入浅出Shader结构解析和的内容到此结束了,希望对大家有所帮助。
【Unity Shader 基础学习:深入浅出Shader结构解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始学习 UnityShader了!
有6位网友表示赞同!
看完这个标题就充满了期待啊,想了解一下 shader 的结构。
有10位网友表示赞同!
入门到改行?感觉目标很明确了,就是一步步教会我们修改 shader。
有18位网友表示赞同!
Unity Shader 有很多种不同的结构吗?
有9位网友表示赞同!
我一直用自带的材质,没有想过自己修改shader,这篇文章很有帮助!
有6位网友表示赞同!
这个标题太吸引人了,我已经迫不及待想学习了!
有19位网友表示赞同!
改行 shader 听起来好厉害的样子啊!
有14位网友表示赞同!
以前就觉得 Shader 有意思,现在终于有时间开始学习了。
有15位网友表示赞同!
希望能详细讲解 shader 的每一个部分,方便理解。
有14位网友表示赞同!
Unity Shader 是个非常强大的工具,要好好学习一下。
有6位网友表示赞同!
我已经有一些编程基础,这次一定要深入学习 Unity Shader!
有15位网友表示赞同!
感觉这个教程太棒了,可以从入门到精通都涵盖了。
有17位网友表示赞同!
我一直在想如何自己制作 shader,这篇文章刚好解决我的疑问!
有20位网友表示赞同!
想要做出更酷炫的游戏效果,Shader 是必不可少的一项技能!
有15位网友表示赞同!
学习 Shader 可以让我们更好地理解游戏图形的原理。
有5位网友表示赞同!
这个标题让我对 Unity Shader 的结构产生了兴趣,感觉很有价值!
有14位网友表示赞同!
希望文章能用通俗易懂的语言讲解 shader 相关知识。
有6位网友表示赞同!
从入门到改行,这篇文章一定能教会我如何使用 Unity Shader!
有6位网友表示赞同!
我已经收藏了这个文章,等有空的时候再好好学习!
有14位网友表示赞同!