본문 바로가기

코딩10

[셰이더 프로그래밍] 06. 물체에 색을 입히는 디퓨즈/스페큘러 맵핑 실 세계에서 물체들이 다른 색을 갖는 이유는 물체마다 흡수.반사하는 빛의 스텍트럼이 다르기 때문이다. 예를 들면 검정색 표면은 모든 스펙트럼을 흡수해서 검정색인 것이고 햐안색은 모든 스펙트럼을 반사해서 하얀색이다. 빨간색으로 빨강색의 스펙트럼을 반사하고 그외 스펙트럼을 흡수하기 때문에 빨강색이다. - 그렇다면 표면이 빛을 흡수하는 성질은 쉐이더에서 어떻게 표현할 수 있을까? 표면 전체가 한 가지 색으로 칠해져있다면 간단히 전역변수를 사용하면 된다. 하지만 대부분의 경우 물체의 표면은 다소 복잡한 패턴을 가지고 있어서 각 픽셀하마 색상을 정해줘야 한다. 그러므로 표면에서 반사할 색을 이미지로 그린 뒤, 픽셀쉐이더에서 그 텍스쳐를 읽어와 조명 계산의 결과에 곱하면 된다. - 이전 공부를 살펴보면 난반사광과 .. 2023. 6. 5.
[셰이더 프로그래밍] 05. 기초적인 조명 쉐이더 (정반사) 정반사 (speculat light) 는 난반사광과 달리 한 방향으로만 반사되는 빛으로 입사각이 출사각과 같은 것이 특징이다! 따라서 정반사광의 효과를 보려면 빛이 반사되는 방향에서 물체를 바라보아야 한다. 난반사광과 마찬가지로 정반사광을 수학적으로 재현해내는 수학공식이 여러개 있다. 게임업계에서 널리 사용되는 기법은 바로 퐁 모델. 퐁 모델은 반사광과 카메라벡터(카메라에서 현재 위치까지 선을 그른 벡터)가 이루는 코사인 값을 구하고 그 결과를 여러번 거듭제곱 하면 정반사광을 구할 수 있다. 반사광 R 카메라벡터 V가 이루는 각도의 코사인 값을 구하는 것은 이전 난반사광에서 했던 계산과 별반 차이가 나지 않는다. 법선벡터와 입사광 벡터 대신에 반사광벡터와 카메라 벡터를 쓴다. A . B = ( a * d.. 2023. 6. 2.
[셰이더 프로그래밍] 04. 기초적인 조명 쉐이더 (난반사) 빛을 구성하는 요소는 크게 난반사광 (Diffuse light) 정반사광 (specular light) 으로 나뉘어져 있다. 난반사광 수학적으로 난반사광은 어떻게 계산할 수 있을까? 게임에서 주로 사용하는 것은 람베르트 모델이다. 표면법선 과 입사광이 이루는 각의 코사인 값을 구하면 그것이 난반사광의 양이라고 얘기했다. 먼저 코사인 그래프를 살펴보자, 위 그래프를 보면 입사광과 표면 법선의 각도가 0일때, 결과(y축의 값) 가 1이 되었다. 그리고 각도가 늘어날수록 점점 작아지다가 90도가 되면 0이 된다. 여기서 더 나아가면 그 후로는 음수값이 된다. 실제 세계에선 빛의 각도에 따라 결과가 어떻게 될까? 앞의 그림에서 평면이 가장 빛날 때는 당연히 해가 중천일때다. 해가 저물어감에 따라 표면도 점점 어.. 2023. 6. 1.
[셰이더 프로그래밍] 03. 텍스쳐매핑 텍스처매핑과 UV좌표 앞에서 3D물체를 이루는 구성요소는 삼각형이며 정점 3개로 삼각형을 만들 수 있다고 설명했었다. 그렇다면 삼각형 위에 이미지를 입히려면 어떤 방법을 써야할까? 먼저 이 삼각형의 왼쪽 꼭짓점에 해당 이미지의 오른쪽 귀퉁이 픽섹을 출력할 것 같은 명령을 내릴 수 있어야 한다. 삼각형은 정점 3개로 이루어져 있기 때문에 각 정점을 텍스쳐 위에 있는 한 픽셀에 대응시켜주면 된다. 그럼 텍스쳐 위에서 한 픽셀은 어떻게 가리킬 수 있을까? 텍스쳐란 결국 이미지 파일임으로 X=60 Y=101 에 있는 픽셀이라고 정의하면 될까? 만약 이렇게 정의한다면 추후 이미지 파일의 크기를 2배 늘리면 이것을 다시 X=120 Y=202으로 바꿔줘야만 할 것이다. 좋은 방법은 아니다. 그렇기때문에 텍스쳐 또한 .. 2023. 5. 31.