Unity Shader de l'entrée à **

1. Conception

Shader est en fait une technologie spécialement utilisée pour rendre les graphiques.Grâce au shader, nous pouvons personnaliser l'algorithme de la carte graphique pour rendre l'image, afin que l'image puisse obtenir l'effet souhaité. Aussi petit que chaque pixel, aussi grand que la totalité de l'écran

Les shaders sont divisés en deux catégories :

1. Vertex Shader (les graphiques 3D sont composés de patchs triangulaires. Vertex Shader calcule les sommets sur chaque patch triangulaire et prépare le rendu final des pixels).
2. Pixel Shader, comme son nom l'indique, est une série d'algorithmes qui calculent l'éclairage et la couleur en pixels. Plusieurs API graphiques différentes ont leurs propres langages Shader. Dans DirectX, les vertex shaders sont appelés Vertex Shaders et les pixel shaders sont appelés Pixel Shaders ; dans OpenGL, les vertex shaders sont également appelés Vertex Shaders, mais les pixel shaders sont appelés Fragment Shaders, ce qui signifie que nous Souvent dit fragment Shader ou fragment Shader.

Langage de programmation Shader
Puisque Shader est un morceau de code, il doit être écrit dans un seul langage. Il existe actuellement trois langages courants :

OpenGL Shading Language basé sur OpenGL, appelé GLSL.
Langage d'ombrage de haut niveau basé sur DirectX, appelé HLSL.
Il existe également le langage C pour graphique de NVIDIA, ou langage Cg en abrégé.
GLSL et HLSL sont des interfaces basées respectivement sur OpenGL et Direct3D, et les deux ne peuvent pas être mélangés. Le langage Cg est le langage C pour les graphiques, ce qui montre en fait l'intention originale des concepteurs à l'époque, qui est de rendre la programmation basée sur du matériel graphique aussi pratique et gratuite que la programmation en langage C. Tout comme la syntaxe de C++ et Java est basée sur C, le langage Cg lui-même est basé sur le langage C. Si vous avez utilisé C, C++ et Java, la syntaxe de Cg est relativement facile à comprendre. Le langage Cg s'efforce de conserver la majeure partie de la sémantique du langage C, en essayant de libérer les développeurs des détails matériels. Cg présente également les avantages des langages de haut niveau, tels que la réutilisation facile du code et une grande lisibilité.

Le langage Cg est une collaboration entre Microsoft et NVIDIA pour convenir de la syntaxe et de la sémantique du langage d'éclairage matériel standard, de sorte que HLSL et Cg sont en fait le même langage.

Les notes d'étude

1.Structure

structure basique

Shader "MyFirstShader"
{
    
    
     Properties//属性
     {
    
         
     }
     SubShaders//子shader块(shader逻辑处理块,可以有多个)
     {
    
    
     }
     FallBack "Diffuse"//备用材质
     CutomEditor "EditorName"//自定义界面
}

1.1. Propriétés

Format

[Attribute]_Name ("Display Name",Type) = Default Value
//[ 标记  ] 变量名("面板上的显示名",类型)=  默认值

1.1.1 Type d'attribut

①.Couleur

_Color("我是Color",color) = (1,1,1,1)

②.Entier entier

//(面板中即便可以输入小数,shader也只取其整数部分)
_Int("我是Int",Int) = 1

③.Flotter le nombre à virgule flottante

_Float("我是Float",Float) = 0.5

Balises flottantes liées

//[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

④.Vector quatre dimensions

_Vector("我是Vector",Vector) = (0,0,0,0)

⑤.Texture 2D

_MainTex("我是2D纹理",2D) = "white" {
    
    }

Balises liées à la texture 2D

//[NoScaleOffset]:隐藏掉Tiling(贴图重复度)和Offest(贴图偏移值)参数
[NoScaleOffset]_MainTex("我是2D纹理", 2D) = "white" {
    
    }
//[Normal]:指定参数为法线贴图
[Normal]_MainTex("我是2D纹理", 2D) = "white" {
    
    }

//默认值
//white  白
//black  黑
//gray   灰
//bump   法线图

⑥.Texture 3D

_MainTex("我是3D纹理"3d) = "" {
    
    }

⑦.Cube texture de cube

_MainTex("我是Cube纹理", CUBE) = "" {
    
    }

Balise d'attribut générique

//[Header]:属性说明,使用后会在面板中参数上方出现文本
[Header(This is Header )]_Int("我是Int", Int) = 1

1.2 Qu'y a-t-il dans les SubShaders

1.2.1 Passe

Pass signifie : rendre un modèle
1. Dans un Shader, il y a au moins un SubShader
2. Chaque SubShader a au moins un Pass
insérez la description de l'image ici

1.2.2 Contenu du pass

1.2.2.1 .CGPROGRAM et ENDCG

Il doit y avoir CGPROGRAM et ENDCG dans chaque passe, et le code est écrit entre CGPROGRAM et ENDCG

1.2.2.2 #pragma

Vertex Shaders et Fragment Shaders
Mots-clés déclarés #pragma

//定义顶点着色器为name,通常情况下会起名为vert。
#pragma vertex name

//定义片断着色器为name,通常情况下会起名为frag。
#pragma fragment name
1.2.2.3 Déclaration de mise en œuvre
float4 vert ( float4 vertex : POSITION ) : SV_POSITION
{
    
    
	return UnityObjectToClipPos(vertex);
}
fixed4 frag () : SV_Target
{
    
    
	return _Color;
}

shader complet

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 Utilisation des attributs

//déclarez
à nouveau fixed4 _Color ;
nous avons défini un attribut _Color au début, mais si vous souhaitez l'utiliser dans la passe, vous devez le déclarer à nouveau, et le nom doit être le même que ci-dessus.
Le fixed4 utilisé pour le mot-clé représente un vecteur à quatre dimensions

Les mots clés courants pour déclarer des attributs dans Cg/HLSL sont les suivants

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 structure

Mot-clé : struct
Fonction : stocker des variables
Appel : nom de la structure + "." + nom de la variable

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 Fonctions personnalisées

fixed checker(float2 uv)
{
    
    
	float2 repeatUV = uv*10;
	float2 c = fliir(repeatUV)/2;
	float checker = frac(c.x+c.y)*2;
	return checker;
}

Appel de fonctions personnalisées dans le code

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

// Sémantique des shaders de fragment

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 Balises SubShader

Les tags dans SubShader doivent être placés dans Tags in SubShader, et les paramètres spécifiques sont les suivants :

1.Queue
// File d'attente de rendu, spécifiez quand l'objet est rendu, chaque file d'attente est en fait indexée par un entier.
A les valeurs suivantes :

Background
//值为1000,此队列的对象最先进行渲染。
Geometry
//Queue的默认值,值为2000,通常用于不透明对象,比如场景中的物件与角色等。
AlphaTest
//值为2450,要么完全透明要么完全不透明,多用于利用贴图来实现边缘透明的效果,也就是美术常说的透贴。
Transparent
//值为3000,常用于半透明对象,渲染时从后往前进行渲染,建议需要混合的对象放入此队列。
Overlay
//值为4000,此渲染队列用于叠加效果。最后渲染的东西应该放在这里(例如镜头光晕等)。

Exemple

Tags{
    
     "Queue" = "Geometry" }
//↓自定义渲染队列:
Tags{
    
     "Queue" = "Geometry+1" }

2. Les valeurs fournies avec RenderType
sont les suivantes :
Opaque
Transparent
TransparentCutout
Background
Overlay
TreeOpaque
TreeTransparentCutout
TreeBillboard
Grass
GrassBillboard

Lien d'origine : https://zhuanlan.zhihu.com/p/46745694

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45023328/article/details/119735028
conseillé
Classement