썸네일 Half Lambert DirectX11 자체엔진을 만들면서 일반적으로 많이 알려진 Diffuse Light모델인 Lambert(N·L)계산을 한 뒤 적용 후 몇가지 문제점을 발견했다. 1. 조명을 받지않는 부분이 너무 어둡다. 2. specular가 쎄다.(인간 캐릭터인데 도자기나 플라스틱 재질같다) 3. 색이 묘하게 칙칙하며 전체적으로 퀄리티가 낮다. 이것을 해결하기 위해 Valve사에서 처음 개발된 Half Lambert Lighting모델을 적용시켜보기로 하였다. Half Lambert란? 명암이 매우 강렬하게 나오는 Lambert의 특성을 보완하기위해 램버트 코사인 법칙의 코사인 곡선이 절반이 되도록 "1/2"을 곱한 다음, "1/2"을 더하고, 다시 이것을 제곱해서 완만한 곡선으로 변환해서 음영처리를 하는 라이팅 기..
썸네일 툰셰이더(1) 만화cartoon처럼 명암을 칼같이 딱딱 끊어서 처리하는 툰셰이더에 대해 알아보도록 하겠다. 완만한 곡선의 기존 난반사광 그래프와 달리 툰 셰이더는 ceil()함수를 사용하여 특정 값을 무조건 올림하여 사용한다. 코드를 작성하기에 앞서 RenderMonkey Workspace에 난반사광 계산을 위한 float4 빛의 위치값 변수를 생성한다. 정점의 법선정보를 위해 Stream Mapping에 float3 Normal 필드를 추가하고 임의의 색을 지정하기 위해 float3 변수 또한 추가해준다. 그리고 기존 작업에서는 float4x4 World행렬, View행렬, Projection행렬을 각각 변수를 따로 만들어 곱했으나 이번에는 행렬들을 미리 합쳐 불필요한 연산을 줄일 수 있도록 하겠다. 이때 한가지 고..
썸네일 디퓨즈/스페큘러 매핑 일반적으로 물체는 특정 한가지 색만 존재하는것이 아니다. 그렇다면 3D상에서 여러 색을 표현하려면 어떻게 해야할까? 이때 사용하는 것이 난반사광에 적용하는 텍스처, 바로 디퓨즈맵diffuse map이다. 정반사광 또한 마찬가지로 스페큘러맵specular map을 사용하여 원하는 부분에 원하는 값으로 표현이 가능하다. 쉽게말해 난반사광 = 빛의 색상 X 난반사광의 양 X 디퓨즈맵의 값 정반사광 = 빛의 색상 X 정반사광의 양 X 스페큘러맵의 값 렌더몽키에서 셰이더 코드를 작성하기 전 필요한 사전 작업이 있다. 정점셰이더 Vertex Shader float4x4 gWorldMatrix; float4x4 gViewMatrix; float4x4 gProjectionMatrix; float4 gWorldLight..
썸네일 기초적인 조명셰이더(2)_정반사광specular light 난반사광diffuse light에 이어 정반사광specular light에 대해 알아보겠다 정반사광specular light란? 난반사광과 달리 한 방향으로만 반사되는 빛으로 입사각이 출사각과 같은 것이 특징이다. 게임업계에서 널리 사용하는 기법인 퐁phong 모델을 사용해보겠다. 퐁 모델은 반사광과 카메라벡터(카메라에서 현재 위치까지 선을 그은 벡터)가 이루는 각도의 코사인 값을 구하고, 그 결과를 여러번 거듭제곱하면 정반사광을 구할 수 있다고 한다. 거듭제곱을 하는 이유는? 거듭제곱수가 늘어남에 따라 코사인 값이 빠르게 줄어드는데 정반사광의 폭은 난반사광에 비해 상당히 타이트하므로 이를 재현하기 위해 코사인 값에 거듭제곱을 한다. 정반사광을 구현하기 위해 반사광 벡터와 카메라 벡터가 필요한데 반사광 ..
썸네일 기초적인 조명셰이더(1)_난반사광diffuse light 대부분의 게임에서 표준으로 사용되는 조명셰이더 기법을 알아보도록 하겠다. 빛을 구성하는 요소로 크게 난반사광diffuse light과 정반사광specular light가 있다. 난반사광diffuse light이란? 발산하는 빛이 물체의 표면에 반사될때 여러방향으로 고르게 반사되는 빛을 가리킨다. 이때문에 어느방향에서 바라봐도 물체의 명암이나 색조가 크게 변하지 않는다. 게임에 주로 사용하는 람베르트lambert 모델을 살펴보겠다. 람베르트 모델은 표면법선과 입사광이 이루는 각의 코사인 값을 구하면 그게 바로 난반사광의 양이라고 한다. 람베르트 모델은 코사인 함수를 내적dot projuct연산으로 대신해 난반사광의 값을 구한다. ※ 두 벡터가 이루는 각의 코사인 값은 그 둘의 내적을 구한 뒤 두 벡터의 길..
썸네일 텍스처매핑 이미지 파일을 정점들로 이루어진 3D Object에 입히려면 어떻게 해야 할까? 답은 각 정점을 텍스처 위에 있는 한 픽셀에 대응시켜주면 된다. RGB, 256가지의 색을 픽셀셰이더에서 비트 수와 상관없이 통일적으로 표현하기위해 백분율로 표현한 것과 같이 텍스처 또한 마찬가지로 백분율로 표현한다. 정점셰이더 Vertex Shader float4x4 gWorldMatrix; float4x4 gViewMatrix; float4x4 gProjectionMatrix; struct VS_INPUT { float4 Position : POSITION0; // UV좌표를 정점데이터의 일부로 전달한다. // TEXCOORD(texture coordinate) 시맨틱을 사용한다. float2 TexCoord : TEXC..
썸네일 빨강셰이더 AMD RenderMonkey를 사용하여 HLSL문법에 대해 알아보도록 하겠다. HLSL High-Level Shader Language : DirectX에서 프로그래밍 가능한 셰이더와 함께 사용하는 C와 비슷한 고급 셰이더 언어이다. 정점셰이더 Vertex Shader : 각 정점의 위치를 공간변환한다. // float4x4 4x4 행렬 데이터 전역변수 선언 float4x4 gWorldMatrix; float4x4 gViewMatrix; float4x4 gProjectionMatrix; // 정점셰이더에서 입력받을 데이터 구조체 선언 struct VS_INPUT { // float4 4개의 성분을 가지는 벡터 데이터형 // POSITION 태그를 이용하여 정점 위치를 받아온다. float4 Positi..
썸네일 Shader란? "셰이더란 화면에 출력할 픽셀의 위치와 색상을 계산하는 함수" 픽셀들의 최종 색상 값(RedGreenBlueAlpha)을 return한다. ※ 아주아주 간략한 3D 파이프라인 ↓정점데이터(3D 모델 자체 즉 폴리곤) 입력 정점셰이더 ↓3D 물체를 구성하는 정점들의 위치를 화면 좌표로 변환(공간 변환, space transformation) 래스터라이저 ↓정점셰이더가 출력하는 정점의 위치를 차례대로 3개씩 모아 삼각형을 만든 뒤, 그 안에 들어갈 픽셀들을 찾아낸다. 픽셀셰이더 ↓화면에 출력할 최종 색상을 계산 화면 출처 : 셰이더 프로그래밍 입문