/*
设置shader可中文 但不建议 统一设置方便美术使用
Hidden--可隐藏shader内部路径 "Hidden/TA/Ishader" */
Shader "TA/Ishader"
{
Properties
{
//[Header(value)] 属性标记(只支持英文数字下划线空格)
[Header(_This is 2D)]
//2D 纹理图 变量名括号 面板显示的名称 类型2D 赋值; 默认初始值为四种分别:white(纯白色) black(纯黑色) gray(灰色图) bump(法线图)
_MainTexture("Texture2D",2D) = "White" {}
//[NoScaleoffset] 隐藏2D属性中的:Tiling (贴图重复度)和 Offset (贴图偏移值)
[NoScaleOffset]_MainTexture2("Texture2D2",2D) = "white" {}
//[Normal] 需要自定义指定法线时
//[Normal]_MainTexture3("Texture2D3",2D) = "bump" {}
//3d纹理 无论怎么设置都是默认为灰色 与2d纹理默认值不同
_Texture3D("Texture3D",3D) = "" {}
//Cube纹理 CubeMap通常被用来作为具有反射属性物体的反射源。
_mainTextureCube("TextureCube",Cube) =""{}
//变量语法: 变量名 括号现实的名称,类型括号 设置默认值 末尾不用冒号
// 当[HDR]在color面前标注是材质面板中的颜色上会显示HDR的字样。同时点击颜色弹出来的取色器
[HDR]_color("Color",Color) = (1,1,1,1)
[Hidelnlnspector]
_Int("Intvalue",int) = 0
_Float("Floatvalue",float) = 0.5
_Rang("Rangvalue",Range(-1,1)) = 0
//PowerSlider(Value) 支持浮点数,值越大会导致滑条的曲度变化越大,值为1时不改变。
[PowerSlider(1)] _Rang2("PowerSlider value",Range(-1,1)) = 0
//[IntRange] 使滑动值浮点型变为整型
[IntRange]_Rang3("IntRange value",Range(-1,2)) = 0
//[Toggle] 开关 关为0开为一
[Toggle]_Rang4("Toggle value",Range(0,1)) = 0
//暂理解为枚举 下拉列表选择
[Enum(UnityEngine.Rendering.CullMode)]_Rang5("Enum value",float) = 1
//向量 四维向量 对于坐标来说对应XYZW 对应颜色来说为RGBA
_Vector("Vector value",vector) = (0,0,0,0)
[HDR]_Colort("结构Color",Color) = (1,1,1,1)
/*
浮点型:float/half/fixed .精度排列高中低:float(32位)>half(16)>fixed(11);
float:高精度类型 用于世界坐标下的位置纹理UV以及复杂函数的标量计算,如三角函数幂运算等
half:中精度类型 数值范围[-60000,+60000],用于本地坐标下的位置 方向向量 HDR颜色等
fixed:低精度类型 数值范围[-2,+2] 用于常规的颜色与贴图以及低精度间的一些运算变量等
{注:pc平台不管你的shader中写的half还是fixed统统会当做float来处理,half与fixed仅在一些移动设备上有效,比较常用的一个规则是,除了位置和坐标用float以外,
其余的全部用half。主要原因也是因为大部分的现代GPU只支持32位与16位,也就是说只支持float和half,不支持fixed。}
整型:Integer 用于循环与数组的索引。{注:在 Direct3D 9 和 OpenGL ES 2.0平台上整型可能会被直接用浮点数来处理,在Direct3D 11、OpenGL ES 3等现代GPU上可以正确的以整型类型来处理。}
2D纹理:sampler2D
3D纹理:samplerCUBE
{注:默认情况下在移动平台纹理会被自动转换成低精度的纹理类型,如果你需要中精度的或者高精度的需要用以下方式来声明:
sampler2D_half(中精度2D纹理)
sampler2D_float(高精度2D纹理)
sampler3D_half(中精度3D纹理)
sampler3D_float(高精度3D纹理)
samplerCUBE_halft(中精度立方体纹理)
samplerCUBE_float(高精度立方体纹理) }
类型对应:
Int/float/Range:用浮点值表示,也就是(float/half/fixed 根据自己的需求的精度来定义使用)
vector/color:用float4、half4或者fiexd4表示
{ 注:颜色分四个分量:Red(红)Green(绿)Blue(蓝)Alpha(透明);在使用中可以_Color.rgba来访问表示四个分量,
如果想获取单红色通道就是 _Color.r 依次类推。向量为:XYZW }
2D类型:用sampler2D表示
3D类型:用sampler3D表示
CUBE类型:用samplerCUBE表示
矩阵:{
在Shader中,矩阵是一个按照长方形阵列排列的浮点数集合。
你可以想像成是一队站列整齐的士兵,横向有M人,竖向有N人。就可以用floatMxN来表示。如果是4x4矩阵,
就是float4x4(同样支持其它精度),不过有一点要注意,在某些平台上是不支持非方矩阵的(比如float3x2),特别是OpenGL ES 2.0平台。
}
*/
}
SubShader //一个shader中可以包含多个,核心算法包含其中,也是材质与shader连接通道,作用于适配硬件的低中高配置的选择
{
pass //意思就是渲染一次模型! 至少保留一个 可以有多个 过多定义会 影响效率
{
/*
// CGPROGRAM:开始 中间写实现的效果代码 ENDC:结束与CGPROGRAM对应
// #pragma 是unity内置的编译指令用的命令,在pass中我们就利用此命令来声明所需要的顶点着色器与片断着色器
// vertex 定义顶点着色器的name,通常情况下会起名为vert。
// 顶点着色器就是处理顶点的着色器,每个顶点都会执行一次顶点着色器
#pragma vertex vert
// fragment 为片断着色器也被称作为像素着色器 主要是处理最终显示在屏幕上的像素结果。 定义片断着色器的name,通常情况下会起名为frag。
#pragma fragment frag
下面函数分为五部分,分别为:
1.floa4 vert :顶点着色器函数的名称,在上面我们已经指定了顶点着色器的名称就是vert,所以这里我们必须要用vert作为名称 float4为返回值
2.(float4 vertex2:POSITION):定义一个四维向量名为vertex2(名字可以随便起) POSITION,POSITION就是代表着模型的顶点位置信息。
此时变量vertex就表示着我们模型的顶点位置
3. return UnityObjectToClipPos(vertex2) :顶色着色器中最主要的事情就是将顶点从模型坐标转换到裁剪坐标
(说白了就是将模型显示在二维显示器上时需要做的一些矩阵转换 UnityObjectToClipPos(Value)是unity自带的矩阵转换,value为顶点位置变量
4. 返回值是个四维向量所以1才会使用float4来定义
5.SV_POSITION:S以便片断着色器可以知道哪个是从顶点着色器输出过来的顶点位置信息
// sampler2D _texture2D; 2D贴图
sampler2D_float _texture2D; //高精度2D贴图
// sampler3D _texture3D;
sampler3D_half _texture3D; //高精度3D贴图
// samplerCUBE _cubeTexture;
samplerCUBE_float _cubeTexture; //高精度cube纹理
fixed4 _color;
float4 vert(float4 vertex2:POSITION):SV_POSITION
{
return UnityObjectToClipPos(vertex2);
}
fixed4 frag():SV_TARGET
{
return _color;
}
ENDCG
*/
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Colort;
struct appData
{
float4 vet2:POSITION;
float2 uv:TEXCOORD;
}; //顶点着色器中的应用程序阶段的结构体
struct vet2
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD;
}; //顶点着色器中传递给片元着色器的结构体
vet2 vert(appData appVet)
{
vet2 vet;
vet.pos = UnityObjectToClipPos(appVet.vet2);
vet.uv = appVet.uv;
return vet;
} //顶点着色器中的几何阶段
fixed jiSuanUV(float2 UV)
{
float2 repUV = UV*10;
float2 repUV2 = floor(repUV)/2; // floor:返回小于等于x的最大整数
float2 jiSuanUV = frac(repUV2.x+repUV2.y)*2; //frac:函数返回标量或每个矢量中各分量的小数部分。
return jiSuanUV;
}
fixed4 frag(vet2 v):SV_TARGET
{
fixed colUV = jiSuanUV((v.uv-1)*4);
return colUV;
} //光栅化阶段 传到屏幕上
ENDCG
}
}
FallBack "Diffuse" //Fallback:备用shader "":传入有效shader路径
}
学习shader分享 一
于 2021-12-15 16:52:27 首次发布