(II)ユニティ頂点/フラグメントシェーダベース

1.はじめに

この記事では例として、ライトシェーダ、その後の詳細な分析や説明の不在にユニティシェーダの基礎のいくつかを説明します。これは、直接側を見てお勧めします以下の解析を使用して、ユニティ(unity2018 / 2018利用可能プロ検定)を使用してシェーダにコピーすることができます。シェーダ次のように:

Shader "LL/Unlit/UnlitShader_basicDismiss"
{
	Properties
	{
		_MainTex("Main Texture",2D)="white"{} _DissolveTex("Dissolve Texture",2D)="white"{} _DissolveCutoff("Dissolve Cutoff",Range(0,1))=1 _Dismiss("Model Dismiss",Range(-1,1))=0 } SubShader { pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _DissolveCutoff; float _Dismiss; sampler2D _MainTex; sampler2D _DissolveTex; struct a2v { float4 vertex:POSITION; float2 uv:TEXCOORD0; float3 normal:NORMAL; }; struct v2f { float2 uv:TEXCOORD0; float4 vertex:SV_POSITION; }; v2f vert(a2v v) { v2f f; f.uv=v.uv; v.vertex.xyz=v.vertex.xyz+v.normal*_Dismiss; f.vertex=mul(UNITY_MATRIX_MVP,v.vertex); //f.vertex=UnityObjectToClipPos(v.vertex); return f; } float4 frag(v2f f):SV_TARGET { float4 mainTexColor=tex2D(_MainTex,f.uv); float4 dissolveTexColor=tex2D(_DissolveTex,f.uv); clip(dissolveTexColor.rgb-_DissolveCutoff); return mainTexColor; } ENDCG } } } 

2.Shader名

次のように見つけるために、パスLL /消灯/経て、このシェーダ名UnlitShader_basicDismiss、名前が付けられます。

Shader "LL/Unlit/UnlitShader_basicDismiss"
{
}

3. [プロパティ

インスペクタウインドウのパラメータに公開されたプロパティは、人為的に変更することができ、基本的な形式は、次のとおりです。属性名の下に示したように(「表示名」変数の型)=デフォルトでは、。
プロパティの基本フォーマット_MainTex("Main Texture",2D)="white"{}例を説明:_MainTex変数名を、最初の値の表示内容を括弧内に二重引用符内の「メインテクスチャ」パネルを、第2の値は、この変数のための2Dコンテンツ、すなわち、2Dテクスチャで表されます。セミコロンなく、各変数の後に「ホワイト」{}またはデフォルト値は{}二重引用符書かれた、白テクスチャではなく、そのような_DissolveTexのfloat型のような他の変数、値1、。

	Properties
	{
		_MainTex("Main Texture",2D)="white"{} _DissolveTex("Dissolve Texture",2D)="white"{} _DissolveCutoff("Dissolve Cutoff",Range(0,1))=1 _Dismiss("Model Dismiss",Range(-1,1))=0 } 

次の表に示されたタイプを使用して、変数の種類:

不動産の種類 説明
int型 _int(「INT」、INT)= 2 int型、デフォルト値は2です
浮く _float(「フロート」、フロート)= 2.0 float型、デフォルト値は2です
範囲 _range(「レンジ」、範囲(0,1))= 0.5 フロートタイプ、デフォルト値は0.5であり、ロック範囲
_Color(「カラー」、カラー)=(1,1,1,1) カラータイプは、デフォルト値は白です
ベクター _Vector(「ベクター」は、ベクター)=(1,1,1,1) ベクトル型(四次元ベクトル)、デフォルト値は白である(1,1,1,1)
2D _MainTex(「メインテクスチャ」、2D)= {「白」} 2Dテクスチャ、デフォルトは白テクスチャがあります
立方体 _Cube(「スカイボックス」、キューブ)=「白」{} キューブテクスチャ、デフォルトは白のテクスチャです
3D _MainTex(「メインテクスチャ」、3D)= {「白」} 3Dテクスチャは、デフォルト値は白テクスチャです

ここで、レンジタイプはスライダーのスタイルで、2018年の後に変更し、手動スライドサポートの直接入力、ないスライダースタイル;ベクトル名のタイプをベクトルですが、見て、4次元データの代わりに、実際には、それが位置入力としても使用することができます。キューブSAIDこのテクスチャは、六面体のテクスチャです。

4.SubShader

それがサポートされていない場合、フォールバックセマンティクスがシェーダが使用されている指定され、選択された標的UnityプラットフォームSubShader最初のローディング動作を一致、最小のユニティシェーダSubShaderの複数のコードブロックを含んでもよいです。A SubShaderは、複数のパスを含めることができます。もちろん書き込まCG / HLSLを用いて発現CGPROGRAM ENDCGの間に画定された文を渡す、また、他の言語を記述するために使用することができます。

	SubShader
	{
		pass
		{
		    CGPROGRAM
		    。。。
		    ENDCG
		}
	}

5.定義頂点/フラグメントシェーダ

この方法は、同時に達成追加の#pragma頂点によって頂点シェーダヴェール(これはメソッド名で、自由に変更することができる)、定義されました。同様の#pragmaフラグメントシェーダFRAGによって定義されたフラグメント、変化および方法を実装します。どこの#include「UnityCG.cgincは、」導入このファイルで定義された方法、および可変意味チャンクを示します。このファイルには、各章が詳しく説明されます。

			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc" float _DissolveCutoff; float _Dismiss; sampler2D _MainTex; sampler2D _DissolveTex; struct a2v { float4 vertex:POSITION; float2 uv:TEXCOORD0; float3 normal:NORMAL; }; struct v2f { float2 uv:TEXCOORD0; float4 vertex:SV_POSITION; }; v2f vert(a2v v) { v2f f; f.uv=v.uv; v.vertex.xyz=v.vertex.xyz+v.normal*_Dismiss; f.vertex=mul(UNITY_MATRIX_MVP,v.vertex); //f.vertex=UnityObjectToClipPos(v.vertex); return f; } float4 frag(v2f f):SV_TARGET { float4 mainTexColor=tex2D(_MainTex,f.uv); float4 dissolveTexColor=tex2D(_DissolveTex,f.uv); clip(dissolveTexColor.rgb-_DissolveCutoff); return mainTexColor; } 

5.1変数の参照

上記のコード、と定義する値が変数プロパティパネルに利用可能になるように、2つのフロートsampler2Dフォーマット変数、モジュールの変数プロパティと同じ名前を持つこれらの2つの変数です。

5.2カスタム変数

構造体は、上記のコードでV2FのA2Vの二つのタイプを定義します。前記構造体は、可変フォーマットを定義します。名前の変数の型変数+ +セマンティック変数として、次のとおりです。

float4 vertex:POSITION;

float4頂点または4次元ベクトルの配列を表す変数です。しかし、の意味が定義された変数の意味論的位置によって表され、この変数は、頂点座標を表します。それがここで頂点法線、UVで、このために、通常の変数のテクスチャ座標だったので。同様V2F SV_POSITIONクリップ空間座標でした。V2F型プロセスVERT戻り値、今回頂点表現のクリップ空間の頂点座標は、入口パラメータとしてFRAGにおいて、タイルの頂点の位置を示す座標は、類推によって、またシート員紫外線UVであります座標。頂点/フラグメントシェーダ部分に特定の参照。

以下の表に示すように、変数の型

タイプ 定義
浮く 最高の中央値データ変数
ハーフ ビットの中間データ変数の数
一定 最低可変精度データビット(0-1の色値ので、それほど色タイプ利用可能fixed4)

+数可変型およびn n次元の変数、例えばfixed4、対応するタイプの各次元の値、4つの意味可変寸法を表し、各ディメンションタイプが固定されています。

5.3頂点シェーダヴェール

主要タスクVERT方法は、セマンティック頂点座標を含む少なくとも一つの意味論的パラメータ、出力値がSV_POSITION位置となるように入口を含むこと、クリップ空間の頂点座標を(すなわち、GPU VERTは、各頂点処理のためにこのメソッドを呼び出して)変換することです基本的な方法VERT変数は、UVおよび法線を通るような本実施形態のように、必要に応じて他の変数を渡すことができ、以下に説明します。以下の方法によりUnityCG.cginc例UnityObjectToClipPosクリップ空間に変換頂点座標。すなわち、直接MVPは座標変数行列にMUL(UNITY_MATRIX_MVP、v.vertex)法によって実現することができます。実際にUnityObjectToClipPosはMVPのための直接計算行列です。

			float4 vert(float4 vertex:POSITION):SV_POSITION { return UnityObjectToClipPos(vertex); } 

前頂点座標を計算するに、本実施形態の処理は、その値が0である場合、すなわち、その距離_Dismiss法線方向を移動させる、移動されていない頂点座標クリップ空間を行います。

5.4元シェーダFRAG

次のようにカラー画素を生成するために使用される最も基本的なフラグメントシェーダは、入口パラメータは、直接、カラー値を返すことができません。

            float4 frag():SV_TARGET
			{ return fixed4(0.5,1,0,1); } 

返されたこの実施形態は、比較的複雑であり、即ち、tex2D(_MainTex、f.uv)法により紫外線値、メインサンプルテクスチャに応じて、対応するカラー値を得るために、_DissolveTexテクスチャをよれば、クリップ(画素捨てませんdissolveTexColor.rgb-_DissolveCutoff);色成分値がRGBの範囲であるため、すなわち、値が小さい値オフ0廃棄クリップよりも大きい場合、すなわち、この位置で、この時の位置に対応し、フラグ・カラー値を返さない、任意の色が表示されません0-1、対応する値も_DissolveCutoff 0-1です。

6.おわりに

基本的なシェーダによってシェーダ基本的な構文は、明確に説明フォローアップ拡大していきます。

おすすめ

転載: www.cnblogs.com/llstart-new0201/p/11953025.html