
뭐랄까. 무인도에서 불 피우는게 얼마나 어려운게 깨닫는 것 처럼.
아무 생각없이 사용하던 라이트 하나 생성하게 하는게 얼마나 어려운 일인지를 깨닫다.
float4x4 WorldViewProj : WORLDVIEWPROJ ;
float4x4 World : WORLD;
//노말에 사용하기 위해 등장하신 월드좌표계십니다. 좌표계가 월드까지만 가도 상관없으니 더 할 필요가 없는거죠.
//굳이 노말값은 카메라 프로젝션을 할 필요가 없으니 여기까지만 계산한 좌표계를 처음에 선언해 줍니다.
texture basemap : DIFFUSEMAP
<
string UIName = “BASE”;
int Texcoord = 0;
int MapChannel = 1;
;
sampler2D basesampler = sampler_state
{
texture = ;
MinFilter = Linear ;
MagFilter = Linear ;
MipFilter = Linear ;
};
float3 lightdirection : DIRECTION
<
string UIName = “라이트 디렉션”;
string Object = “DirectionalLight”;
string Space = “World”;
int refID =0;
;
// 라이트 방향을 float3로 만들어 드렸습니다. 나머지 구성요소는 일단 외웁니다.
//대소문자 주의하세요. 미리 규약되어 있는 변수니까요.
float3 lightcolor : LIGHTCOLOR
<
int lightRef = 0;
string UIWidget = “none”;
;
//라이트 칼라를 정해줍니다.
//lightref 수치가 이전 앞에 있는 라이트 방향과 연결을 시켜서 같은 라이트라는 설정을 해주는 것으로 보입니다.
//string UIWidget은 어디다 쓰는건지 아시는 분? 없어도 별 상관 없던데요
void VS
(
in float4 ipos :POSITION,
in float3 inormal :NORMAL,
//빛 계산을 위한 노말값 나오셨습니다.
in float2 itex :TEXCOORD0,
out float4 opos :POSITION,
out float2 otex : TEXCOORD0,
out float3 olight :TEXCOORD1
//빛 계산해서 출력하기 위한 TEXCOORD 추가되셨습니다.
)
{
float3 onormal=normalize(mul(inormal,(float3x3)World));
//이걸 먼저 정해주지 않으면, 오브젝트를 회전시킬때 빛의 방향이 그냥 따라서 회전 되어 버리는 불상사가 일어납니다.
//이것은 노말라이즈. 노말을 월드 좌표계에 맞춰 회전시키는 항목이랍니다. 모르면 외워요.
//월드 좌표계는 4x4 메트릭스인데, 그중에 회전에 관여하는것은 3x3 뿐이랍니다. mul자체는 행열의 곱셈이니 그냥 그렇고..
//normalize 는 단위행열 이상인 값을 단위행열로 만들어 주는 역할을 합니다.
opos = mul(ipos,WorldViewProj);
otex = itex;
olight = lightcolor * max(0, dot(onormal,lightdirection));
}
//saturate가 max로 바뀌었습니다. 결과는 같습니다. 단, 앞에 0, 이 붙는군요. 이것 역시 0과 1사이의 값이 나오게 됩니다.
//max는 최소값, 최대값을 정해주면, 그 중 최대값을 출력해 버리므로, (0, 최대값) 모습이 됩니다.
//유닛벡터끼리의 dot 프로덕트이므로 어차피 1이상 나올 일이 없는거죠. 음수가 나오면 0으로 끊어버림되는거고 뭐.
void PS
(
in float2 otex : TEXCOORD0,
in float4 ilight : TEXCOORD1,
//픽셀 쉐이더에서 TEXCOORD1을 받아올때 Float4로 교묘하게 바뀐걸 주의하십시오.
//이럴때 w 값에는 1을 자동으로 집어넣게 됩니다.
out float4 oColor :COLOR
)
{
oColor = tex2D(basesampler,otex) * ilight;
//간단하게 라이트의 TEXCOORD를 곱해주면 끝나게 됩니다.
}
technique jp1
{
pass p0
{
vertexshader = compile vs_1_1 VS();
pixelshader = compile ps_2_0 PS();
}
};