SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

Unityのシェーダーを3dsMaxのビューポートシェーダーへ移植する その2 プロパティ・ライト情報・入力データセマンティクス


さて。前回得た情報を元に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のビルトインシェーダー変数詳細はこちら。

docs.unity3d.com

 

複数の光源に対応することもできるみたいですが、今回は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;
};

 

 

今日はここまで。 

続き

www.suitechlog.net