Unity Shader修行
アリカのトゥーンシェーディングを頑張るためにUnityのシェーダーを嫌々々々々々々々々々々勉強する 参考サイト
なんか面白そうなツール見つけた
神サイトkeroxp.icon
前提として
2017/10/8時点での意見keroxp.icon
本当はこんな💩言語を💩真面目に勉強したくなんかないんだ俺は
UnityはShaderLabをプログラマブルシェーダと言い張るのであれば、Unityは今すぐに別の言語を開発するかトランスパイラを作るべきだ
正気のプログラマーなら、ShaderLabの既存のプログラミング言語との乖離に💩ざりして、机をグーパン不可避
ShaderLabは本当にひどい。最低だ。
でも俺は3DアリカをUnityで動かしたいから、諦めないよ
メモ
基本構文
code:shader
ShaderLabのシェーダの基本構文はこれだけである
やった!!簡単だ!!
Shader部
シェーダの名前を設定する
UnityのコンテクストメニューからSurfaceShaderを作成すると、大抵「Custom/FileName」になっている
これが実は結構重要で、/で区切られた順にUnityのマテリアルメニューの階層構造になる
この場合、Custom -> FileName という名前のシェーダとしてUnity側では認識される
ファイル名は関係ない
Properties部
シェーダのプロパティを宣言する
ここに宣言したプロパティはUnity Editor上から設定でき、CGPROGRAM部で参照できる
〜ShaderLab沼一階〜
code:shader
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
ここの文法がもう怪しい
オレオレDSL作るおじさんが作ったようなヤバさを感じる
数値
code:shader
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
なるほどね…
1. name: シェーダ内での参照名
カッコの中身が
1. UnityEditorでの表示名
2. UnityEditorでのプロパティ
= の右辺が値
ということか。
ここらへんはUnityEditor拡張ともちょっと似てるからまぁ許す
numberは数値だね。普通の小数点表示と考えて良さそうだ
code:shader
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Glossiness ("Smoothness", Range(0,1)) = .5
_Glossiness ("Smoothness", Range(0,1)) = 1
↑は全部OK
ただし、指数表記は使えない。5.6e+24とか。使うことないと思うけど。
ここで宣言したnumberは、CGPROGRAM部ではfloatとして参照できる
Color, Vector
code:shader
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
カラーはUnityで使われるRGBA32の色
floatなので、範囲は0.0 ~ 1.0
Vectorは単純な4次元の数
オーダーはXYZW
クォータニオンとしても使えるということだろう
使うことあんの??
Texture
code:shader
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
一番使いそうなプロパティ。テクスチャを設定できる。
エディタではテクスチャピッカーが表示される。
はいでた!馬脚表した!もう文法破綻してますやん!!なんやねんdefaulttextureって!!あとその後ろのカッコ!!
For 2D Textures, the default value is either an empty string, or one of the built-in default Textures: “white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,0), “gray” (RGBA: 0.5,0.5,0.5,0.5), “bump” (RGBA: 0.5,0.5,1,0.5) or “red” (RGBA: 1,0,0,0).
2Dテクスチャには空文字か、ビルトインテクスチャ"white","black","gray","bump","red"のどれかを設定できる
これら以外の文字を入力した場合、空文字と同じ処理になる
Cubeはキューブマップ(なにそれ??)
サイコロの展開図のようなテクスチャらしい
3Dは3Dテクスチャ(なにそれ??)
わかりませんでした
実際にそういうファイルはないのか?
プロパティの属性とDrawer
プロパティには属性(C#のAttribute相当)をつけることができる
NoScaleOffset - 属性のテクスチャプロパティーに関して、マテリアルインスペクターの texture tiling/offset 欄を表示しません。 Normal - テクスチャプロパティーが法線マップであることを示しています。 HDR - テクスチャプロパティーが High Dramatic Range (HDR) テクスチャであることを示しています。 Gamma - Float/Vector プロパティーが UI で sRGB 値で指定されており (色とまったく同じ)、使用するカラースペースに応じて変換が必要な可能性があることを示しています。詳しくは、Cg/HLSL でシェーダープロパティーを参照するを参照してください。 PerRendererData - テクスチャプロパティーは、MaterialPropertyBlock の形式の各レンダラーごとのデータであることを示しています。 マテリアルインスペクターでは、このプロパティー用に テクスチャ部分の UI が変わります。