unity shader 学习笔记
程序员文章站
2024-02-14 09:46:04
...
最近学习unity shader,做一些笔记以免自己忘记了,供以后查阅,参考文章
https://zhuanlan.zhihu.com/unityTA
https://blog.csdn.net/qq_35759688/article/details/72705634
感谢。
本次主要记录了渲染管线和shader的基本数据类型
//渲染流水线
//应用阶段, 几何阶段, 光栅化阶段
//
// 应用阶段(CPU实现):
// 将数据加载到显存中,如顶点的位置信息、法线方向、顶点颜色、纹理坐标
// 设置渲染状态
// 调用DrawCall
//
// 几何阶段(GPU实现):
// 顶点着色器:实现顶点的空间变换、顶点着色等 <可完全编程>
// 曲面着色器:可选着色器,用于细分图元
// 几何着色器:可选着色器,用于执行图元的着色操作,或者用于产生更多的图元
// 裁剪:将不在摄像机视野内的顶点裁减掉,并剔除某些三角形的面片<可配置>,例如可以使用自定义的裁剪平面来配置裁剪区域,也可以通过指令控制裁剪三角图元的正面或者背面
// 屏幕映射:负责把每个图元的坐标转化到屏幕坐标中
// 光栅化阶段(GPU实现):
// 三角形设置:计算三角形网格数据,得到三角形网格对像素的覆盖情况,即计算三角形每条边上的像素坐标
// 三角形遍历:检查每个像素是否被一个三角形覆盖,如果覆盖则生成一个片元
// 片元着色器:完成重要的渲染过程<完全可编程>
// 逐片元操作:决定片元的可见性
// 渲染绘图管线流程:
// 顶点变化:通过一系列的坐标系转换,将模型的顶点在摄像机前进行位移,并最终投影到摄像机的投影屏幕上(顶点的坐标变换,逐顶点雾化,材质属性和光照处理)
// 面处理:面的组装、截取和剔除(背面剔除、视椎剔除、遮挡剔除)
// 光栅化:将以向量为基本结构的面转换成一个一个的点阵形式的像素
// 像素处理:对每个像素进行着色、对像素贴上贴图、行程最后的画面
//
Shader "Test/TestUnlitShader"//路径前加上前缀Hidden/表示隐藏shader,不能通过材质下拉列表找到该shader
{
Properties// 属性,可以没有该模块
{
//[Attribute]_Name ("Display Name",Type) = Default Value
//[Attribute]:属性标记,非必选项,可有多个
//_Name:属性名,默认规则以下划线开头
//Display Name:显示在材质面板上的名字
//Type:属性类型,常见属性类型有:{
// Color, 颜色
// Int, 整型
// Float, 浮点类型
// Vector, 四维树
// 2D, 2D纹理
// 3D, 3D纹理
// Cube, 立方体
// }
//Default Value:默认值
[Header(Test Shader Properties)]//在材质面板显示一行标题, 英文字母,数字,下划线
[Space]//插入空行
_Color0 ("test Color0", Color) = (1, 1, 1, 1)
[Space(10)] //插入指定行数
[HideInInspector]//隐藏属性,如果上面没有属性显示,标题和空行也会隐藏
_Color1 ("test Color1", Color) = (1, 1, 1, 1)
[HDR]_Color2 ("test Color2", Color) = (1, 1, 1, 1) //HDR可以使颜色亮度超过1,配合镜头Bloom效果做出物体泛光的视觉效果
_TestInt("test Int", Int) = 5
_TestFloat("test Float", Float) = 1.123 //注意:浮点数后面不能带有 f 标识,和C#有区别
_TestRange("test Range", Range(0, 5)) = 4
[PowerSlider(2)]_testPowerSlider0("test power slider", Range(0, 1)) = 0.5 //指数型滑动条,在材质面板上显示非线性滑动条,value为指数, 值越大滑动条的曲度变化越大。值为1时不改变
[IntRange]_testIntRange("test IntRange", Range(0, 5)) = 1 //范围内滑动取整数
[Toggle]_testToggle("test Toggle", Range(0, 1)) = 1 //开关,开关开启,shader关键词值为:"property name"+_"ON",
[Toggle(ENABLE_FANCY)] _Fancy ("Fancy?", Float) = 0 //重新指定shader关键词为开关关键词
[Enum(UnityEngine.Rending.CullMode)]_testEnum0("test Enum", Float) = 1 //枚举, 该处使用了unity内置枚举类,shader关键词:"property name"+"_"+"枚举名称(大写)"
[Enum(Off, 0, On, 1)]_testDefEnum("test Def Enum", Float) = 1 //枚举,自定义枚举类
[KeywordEnum(None, Add, Multiply)]_testKeyWordEnum0("test keyword enum0", Float) = 1 //关键字枚举
[KeywordEnum(N, A, M)]_testKeyWordEnum3("test keyword enum3", Float) = 1
_testVector("test Vector", Vector) = (0, 0, 0, 0)
_test2DTex("test Tex", 2D) = "black" {} //2D纹理,默认值有{white, black, gray, bump(法线贴图)} Tiling:贴图重复度, Offset:贴图偏移值
[NoScaleOffset]_testNoScaleOffset("test no scale offset", 2D) = "gray" {} //2D纹理,隐藏 Tilling 和 Offset 属性
[Normal]_testNormal("test Normal Tex", 2D) = "white" {} //限制为法线贴图
_test3DTex("test 3D Tex", 3D) = "" {} //3D纹理
_testCube("test cube", Cube) = "" {} //立方体,其值为Cubemap,六面体纹理,例如天空盒立方体贴图
}
SubShader
{
Pass
{
}
}
fallBack "Diffuse"
CustomEditor "EditorName"
}
在材质面板显示效果: