목차

a

이펙트파일 구성 요소

전역변수 선언

float4x4 mWVP; // 4x4 행렬
texture Tex; // 텍스쳐

샘플러스테이트

sampler Samp = sampler_state {
  Texture = <tex>;
  MinFilter = LINEAR;
  MagFilter = LINEAR;
  MipFilter = NONE;
  AddressU = Clamp;
  AddressV = Clamp;
}

정점셰이더 출력 구조체

struct VS_OUTPUT {
  float4 Pos : POSITION;
  float2 Tex : TEXCOORD0;
}

정점셰이더

//example
VS_OUTPUT VS (
  float4 Pos : POSITION
  float2 Tex : TEXCOORD0
) {
  VS_OUTPUT out = (VS_OUTPUT)0;
  out.Pos = mul(Pos, mWMP);
  out.Tex = Tex;
  return out;
}

픽셀셰이더

float4 PS( VS_OUTPUT in ) : COLOR
{
  return tex2D(Samp, in.Tex);
}

테크닉

technique TShader {
  pass P0 {
    VertexShader = compile vs_1_1 VS();
    PixelShader = compile ps_1_1 PS();
  }
}

명령

다수의 산술 함수들 지원

셰이더프로그래밍(책) 메모

간단한 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>를 구하는데도 사용