//————————————————————–
float4x4 WorldViewProj : WORLDVIEWPROJECTION;
//————————————————————–
texture BaseMap
<
string NTM = “Base”;
;
sampler2D BaseSampler = sampler_state
{
Texture = (BaseMap);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
float3 LightAmbient : ATTRIBUTE = float3( 0.3, 0.3, 0.3 );
//rgb로 된 엠비언트 라이트를 하나 생성했습니다. 속성은 ATTRIBUTE 입니다. 기본값은 0.3, 0.3, 0.3입니다.
//재미있게도 이대로 만들면, 맥스에서 엠비언트 칼라를 조정가능하게 됩니다.
//GLOBAL을 쓰는 방법도 있습니다. 그걸 쓰면 프로그램에서 조절하게 된답니다. 어떻게는 묻지 마십시오.
float3 LightDiffuse : Diffuse
<
string Object = “DirectionalLight”;
int ObjectIndex = 0;
;
//RGB로 된 디퓨즈 라이트를 생성했습니다. 디렉셔널 라이트를 받아왔습니다.
//이건 고정입니다. 다른 이름 라이트는 안됩니다.
// 오브젝트 인덱스값은 0번입니다.
float3 LightDirection : Direction
<
string Object = “DirectionalLight”;
int ObjectIndex = 0;
;
//벡터로 된 디퓨즈 라이트의 방향을 받아 왔습니다. 디렉셔널 라이트로부터 받아옵니다.
// 오브젝트 인덱스값은 0번입니다.
//————————————————————–
texture DarkMap
<
string NTM = “Dark”;
;
sampler2D DarkSampler = sampler_state
{
Texture = (DarkMap);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
//————————————————————–
texture DetailMap
<
string NTM = “Detail”;
;
sampler2D DetailSampler = sampler_state
{
Texture = (DetailMap);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
//————————————————————–
void VS(
in float4 iPos : POSITION,
in float3 iNormal : NORMAL,
//라이트의 밝기를 계산하기 위해서 노말값 벡터를 입력받아옵니다.
in float4 iColor : COLOR0,
in float2 iBaseCoord : TEXCOORD0,
out float4 oPos : POSITION,
out float4 oColor : COLOR0,
out float2 oBaseCoord : TEXCOORD0,
out float3 oLight : TEXCOORD1
// 라이트를 위해서 텍스쳐 코디네이트 1번을 할당합니다. 텍스쳐 1번에 할당된 녀석이 라이트입니다.
)
{
oPos = mul( iPos, WorldViewProj );
oColor = iColor;
oBaseCoord = iBaseCoord;
oLight = LightAmbient + LightDiffuse * saturate( dot( -LightDirection, iNormal ) );
//쬐끔 어려운 부분입니다. 라이트 출력을 위해서 라이트값을 계산합니다.
// 첫 부분은 라이트 엠비언트 값입니다. 두 번째 값은 라이트의 디퓨즈 밝기 입니다.
//그러나 그냥 밝기가 아닙니다. 여기는 버텍스 쉐이더 부분이란걸 잊지 마십시오 .픽셀쉐이더 부분이 아닙니다.
//픽셀쉐이더 레벨에서 계산하는 라이트가 있습니다만, 지금 여기는 아닙니다.
//자아, 버텍스 라이팅에서는, 밝기를 결정하기 위해서 버텍스 노말의 각도와 빛의 노말 각도를 비교합니다.
//이 내적이 0도면 1. 90도면 0, 180 도면 -1 값을 나타냅니다.
//내적을 구하는 공식이 dot 이고, 여기서 라이트 방향의 반대방향 -그래야 노말과 같을테니- 과 노말의 값의
//내적을 비교합니다. 0도면 가장 밝은 1 값을 출력할 것입니다. 기울어질수록 어두워질 것입니다.
//그러나 saturate 로 인해서 음수는 나오지 않게 됩니다. 반드시 양수로 출력되게 될 것입니다.
}
//————————————————————–
void PS(
in float4 iColor : COLOR0,
in float2 iBaseCoord : TEXCOORD0,
in float3 iLight : TEXCOORD1,
out float4 oColor : COLOR)
{
float4 BaseColor = tex2D( BaseSampler, iBaseCoord );
float4 DarkColor = tex2D( DarkSampler, iBaseCoord );
float4 DetailColor = tex2D( DetailSampler, iBaseCoord );
oColor.rgb = BaseColor.rgb * DarkColor.rgb * DetailColor.rgb * 2 * iLight;
//그래서 출력된 최종 결과값이 iLight 입니다. 이것은 최종 출력 칼라에 그냥 곱해만 주면 끝입니다.
oColor.a = BaseColor.a;
}
//————————————————————–
technique JPCorp
<
bool UsesNiRenderState = true;
bool UsesNILightState = true;
{
pass P0
{
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_2_0 PS();
}
}