夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityでShaderを勉強する その⑨ ここまで勉強したShaderを復習する

本日はShader勉強枠です。

 今回までUnityのShaderを勉強していきました。

  redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

 今回はここまで勉強したShaderの知識を一度振り返って復習します。

〇Shaderとは?

 UnityのShaderは『3Dオブジェクトを描画するためのプログラム』です。

 Unity内でマテリアルと紐づくことでオブジェクトの描画を行っています。

 ShaderLabという言語で記述し、中身はCG/HLSL言語で記述されています。

 f:id:Holomoto-Sumire:20200330082456j:plain

〇ShaderLabの中身

 ShaerLabを大雑把にみると次のようになります。

Shader "ShaderName" {
    Properties {
        //...
    }
    SubShader {
        //...
    }
 
    FallBack "Diffuse"
}

〇Shaderの構造体

 Shaderは主に以下の構造体で構成されています。

●Name
 Shader ○○/▽▽
{
---Shaderの中身---
}

 このShaderは○○というカテゴリーの▽▽という名前のShaderになります。

 例えば

Shader Custom/Alpha{
---Shaderの中身---
}

Shader Custom/Beta{
---Shaderの中身---
}

という2種類のShaderが存在した場合UnityではCustomの中にAlphaとBetaが表示されます。

f:id:Holomoto-Sumire:20200425183843j:plain

●Properties

 ここに記述したものはUintyのマテリアルでパラメータとして扱うことができます。

 C#でいうところのPublic Classのような扱いでしょうか? 

 Properties{
 //Color
   _Color("Color",color) = (1,1,1,1)
  //テクスチャ
  _MainTex ("Albedo (RGB)", 2D) = "white" {}
 //スライダー(スライダー)
  _Power("Power",Range(0.1))=0
}

ここで記述したパラメータを使って処理を行う形になります。

 Propertiesで扱えるパラメータの形は主に以下のようになります。

 ・Color

 Properties{
 _Color("Color",color)=(1,1,1,1)
}

Unityでカラーを扱うことができます。

f:id:Holomoto-Sumire:20200425185751j:plain

 ・Range

 マテリアルでスライダーを表示させることができます。

 Properties{
 _Power("Power",Range(0,1))=0.5
}

 右辺に与えた数値は初期数値になります。複雑な表現を行うShaderには必ずと言ってもいいほど使用されています。この場合細かい表現が行えます。

 f:id:Holomoto-Sumire:20200425190004j:plain

・Texture(画像)

 画像を扱う場合のプロパティです。

 Properties{
 _MainTex("MainTexuter",2D)= "White"{}
}

・Float

 Properties{
  _Float("Float", Float) = 10.0
}

f:id:Holomoto-Sumire:20200425191020j:plain

FloatはRangeと同様数値を扱うことができます。

Vector

x,y,z,wそれぞれのベクトルを扱えます。

 Properties{
    _Vector("Vector", Vector) = (0.5, 0.1, 0.1, 0.1)
}

f:id:Holomoto-Sumire:20200425191121j:plain

Vectorは例えば海の波のように一定方向にテクスチャが流れるShaderでの流れる向きや速度を設定するなどの場面で使われるようです。

●SubShader

 SubShader枠はShaderを実際に記述する場所になります。

 CGPROGRAM~ENDCGの間はcg/HLSL言語で記述されます。

 #pragma ○○

 でどのようなShaderを書くかを記述します。

     #pragma surface surf Lambert

 ここまではサーフェースShaderのLambertのライティングで記述していました。

●Input構造体

Input構造体は描画するオブジェクトのテクスチャなど座標を扱うものを記述します。

Input{
 float2 uv_MainTex;
 float3 viewDir;
}

見る角度によってオブジェクトの状態を変える時などはviewDirを用います。 これは視線ベクトルを意味します。

● void surf() {}

実際の処理を記述します。

 void surf(Input IN,inout SurfaceOutput o)

Input構造体の情報をoとして扱うという意味です。

   void surf(Input IN, inout SurfaceOutput o) {
                    o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
                }
 o.Albedo = tex2D(_MainTex,IN.uv_MainTex).rgb;

ここではoのアルベド(光の反射)は_MainTexのRGBを用いることが記述されています。

〇Fallback

 最後にもしこのShaderがデバイスで動かなかった場合代わりに使用するShaderが記述されます。

 以上でShaderの基本の復習になります。

 前回最初に触った時よりもすらすら理解できています。

 次はここまで勉強したことを用いて応用します。