さて。前回得た情報を元にUnityのシェーダーを3dsMaxへ移植していきます。
それぞれ移植するための対応表をメモしておきます。
GUIへのプロパティの移植
プロパティをGUIに表示する対応表は以下の通りです。
Unity
//Texture2D
_BaseMap ("BaseMap", 2D) = "white" {}
//float
_Farthest_Distance ("Farthest_Distance", Float ) = 10
//float(スピナー制限付きfloat)
_HighColor_Power ("Tweak_MaskLevel", Range(0, 1)) = 0
//float4(colorなど)
_BaseColor ("BaseColor", Color) = (1,1,1,1)
//bool(トグル系)
[MaterialToggle] _Is_Base ("Is_Base", Float ) = 0
3dsMax HLSL
//Texture2D Unityと違って初期値は設定できないってエラーでました。方法はないものでしょうか?
Texture2D _BaseMap : BaseMap<
string UIName = "Base_Map";
string ResourceType = "2D";
int Texcoord = 0;
int MapChannel = 1;
>;
//float(スピナー制限付きfloat)
float _HighColor_Power<
string UIName = "HighColor_Power";
string UIType = "IntSpinner";
float UIMin = 0.0;
float UIMax = 1.0f;
> = 0.0f;
//float4(colorなど)
float4 _BaseColor <
string UIName = "Main Color";
> = float4(1.0f, 1.0f, 1.0f, 1.0f); // Main color
//bool(トグル系)
bool _Is_Base : NormalMapToBase
<
string UIName = "Is_Base";
string UIWidget = "None";
int LightRef = 1;
> = false;
ライトの情報をとる
Unityには"_WorldSpaceLightPos0"とか"_LightColor0"とか一個目のライト(一番明るいライトらしい)の方向を取るビルトインシェーダー変数が最初から用意されています。
これも用意する必要がありますが、私はHLSLでは以下のGUIプロパティにして外に出しています。これにより、ユーザーがドロップダウンで割り当てたいライトを選択する形にできます。
//1個目のライトディレクション
float3 _Light0Dir : DIRECTION
<
string UIName = "Light 0 Direction";
string Space = "World";
string UIWidget = "None";
int RefID = 100;
string Object = "TargetLight";
> = { 0.0, -1.0, 0.0 };
//ライトタイプ ライトタイプによって処理をわけたいときに使います。
int _Light0Type : LIGHTTYPE
<
string UIName = "Light 0 Type (2:spot 3:omni 4:dir)";
float UIMin = 0;
float UIMax = 5;
float UIStep = 1;
int LightRef = 1;
> = { 4 };
//ライトカラー
float3 _Light0Color : LIGHTCOLOR
<
int LightRef = 0;
string UIWidget = "None";
> = float3(1.0f, 1.0f, 1.0f);
//ライトインテンシティ
float _Light0Intensity : LIGHTINTENSITY
<
float UIMin = 0;
float UIStep = 0.1;
string UIWidget = "None";
int LightRef = 1;
> = 1.0;
float Bias = 1.00f;
float g_PointSize = 1.25f;
float LineSize = 2.00f;
};
Unityのビルトインシェーダー変数詳細はこちら。
複数の光源に対応することもできるみたいですが、今回は1光源のみで制作しましたので調べていません。
入力データセマンティクス
基本的にほぼ同じですがUnityでは、Binormal(従法線)をサポートしていないため、法線と接線から求めていましたが、HLSLでは従法線の宣言が有効なので計算する必要がなさそうです。
Unity
struct VertexInput {
float3 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float2 UV0 : TEXCOORD0;
};
//以下頂点シェーダーで従法線(従接線)を求める
// calculate bitangent(binormal) in vertex shader
float3 bitangent = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
3dsMax HLSL
struct VertexInput {
float3 Position : POSITION;
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
float2 UV0 : TEXCOORD0;
};
今日はここまで。
続き