シェーダーはシンプルです
1.コンセプト
シェーダーは、実際にはグラフィックのレンダリングに特別に使用されるテクノロジーです。シェーダーを使用すると、グラフィックカードのアルゴリズムをカスタマイズして画像をレンダリングできるため、画像で目的の効果を実現できます。すべてのピクセルと同じくらい小さく、画面全体と同じくらい大きい
シェーダーは2つのカテゴリに分けられます。
1.頂点シェーダー(3Dグラフィックスは三角形のパッチで構成されています。頂点シェーダーは各三角形のパッチの頂点を計算し、最終的なピクセルレンダリングの準備をします)。
2.ピクセルシェーダーは、その名前が示すように、ピクセル単位の照明と色を計算する一連のアルゴリズムです。いくつかの異なるグラフィックAPIには独自のシェーダー言語があります。DirectXでは、頂点シェーダーは頂点シェーダーと呼ばれ、ピクセルシェーダーはピクセルシェーダーと呼ばれます。OpenGLでは、頂点シェーダーは頂点シェーダーとも呼ばれますが、ピクセルシェーダーはフラグメントシェーダーと呼ばれます。フラグメントシェーダーまたはフラグメントシェーダーとよく言われます。
シェーダープログラミング言語
シェーダーはコードの一部であるため、1つの言語で記述する必要があります。現在、主流の言語は3つあります。
GLSLと呼ばれるOpenGLに基づくOpenGLシェーディング言語。
DirectXベースの高レベルシェーディング言語。HLSLと呼ばれます。
グラフィック用のNVIDIAのC、または略してCg言語もあります。
GLSLとHLSLは、それぞれOpenGLとDirect3Dに基づくインターフェイスであり、この2つを混在させることはできません。Cg言語はグラフィックスのC言語であり、グラフィックスハードウェアに基づくプログラミングをC言語プログラミングと同じくらい便利で無料にするという、当時の設計者の本来の意図を実際に示しています。C ++とJavaの構文がCに基づいているように、Cg言語自体もC言語に基づいています。C、C ++、およびJavaのいずれかを使用したことがある場合、Cgの構文は比較的簡単に理解できます。Cg言語は、開発者をハードウェアの詳細から解放しようとして、C言語のセマンティクスのほとんどを保持しようと努めています。また、Cgには、コードの再利用が容易で読みやすさが高いなど、高級言語の利点もあります。
Cg言語は、標準のハードウェア照明言語の構文とセマンティクスについて合意するためのMicrosoftとNVIDIAのコラボレーションであるため、HLSLとCgは実際には同じ言語です。
研究ノート
1.構造
基本構造
Shader "MyFirstShader"
{
Properties//属性
{
}
SubShaders//子shader块(shader逻辑处理块,可以有多个)
{
}
FallBack "Diffuse"//备用材质
CutomEditor "EditorName"//自定义界面
}
1.1。プロパティ
フォーマット
[Attribute]_Name ("Display Name",Type) = Default Value
//[ 标记 ] 变量名("面板上的显示名",类型)= 默认值
1.1.1属性タイプ
①。色
_Color("我是Color",color) = (1,1,1,1)
②.Int整数
//(面板中即便可以输入小数,shader也只取其整数部分)
_Int("我是Int",Int) = 1
③。浮動小数点数
_Float("我是Float",Float) = 0.5
フロート関連のタグ
//[Range]:限制参数范围
_Float("我是Float", Range( 0 , 1)) = 0.5
//[IntRange]:向下取整
[IntRange]_Float("我是Float", Range( 0 , 1)) = 1
//[Toggle]:开关(0代表关,1代表开)
[Toggle]_Float("我是Float", Range( 0 , 1)) = 1
//[Enum]下拉列表
[Enum(UnityEngine.Rendering.CullMode)]_Float("我是Float", Float) = 1
④。ベクトル4次元
_Vector("我是Vector",Vector) = (0,0,0,0)
⑤.2Dテクスチャ
_MainTex("我是2D纹理",2D) = "white" {
}
2Dテクスチャ関連のタグ
//[NoScaleOffset]:隐藏掉Tiling(贴图重复度)和Offest(贴图偏移值)参数
[NoScaleOffset]_MainTex("我是2D纹理", 2D) = "white" {
}
//[Normal]:指定参数为法线贴图
[Normal]_MainTex("我是2D纹理", 2D) = "white" {
}
//默认值
//white 白
//black 黑
//gray 灰
//bump 法线图
✧.3Dテクスチャ
_MainTex("我是3D纹理",3d) = "" {
}
✧.Cubecubetexture
_MainTex("我是Cube纹理", CUBE) = "" {
}
ジェネリック属性タグ
//[Header]:属性说明,使用后会在面板中参数上方出现文本
[Header(This is Header )]_Int("我是Int", Int) = 1
1.2サブシェーダーの内容
1.2.1パス
パスとは、モデルをレンダリングすることを意味します
。1。シェーダーには、少なくとも1つのサブシェーダーがあります。2
。各サブシェーダーには、少なくとも1つのパスがあります。
1.2.2パスの内容
1.2.2.1.CGPROGRAMおよびENDCG
各パスにはCGPROGRAMとENDCGが必要であり、コードはCGPROGRAMとENDCGの間に記述されます。
1.2.2.2 #pragma
宣言された頂点シェーダーとフラグメントシェーダー
キーワード#pragma
//定义顶点着色器为name,通常情况下会起名为vert。
#pragma vertex name
//定义片断着色器为name,通常情况下会起名为frag。
#pragma fragment name
1.2.2.3実装宣言
float4 vert ( float4 vertex : POSITION ) : SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
fixed4 frag () : SV_Target
{
return _Color;
}
フルシェーダー
Shader "Unlit/MyFirstShader"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
float4 vert ( float4 vertex : POSITION ) : SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
fixed4 frag () : SV_Target
{
return _Color;
}
ENDCG
}
}
}
ENDCG
1.2.2.4属性の使用
//
fixed4 _Colorを再度宣言します。
最初に属性_Colorを定義しましたが、パスで使用する場合は、再度宣言する必要があり、名前は上記と同じである必要があります。
キーワードに使用されるfixed4 4次元ベクトルを表します
Cg/HLSLで属性を宣言するための一般的なキーワードは次のとおりです。
float
//高精度类型,32位,通常用于世界坐标下的位置,纹理UV,或涉及复杂函数的标量计算,如三角函数、幂运算等。
half
//中精度类型,16位,数值范围为[-60000,+60000],通常用于本地坐标下的位置、方向向量、HDR颜色等。
fixed
//低精度类型,11位,数值范围为[-2,+2],通常用于常规的颜色与贴图,以及低精度间的一些运算变量等。
//在PC平台不管你Shader中写的是half还是fixed,统统都会被当作float来处理。half与fixed仅在一些移动设备上有效。
//比较常用的一个规则是,除了位置和坐标用float以外,其余的全部用half。主要原因也是因为大部分的现代GPU只支持32位与16位,也就是说只支持float和half,不支持fixed。
interger
//整型类型,通常用于循环与数组的索引。
//在 Direct3D 9 和 OpenGL ES 2.0平台上整型可能会被直接用浮点数来处理,在Direct3D 11、OpenGL ES 3等现代GPU上可以正确的以整型类型来处理。
sampler2D、sampler3D与samplerCUBE
//纹理,默认情况下在移动平台纹理会被自动转换成低精度的纹理类型,如果你需要中精度的或者高精度的需要用以下方式来声明:
sampler2D_half(中精度2D纹理)
sampler2D_float(高精度2D纹理)
sampler3D_half(中精度3D纹理)
sampler3D_float(高精度3D纹理)
samplerCUBE_halft(中精度立方体纹理)
samplerCUBE_float(高精度立方体纹理)
1.2.2構造体
キーワード:struct
関数:変数の保存
呼び出し:構造体名+"。"+変数名
struct appdata{
float4 vertex:POSITION;
}
//还可以定义这些语义的变量
struct appdata
{
float4 vertex : POSITION; //顶点
float4 tangent : TANGENT; //切线
float3 normal : NORMAL; //法线
float4 texcoord : TEXCOORD0; //UV1
float4 texcoord1 : TEXCOORD1; //UV2
float4 texcoord2 : TEXCOORD2; //UV3
float4 texcoord3 : TEXCOORD3; //UV4
fixed4 color : COLOR; //顶点色
};
1.2.3カスタム関数
fixed checker(float2 uv)
{
float2 repeatUV = uv*10;
float2 c = fliir(repeatUV)/2;
float checker = frac(c.x+c.y)*2;
return checker;
}
コードでカスタム関数を呼び出す
Shader "Unlit/MyFirstShader"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
struct appdata
{
float4 vertex:POSITION;
float2 uv:TEXCOORO;
};
struct v2f
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORO;
};
float4 vert ( float4 vertex : POSITION ) : SV_POSITION
{
v2f o;
o.pos = UnityObjectToClipPos(vertex);
o.uv = v.uv;
return o;
}
foxed checker(float2 uv)
{
float2 repeatUV = uv*10;
float2 c = floor(repeatUV)/2;
float checker = frac(c.x+c.y)*2;
return checker;
}
fixed4 frag (v2f i) : SV_Target
{
fixed col = checker(i.uv);
return col;
}
ENDCG
}
}
}
ENDCG
//フラグメントシェーダーに関するセマンティクス
Shader "Unlit/MyFirstShader"
{
Properties
{
_FrontTex("FrontTex", 2d) = "white"{
}
_BackTex("BackTex", 2d) = "white"{
}
}
SubShader
{
cull off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
sampler2D _FrontTex;
sampler2D _BackTex;
struct appdata
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (appdata v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.uv=v.texcoord;
return o;
}
fixed4 frag (v2f i,float face:VFACE) : SV_Target
{
fixed4 col=1;
col = face > 0 ? tex2D(_FrontTex,i.uv) : tex2D(_BackTex,i.uv);
return col;
}
ENDCG
}
}
}
1.2.2サブシェーダータグ
SubShaderのタグは、SubShaderのタグに配置する必要があり、特定のパラメーターは次のとおりです。
1.Queue
//レンダリングキュー。オブジェクトがレンダリングされるタイミングを指定します。各キューは、実際には整数でインデックス付けされます。
次の値があります。
Background
//值为1000,此队列的对象最先进行渲染。
Geometry
//Queue的默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。
AlphaTest
//值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。
Transparent
//值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。
Overlay
//值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)。
例
Tags{
"Queue" = "Geometry" }
//↓自定义渲染队列:
Tags{
"Queue" = "Geometry+1" }
2.RenderType
には次の値があります。不透明
な
透明な
TransparentCutout
背景
オーバーレイ
TreeOpaqueTreeTransparentCutoutTreeBillboardグラス
GrassBillboard
元のリンク:https://zhuanlan.zhihu.com/p/46745694