목록전체 글 (67)
헤더파일
셰이더를 진행하기 전에 알아야할 몇가지 수학 지식이 있습니다. 셰이더에서 mul 함수를 써서 행렬과 벡터를 곱할 때 mul(행렬, 벡터) - 행기준 행렬mul(벡터, 행렬) - 열기준 행렬 DirectX는 행우선 행렬힙니다.따라서 셰이더에서 mul(벡터, 행렬) 로 계산하려면 tranpose해서 셰이더에 전달해야 합니다. 직교행렬직교행렬이란 모든 열벡터 즉, x, y , z 축 벡터가 자기 자신을 제외한 나머지 모든 열벡터들과 직교이면서 크기가 1인 단위 벡터들로 구성된 행렬을 의미합니다. 직교행렬의 중요한 성질중 하나는 직교행렬의 역행렬은 전치행렬과 같다는 것입니다. 이 성질은 접선공간에서 월드공간으로 변환하는 행렬을 만들 때 유용합니다. 접선공간법선 매핑을 할 때 텍스쳐로부터 법선을 받아오는데 이 법..
전에 만들었던 조명 셰이더에선 표면에 일괄적인 조명을 만들었습니다. 하지만 실제 물체는 표면의 재질에 따라 흡수하는 빛의 양이 다르고 우리가 사용할 모델들도 일괄적인 색이 아닌 텍스쳐로 이루어져 있습니다. 우리가 물체를 지각할 수 있는 이유는 대부분 난반사광 덕분이므로 텍스쳐의 텍셀에 난반사광의 양을 곱해서 조명과 텍스쳐를 합칠 수 있습니다. 이 기본 텍스쳐를 디퓨즈 맵이라고 합니다. 그렇다면 정반사광은 어떻할까요? 디퓨즈 맵의 텍셀을 정반사광에 그대로 사용할 수도 있지만 두가지 이유때문에 정반사광용으ㅗ 스페큘러맵을 따로 만드는 경우가 있습니다.1. 난반사광이 반사하는 빛과 정반사광이 반사하는 빛의 스펙트럼이 다른경우2.각 픽셀이 반사하는 정반사광의 정도를 조절하는 경우 예를 들어 사람에 얼굴에 조명을 ..
툰세이더는 스트리트 파이터4, 보더랜드 같은 비실사적인 그래픽을 구현하는 셰이더입니다.만화를 보면 명암 처리를 부드럽게 하는 대신에 칼같이 딱딱 끝어서 2~3단계로 합니다. 사실 구현하는 건 굉장히 쉽습니다. 전에 만든 난반사광 셰이더를 조금만 고치면 됩니다. 둥근 코사인 곡선이 일반적인 난반사광 셰이더라면 뚝뚝 끊기는 계단 모양이 툰셰이더입니다. 픽셀셰이더에서 쓰는 diffuse값을 5단계로 나누기만 하면 됩니다. 1.정점 셰이더 float4x4 gWorldViewProjectionMatrix;float4x4 gWorldInverseMatrix;float4 gWorldLightPosition; struct VS_INPUT { float4 Position : POSITION0; float3 mNormal..
정반사광 정반사광은 난반사광과는 달리 한 방향으로만 반사되는 빛으로 입사각이 출사각과 같은 것이 특징입니다. 따라서 정반사광의 효과를 보려면 빛이 반사되는 방향에서 물체를 바라봐야만 합니다. 정반사광을 계산하는 여러 기법중 게임업계에서 많이 사용하는 퐁모델은 반사광과 카메라벡터가 이루는 각도의 코사인값을 구하고 그 코사인 값의 거듭제곱한 값이 정반사광이 됩니다. 사실 코사인값을 제곱하는 것만 빼면 난반사광을 구하는 공식이랑 다르지 않습니다. 제곱하는 이유는 정반사광이 난반사광보다 더 빠르게 감소하기 때문입니다. 위 그래프에서 볼 수 있듯이 거듭제곱할 수록 코사인값이 더 빠르게 감소하는 걸 볼 수 있습니다. 제곱하는 수준은 표면에 재질에 따라 다릅니다. 거친 표면일수록 정반사광이 덜 타이트하므로 거듭제곱 ..
빛이 없으면 물체를 볼 수 없습니다.이 당연한 사실을 자주 까먹는 이유는 실생활에서 완전히 칠흑 같은 어둠을 찾기 힘들기 때문입니다. 왜일까요? 바로 끝없이 반사하는 빛의 성질 때문입니다. 딱히 눈에 띄는 광원이 없더라도 대기중의 미세입자에 반사되어 들어오는 빛까지 있으니까요.이렇게 물체에 반사되어 들어오는 빛을 간접광이라 하고 광원으로 부터 직접 받는 빛을 직접광이라 합니다. 이 두가지 빛 중 간접광은 수 많은 반사를 거쳐야 하기 때문에 계산하기 매우 어렵습니다. 따라서 이번에는 직접광만을 계산할 것입니다. 난반사광(Diffuse Light)스스로 빛을 내지않는 물체를 우리가 볼 수 있는 이유는 다른 물체가 발산하는 빛이 이 물체의 표면에서 반사되기 때문입니다. 이때, 여러 방향으로 고르게 반사되는 빛..
텍스쳐 좌표는 위치를 표현하는 x,y와 구별하기 위해 u,v로 나타냅니다.3D물체를 이루는 구성요소는 삼각형이므로 2번 삼각형의 왼쪽꼭지점에 이미지의 오른쪽 귀퉁이 픽셀을 출력할 것과 같은 지시를 내릴 수 있습니다. 텍스처위의 픽셀을 정수로 나타내면 이미지 파일 크기에 따라 유동적이게 되므로 색깔과 같이 백분율(0~1사이 값)로 나타냅니다. uv 좌표의 범위에 따라 다양한 효과를 줄 수 있습니다. (1,0) ~ (0,1)로 하면 텍스처의 좌우를 뒤집을 수 있고 (0,0) ~ (1,2)로 하면 텍스처가 위아래로 두번 반복할 수 있습니다. 1. 정점셰이더텍스처 매핑을 하려면 텍스처로 사용할 이미지 하나가 필요합니다. 텍스처를 입히는 작업은 어디에서 해야 할까요? 텍스처는 정점에 입히는 게 아니라 표면을 구성..
글의 내용은 포프 김이 지은 셰이더프로그램 입문을 정리한 것에 불과합니다. 작성한 코드는 hlsl이므로 실제 결과를 보기위해서 따로 만든 DirectX 프레임워크가 필요합니다.(렌더몽키란 프로그램으로 연습하는 것도 좋습니다.) 셰이더에서 사용할 수 있는 입력 값으로는 전역변수와 정점데이터가 있다.이 둘을 구분하는 기준은 한 물체를 구성하는 모든 정점이 동일한 값을 사용하느냐의 여부입니다.만약 동일한 값을 이용한다면 전역변수가 되어야 하고 아니면 정점데이터의 일부로 값을 받아야 합니다. 1)정점셰이더 1.정점데이터 정점셰이더에서 입력받을 데이터는 주로 구조체형식으로 만듭니다.struct VS_INPUT{float4 mPosition : POSITION;} 지금은 입력데이터가 하나지만 나중에는 여러개가 될 ..
게임은 본질적으로 상호작용이기 때문에 미리 캐릭터가 어떻게 움직이고 행동할지 예측할 수 없습니다. 그렇기 때문에 게임 에니메이션은 영화처럼 프레임이 길게 이어지게 만들지 않고 대신 게임 캐릭터의 움직임을 세세한 동작 단위로 끊어서 만든다. 이 개별적인 움직임들을 애니메이션 클립이라 한다. 1.타임라인모든 애니메이션 클립은 로컬 타임을 갖고 있다. 클립의 시작점에서 t = 0이고 끝에서 t = T인데 여기서 T는 클립의 전체 재생 시간이다. 하지만 게임에서 화면이 갱신되는 시간은 항상 정수일 수 없고 컴퓨터 사양에 따라서도 상대적이다. 이렇기 때문에 애니메이터는 재생중 특정시각에 키 포즈 나 키 프레임이라 불리는 주요한 포즈들만 잡고 컴퓨터가 선형 보간 등의 방법을 사용해 그 사이를 채운다. 프레임 - 1..