NinaShader

Unity Shader 学習メモ

【uGUI】_TextureSampleAdd

UnityのUI用のデフォルトシェーダー(UI-Default.shader)の frag関数の中に下記のような処理があります。

half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

この _TextureSampleAdd って何だろうと思って調べてみました。

 

ちょうど Unity Forum に同じ質問をしている人がいました。

https://forum.unity.com/threads/what-does-_texturesampleadd-do.531422/

f:id:ninagreen:20190602150724p:plain

Alpha8フォーマットのテクスチャをUIで使用しているかどうかによって、エンジンが自動的に設定するものです。使用している場合は (1, 1, 1, 0) が設定され、使用していない場合は (0, 0, 0, 0) が設定されます。

だそうです。

 

Unityのリファレンスにも説明ありました。

docs.unity3d.com

その他欄に載ってます。

UI 専用に Unity によって自動的に設定されます。使用するテククチャが Alpha8 型 (値は (1,1,1,0) に設定) か、そうでないか (値は (0,0,0,0) に設定) に基づきます。

 

ところで、Alpha8って何だっけ?(昔調べたけど忘れた)となったので再度調べ直しました。リファレンスにはアルファのみのテクスチャとしか書いてませんね。

docs.unity3d.com

 

あとは、この記事がわかりやすいです。

logicalbeat.jp

 

調査したところ、Alpha8ではシェーダではRGBは0とみなされる為、_TextureSampleAddを(1,1,1,0)として加算し、白色にしているという状態でした。

Alpha8を使わなければ_TextureSampleAddは削除しても〜と思われるかもですが、Textは内部でAlpha8テクスチャを参照している様なので、同じシェーダを利用するとTextも暗くなってしまいます!

よって_TextureSampleAddをどうにかしたい時は「Alpha8の利用の有無」「Textでは更に別シェーダを用意する」などの考慮が必要そうです。

 

他のコードは何となく読み取れるけど一応調べてみました。

tex2D

uv座標(IN.texcoord)からテクスチャ(_MainTex)上のピクセルカラーを取得して返す関数

 

_MainTex

sampler2D _MainTex;

コード内で sampler2D型の_MainTex変数を定義しており、中身はInspectorで設定したテクスチャです。

IN.texcoord

フラグメントシェーダーへの入力を下記のように定義していて、texcoordはTEXCOORD0というセマンティクスであり、1番目のuv座標らしい。

struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
float4 worldPosition : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
};

 

Unityのリファレンスにも少し説明がありました。

docs.unity3d.com

 

  • POSITION は頂点位置、一般的には float3 か float4 です。
  • NORMAL は通常の頂点で、一般的には float3 です。
  • TEXCOORD0 は、第 1 の UV 座標で、一般的に、float2float3float4 です。
  • TEXCOORD1TEXCOORD2TEXCOORD3 は、それぞれ第 2、第 3、第 4 の UV 座標です。
  • TANGENT は、(ノーマルマッピングで使用される)接線ベクトルで、一般的には、 float4 です。
  • COLOR は、頂点ごとの色で、一般的には、 float4 です。

わからないことを調べ始めたら、別のわからないことが出てきて、それを調べてたら別のわからないことが出てきて... の繰り返しですね。