Featured image of post 셰이더 프로그래밍 기본공부 3

셰이더 프로그래밍 기본공부 3


뭐랄까. 무인도에서 불 피우는게 얼마나 어려운게 깨닫는 것 처럼.
아무 생각없이 사용하던 라이트 하나 생성하게 하는게 얼마나 어려운 일인지를 깨닫다.

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();
 }
};

Hugo로 만듦
JimmyStack 테마 사용 중