본문 바로가기

셰이더 (Shader)/셰이더 프로그래밍 입문 - Pope Kim (완)12

[HLSL] 챕터12 - 외곽선 찾기 / 양각 효과 외곽선 찾기 // 외곽선이란? 3D 공간을 2D 이미지에 그려넣으면 물체 개념이 없다. 외곽선 정확히 찾기 힘들다. 그러나 명암이나 색조가 다르면 외곽선을 인식할 수 있다. 명암이 확 바뀌는 픽셀을 찾아 외곽선이라 해주자. 비교할 대상이 필요해진다. 주위 픽셀들을 모두 살펴야한다. 살펴보는 픽셀 많아지면 느려진다. 상하 좌우 대각선 한단계만 찾아보는 것을 3x3 두단계 살펴보는 것을 5x5 텍셀을 살펴본다고 표현하겠다. // 컨벌루젼 사용 3x3, 5x5 픽셀 한번에 계산하기 편하게끔 컨벌루션을 사용한다. (convolution) 현재 픽셀 중심으로 그 주위에 있는 픽셀마다 가중치를 곱한다. 그 결과를 모두 더한다. 이 값으로 현재 픽셀의 값을 변경하는 연산이다. 행렬 형태로 저장한 가중치의 집합을 커널.. 2023. 3. 21.
[HLSL] 챕터11 - 흑백/세피아 사진 만들기 // 원리 2D 이미지를 가져다 한번에 고쳐버리기 마치 포토샵에 여러가지 필터 적용하듯이. 이를 포스트프로세싱이라고 한다. (post processing) 렌더링 결과 2D 이미지로 저장하려면? 렌더타킷 사용한다. 여기에 그려두고 다른 색으로 인화하는 것이 쉽다. 포스트프로세싱 기법을 어떻게 입히나? 3D 그래픽 파이프라인 관점에서. 화면을 차지하는 모든 픽셀마다 픽셀셰이더를 호출한다. 하지만 임의로 픽셀셰이더 호출할 수 있는 방법 없다. 래스터라이저의 도움을 받아야하기 때문이다. 래스터라이저가 작동하려면 정점셰이더에서 정점 출력해주어야한다. 그래서 화면을 꽉 채우는 사각형을 그린다. 여기에 2D 텍스쳐를 씌운다. 화면 가득 채우는 사각형은 곧바로 화면공간(투영공간)에 있다고 가정한다. 개념상 화면에 존.. 2023. 3. 21.
[HLSL] 챕터10 - 그림자매핑 새로 등장하는 그림자 기법 대부분은 그림자매핑 개량판이다. // 원리 (a), (d), (f)는 가로막는 물체 X, 햇빛 O (b), (c), (e) 가로막는 물체 O, 햇빛 X, 그림자 O 즉 그림자란 빛과 어떤 물체 사이에 다른 물체가 있을 때, 입사광선을 가로막아서 생기는 현상이다. 1, 2, 3 점선 화살표를 보라. 1번은 가로막는 물체 0개, 2번은 1개, 3번은 2개다. 2번이나 3번이나 그림자 생기는 것은 똑같다. 따라서 빛을 가로막는 물체가 몇 개가 있던, 제일 처음 가로막는 물체만이 중요하다. 입사광선을 가로막는 첫번째 물체가 그림자를 드리운다. 이 정리를 이용한 것이 그림자 매핑이다. 빛 사이에 물체가 있다는 것을 어떻게 알 수 있을까? 두 단계에 걸쳐 기법을 구현한다. // 1단계 :.. 2023. 3. 20.
[HLSL] 챕터9 - UV애니메이션과 울렁효과 강물, 마그마 흘러가는 모습. UV애니메이션을 사용한 것이다. 표면에 정점마다 UV 좌표를 지정한다. 이것을 한쪽으로 이동시킨다. // 시간의 흐름에따라 UV를 변경 그렇다면 현재 시간을 알아야한다. 셰이더는 GPU상에서 실행되어 시간을 구하는 함수가 없다. 그래픽 카드에는 시스템 클럭이 안달려있기 때문이다. 현재시간은 CPU에서 계산한 값 넘겨 받는다. 정점셰이더 float4x4 gWorldMatrix; float4x4 gViewMatrix; float4x4 gProjectionMatrix; float4 gWorldLightPosition; float4 gWorldCameraPosition; float gTime; float gWaveHeight; float gSpeed; float gWaveFrequ.. 2023. 3. 20.
[HLSL] 챕터8 - 환경매핑 환경매핑 (environment mapping) 셰이더 제작하기 // 환경매핑이란? 주위환경이 거울처럼 표면에 반사되는 것을 재현하는 기법이다. 표면이 입사광 전혀 흡수하지 않고 반사하면 거울이 된다. 끝없는 빛의 반사 구하는 것 어렵다. 따라서 이를 속임수를 써서 표현하는 것이다. 주위환경 미리 텍스쳐안에 저장해놓는다. 이 텍스쳐를 입힌다. // 주위환경을 360도 전부 텍스쳐에 담는 방법은 무엇인가? 여러방법이 있을 수 있다. 그 중에서 상하, 좌우, 전후 6개의 텍스쳐를 만들어 물체 주위를 감싸는 방법이 있다. 마치 스카이박스 원리와 같다. // 이 텍스쳐를 어떻게 사용하는가? 반사한 빛이 표면에 정반사 되어 눈에 들어온다. 이 방향성을 뒤집는 것이다. 아래와 그림과 같이 된다. 이를 이용해 부딪힌.. 2023. 3. 20.
[HLSL] 챕터7 - 법선매핑 TANGENT : 접선정보 시맨틱 BINORMAL : 종법선정보 시맨틱 transpose() : 전치행렬 구하는 함수 접선공간 : 법선맵 안에 법선이 존재하는 공간 // 법선매핑의 필요성 폴리곤 수 늘리면 속도가 느려지고, 메모리 소모가 커진다. 픽셀마다 법선을 정해준다. 각 텍셀에 법선을 저장하는 방식이다. 이 값을 픽셀셰이더에서 불러와 조명계산에 사용한다. 법선정보 담고 있는 텍스쳐를 법선맵이라고 한다. 이를 이용한 조명계산을 법선매핑이라고 한다. (normal mapping) // 텍스처에 법선정보를 저장하는 방식 XYZ를 RGB에 대입한다. 값의 범위를 0~1로 만든다. 단위벡터는 -1~1이다. 변환 공식은 다음과 같다. - 벡터 -> 맵 법선맵 RGB = 법선벡터 XYZ * 0.5 + 0.5 -.. 2023. 3. 19.
[HLSL] 챕터6 - 툰셰이더 // 행렬 합치기 행렬을 미리 곱해 놓은 뒤 정점변환에 사용한다. 속도가 더 빠르다. 성능상 행렬 3번 곱하는 것보다 1번 곱하는게 빨라 미리 합치는 것이 좋다. // 역행렬 반대로 공간 변환을 할 때 유용하다. // 툰 셰이딩이란? 비사실적 렌더링 기법이다. 칼같이 끊어진 2~3단계의 명암 표현이다. 계단식으로 명암을 표현하는 것이 핵심이다. 난반사광을 0.2단위로 무조건 올림하여 표현한다. // 월드공간 -> 지역공간으로 변환법 난반사광 계산시 월드행렬이 필요하다. 월드공간에서의 정점 위치와, 정점 법선을 만드는데 필요하였다. 따로 월드 행렬을 전역변수로 전달해줘야하나? 그래도 되지만, 1번만으로 똑같은 일이 가능하다. 핵심은 모든 변수가 동일 공간에 있어야한다이다. 빛의 위치를 지역공간으로 변환해주.. 2023. 3. 19.
[HLSL] 챕터5 - 디퓨즈 / 스페큘러매핑 // 디퓨즈맵 vs 스페큘러맵 난반사광에 적용하는 텍스쳐 디퓨즈맵 정반사광에 적용하는 텍스쳐 스페큘러맵 디퓨즈맵은 색상 표현에 사용한다. 각 픽셀이 반사하는 정도를 조절하는 용도로 스페큘러맵을 사용한다. 따라서 두 텍스쳐의 생김새가 많이 다르다. (스페큘러맵은 흑백으로 표현 가능) // 물체의 색에 영향을 미치는 또 다른 요소 조명의 색이다. 조명의 색은 전역변수로 쉽게 지정 가능하다. // 정리 난반사광 = 빛의 색상 X 난반사광의 양 X 디퓨즈맵의 값 정반사광 = 빛의 색상 X 정반사광의 양 X 스페큘러맵의 값 // 스페큘러맵에 대하여 스페큘러맵을 보라. 텍스쳐는 언제나 색상정보만을 가지지는 않는다. 각 픽셀이 반사하는 정반사광의 양을 담고 있다. 픽셀 수준에서 제어하고 싶은 변수가 있다면 텍스쳐 사.. 2023. 3. 18.
[HLSL] 챕터4 - 조명셰이더 기초 // 직접광 vs 간접광 직접광은 광원으로부터 직접 받는 빛이다. 다른 물체에 반사되어 들어오는 빛을 간접광이라고 한다. 간접광은 직접광보다 계산이 어렵다. 계산법 중 하나로 광선추적 기법이 있다. (ray tracing) 이 장에서는 직접광만 다룬다. // 조명모델 간접광까지도 다루는 조명모델을 전역조명모델이라고 한다. (global illumination model) 직접광만을 다루는 조명모델을 지역조명모델이라고 한다. (local illumination model) // 빛을 구성하는 요소 난반사광, 정반사광이 있다. (diffuse, specular) // 난반사광이란? 여러 방향으로 고르게 반사되는 빛을 말한다. 표면이 거칠수록 난반사가 심해진다. 입사광 중 일부는 난반사광이 되고, 일부는 정반.. 2023. 3. 18.