bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

FXComposer超入門12

今回からは色々と省略。

視線と平行になるような平行光源を使ってシルエットっぽいことをしてみた。
リムライト的な感じ。通常は、ポストエフェクトで行うのが普通
頂点シェーダーで行うと汚くなるので、次はピクセルシェーダーでやってみる。
1Dテクスチャを使うともっと綺麗になると思う。

/*

% Description of my shader.
% Second line of description for my shader.

keywords: material classic

date: YYMMDD

*/

float4x4 WIT : WorldInverseTranspose <string UIWidget = "none";>;
float4x4 WVP : WorldViewProjection <string UIWidget = "none";>;
float4x4 W : World <string UIWidget = "none";>;
float4x4 VI : ViewInverse <string UIWidget = "none";>;
float4x4 IW : WorldInverse <string UIWidget = "none";>;

// Camera
float4 CameraPos : Position
<
	string UIName = "Camera Pos";
	string Object = "PerspectiveCamera";
	string Space = "World";
>;


// struct
struct appdata
{
	float4 Pos		: POSITION;
	float3 Normal	: NORMAL;
};

struct V2Pdata
{
	float4 HPos		: POSITION;
	float4 Color	: COLOR;
};

V2Pdata mainVS(appdata IN)
{
	V2Pdata OUT = (V2Pdata)0;
	float3 world_position = mul((float3x3)W, IN.Pos.xyz);
	float3 camera_position = CameraPos.xyz;
	float3 light_direction = normalize(camera_position-world_position);
	float3 normal = normalize(IN.Normal);
	float3 world_normal = mul((float3x3)WIT, normal).xyz;
	float rim = ((abs(dot(light_direction, world_normal))<0.3)?0.0:1.0);
	OUT.HPos = mul(WVP,IN.Pos);
	OUT.Color = float4(rim, rim, rim, rim);
	return OUT;
}

float4 mainPS(V2Pdata IN) :COLOR
{
	return IN.Color;
}

technique technique0 {
	pass p0 {
		CullFaceEnable = false;
		DepthTestEnable = true;
		VertexProgram = compile vp40 mainVS();
		FragmentProgram = compile fp40 mainPS();
	}
}