//디테일 맵 추가하기
//————————————————————–
float4x4 WorldViewProj : WORLDVIEWPROJECTION;
//————————————————————–
texture BaseMap // Basemap 이라는 texture 변수를 만들었다.
<
string NTM = “Base”; //메터리얼 에디터에 있는 Base 부분을 사용하기로 결정.
;
sampler2D BaseSampler = sampler_state
//BaseSampler 라고 하는 [스포이드=칼라 캐쳐]를 생성 = 샘플러 스테이트를 참고
{
Texture = (BaseMap);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
//샘플링 하는 방식 [스테이츠]
//텍스쳐는 베이스맵을 쓰고, UV는 Wrap (타일) 방식을 사용한다. 나머지는 그냥 리니어.
//————————————————————–
texture DarkMap // 이번엔 다크맵을 추가해 보자.
<
string NTM = “Dark”;
;
sampler2D DarkSampler = sampler_state
// 역시나 다크맵에 대한 샘플러를 만들었다. 한동안은 샘플러 2D만 쓰는걸로 외우자.
{
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 float4 iColor : COLOR0,
in float2 iBaseCoord : TEXCOORD0,
out float4 oPos : POSITION,
out float4 oColor : COLOR0,
out float2 oBaseCoord : TEXCOORD0
)
// 버텍스 쉐이더 설정이다.
// position 은 xyz지만 xyzw 를 쓰는 좌표계이다. 그래서 float4.
// 칼라는 rgba
// 베이스맵의 좌표계는 x 와 y 뿐.
// 이번엔 출력이다. 포지션과 칼라와 텍스쳐가 동일하게 출력된다.
{
oPos = mul( iPos, WorldViewProj );
oColor = iColor;
oBaseCoord = iBaseCoord;
}
//출력 연산을 하는 곳이다.
//포지션 계산법은 멀티 - 곱하기 (행렬의 곱하기 처리) [x,y,z,w][a11, a12, a13, a14]
// [a21, a22,a23 ….]
//칼라는 인풋과 아웃풋이 동일하다.
//좌표계도 동일하게 출력해 준다.
//————————————————————–
void PS(
in float4 iColor : COLOR0,
in float2 iBaseCoord : TEXCOORD0,
out float4 oColor : COLOR)
{
float4 BaseColor = tex2D( BaseSampler, iBaseCoord );
float4 DarkColor = tex2D( DarkSampler, iBaseCoord );
float4 DetailColor = tex2D( DetailSampler, iBaseCoord );
//디테일 맵을 Float4 로 변수로 만들어 하나 추가했습니다. 추가 계산을 위해서 만든것 뿐입니다.
//계산 공식이 두 가지 방향 가능합니다. 첫 번째 방식은 디테일맵의 밝기를 받아서,
//디테일 맵의 밝기가 0.5보다 크면 스크린으로 곱하고 , 어두우면 멀티로 곱해 버리는 if문입니다.
//먼저 밝기를 구하기 위해서 공식을 하나 만듭니다. rgb를 그냥 더해서 3으로 나누는 무식한 방법입니다.
float Brightness = (DetailColor.r + DetailColor.g + DetailColor.b)/3;
//밝기를 구했으면 if 문을 구동시킵니다. 포토샵 색상공식과 동일합니다.
if (Brightness < 0.5)
oColor.rgb = (BaseColor.rgb * DarkColor.rgb) * DetailColor.rgb / 0.5;
else
oColor.rgb = 1- (1- (BaseColor.rgb * DarkColor.rgb)) *(1- DetailColor.rgb);
//하지만 위 공식은 뻘짓입니다. 그냥 간단하게 디테일 칼라에 2만 곱해줘도 같은 결과가 나오게 됩니다.
//직접 계산해 보시면 간단합니다.
oColor.rgb = BaseColor.rgb * DarkColor.rgb * DetailColor.rgb * 2
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();
}
}