목차

간단한 3D 파이프라인

  1. Vertex Shader → Rasterizer : 정점위치
  2. Rasterize → Pixel Shader : 픽셀위치
  3. Pixel Shader → Screen : 색상

정점쉐이더 (Vertex Shader)

BAsic (HLSL)

기본 코드

VertexShader

VS_OUTPUT vs_main( VS_INPUT input )

변수 정의를 위한 타입

입출력 부분 구조체 선언

// POSITION은 시맨틱으로 좌표정보임을 알리는 역할을 한다.
struct VS_INPUT { float4 mPosition : POSITION; }
struct VS_OUTPUT { float4 mPosition : POSITION; }

화면 변환을 위한 행렬 변수 정의

이 과정이 끝나야 화면에 표시할 수 있는 좌표계로 변환된다.

// 좌표계변환을 위한 각 행렬들. 셰이더 작성 프로그램에는 사전에 정의된 값이 있음.
float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

정점의 좌표 변환

VS_OUTPUT vs_main(VS_INPUT Input)
{
  VS_OUTPUT Output;
  Output.mPosition = mul( Input.mPosition, gWorldMatrix );
  Output.mPosition = mul( Output.mPosition, gViewMatrix );
  Output.mPosition = mul( Output.mPosition, gProjectionMatrix );	
  return Output;
}

픽셀셰이더

float4 ps_main() : COLOR
{
  return float4( 1.0f, 0.9f, 0.0f, 1.0f );
}

난반사 (Diffuse)

람베르트 모델

난반사광 구하기

이런 순서로

정반사 (Specular)

정반사Supercular Light는 입사각과 출사각이 같은 빛.

정반사를 구하는 것은 퐁모델을 사용.

구할때 사용할 벡터

HLSL function

reflect() 벡터의 반사벡터를 (빛의 입사각의 반사각을 구하는) 구하는 함수
param1 : 입사각 방향벡터, param2 : 입사각이 닿는, 반사면의 법선벡터
mul() 벡터 곱하기
normalize() 노말벡터 구하기
dot() 벡터 내적을 구한다. 두 벡터의 <m>cos{theta}</m>를 구하는데도 사용