개발/DX11 7

[DX3D] Normal Mapping 노멀 매핑(법선 매핑)실제로는 평평한 표면에 불과한 객체에 대해, 마치 복잡한 질감이나 굴곡이 있는 것처럼 빛과 그림자가 반응하도록 만들어 주는 기법.  노멀 맵기존에 쓰이는 텍스처에는 RGB 값에 원본의 색이 들어있다면, 노멀 맵은 각 픽셀마다 RGB 색상 자료를 담는 것이 아니라 법선 정보를 담는다는 특징이 있다. 법선 맵의 각 픽셀은 RGB 채널에 압축된 x,y,z 좌표 성분을 담으며, 이 성분들은 하나의 법선 벡터를 정의한다.    RGB 채널에는 각 성분마다 0~255까지의 값을 담을 수 있다. 이를 노말 단위벡터인 (-1 ~ 1) 범위로 바꾸어서 계산해주어야 추출한 값을 노말 벡터로 사용할 수 있다. 각 성분의 값을 255로 나누어주면 (0 ~ 1) 범위로 줄어들고(텍스처 샘플링을 하면 0~1.. 개발/DX11 2024. 10. 16.
[DX3D] 반사광 반사광픽셀 쉐이더에서 반사 벡터를 계산하면 각 픽셀마다 반사 벡터 값이 나오는데 이를 카메라가 오브젝트를 쳐다보는 방향, 즉 Eye Vector와 이루는 각도를 비교하여 반사광을 계산할 수 있다. 구현을 위해 필요한 것들은 아래와 같다. 1. 픽셀의 View Space 위치2. 카메라의 View Space 위치3. Eye Vector4. 반사벡터 View Space는 카메라가 기준이 되기 때문에 카메라의 위치가 (0.f, 0.f, 0.f)이므로 카메라의 View Space 위치를 따로 생각할 필요가 없고, 또한 픽셀의 View Space에서의 좌표가 곧 Eye Vector가 된다.   두 벡터를 Normalize 하여 Reflect Vector와 -Eye Vector를 내적하면 두 벡터의 cos 값이 나.. 개발/DX11 2024. 10. 10.
[DX3D] 반사 벡터 반사 벡터3D Light 구현을 위해 반사광 계산을 해야 하는데 반사 벡터를 이용할 수 있다.HLSL에는 reflect() 라는 반사 벡터를 구하는 함수가 존재하지만 과정을 유도하여 직접 반사벡터를 구해보겠다. 1. 빛의 방향을 v, 표면의 노말 벡터를 n 이라고 했을 때 반사 벡터는 r 이다.2. 입사각과 반사각은 같으므로 반사 벡터 r 은 v와 노말 벡터 n 을 축으로 하여 대칭 모양이 된다. 3. 반사 벡터 r 은 v 벡터에 (-v · n) 을 두 번 더한 결과이므로 r = v + 2 (-v · n)n 이 나오게 된다.4. 마지막에 n을 곱해주는 이유는 (-v · n)이 스칼라 값이므로 단위 벡터인 n을 곱해주어 벡터로 만들기 위함이다. 개발/DX11 2024. 10. 10.
[DX3D] Cube Mesh 법선, 접선, 종법선법선(Normal) : 한 평면에 수직인 벡터접선(Tangent) : 정점 표면의 정보종법선(Bi-Normal) : 노말의 수직인 벡터 (접선과 법선의 외적)    정점2D 에서는 인덱스 버퍼를 이용하여 정점 4개 만을 사용해 RectMesh를 생성했었다. 3D 에서는 표면에 수직인 법선 벡터를 알아야 빛의 세기를 계산할 수 있으므로 (램버트 코사인 법칙 참고) 기존에 정점이 가지고 있던 정보인 Pos, Color, UV 값에 법선 벡터 정보가 추가되어야 한다.더 다양한 3D Light 연산을 위해 접선, 종법선 벡터도 같이 추가해 준다.  Rect Mesh  Rect Mesh 는 정점 6개로 Triangle Mesh 2개를 이어붙인 구조였다. 여기서 인덱스 버퍼를 활용하면 정점 수를.. 개발/DX11 2024. 10. 7.
[DX11] 렌더링 파이프라인 렌더링 파이프라인(그래픽 파이프라인) 물체 하나가 렌더링 되는 전체 과정  파이프라인 과정을 보면 중간에 Tessellator, Geometry Shader Stage가 보이는데 지금은 이 과정을 생략하고 오른쪽 이미지에 나온 파이프라인 단계를 보도록 하겠다. 파이프라인 단계는 총 5가지 단계로 이루어진다. 파이프라인 단계1. Input-assembler Stage2. Vertex Shader Stage3. Rasterizer Stage4. Pixel Shader Stage5. Output-Merger Stage  Input Assembler StageInput Assembler Stage에서는 렌더링할 때 필요한 데이터들이나 세팅 값 (대표적으로 그릴 물체의 정점 버퍼)들을 받는 단계이다.   Vert.. 개발/DX11 2024. 5. 9.
[DX11] Release 함수 Release() 동적 할당한 DX 객체를 메모리 해제 시킬 때 사용하는 함수.  동적할당한 DX 객체는 C++의 delete 함수를 사용하면 안되고 DX의 Release() 함수를 통하여 메모리 해제 시켜주어야 한다.   Release 동작  DX 객체를 보면 IUnknown을 상속받은 것을 확인할 수 있는데,   IUnknown을 보면 멤버로 Refernce Count 값을 가지고 있는 것을 알 수 있다. 처음에 객체를 생성하면 Count 값이 1인 상태로 생성을 하게 되고, 프로그램 종료시 Release() 함수를 호출해주면 그 때 Count 값이 0으로 감소하면서, 0일 때 내부에서 스스로 삭제하게 된다.  즉, Release() 함수를 호출하면 바로 삭제되는 것이 아니고 참조 카운트를 감소시키고.. 개발/DX11 2024. 5. 8.
[DX11] Device 초기화 및 렌더링 Device 초기화 작업 Device, Context 생성Swap Chain 생성View 생성출력 병합 단계 Device, Context 생성 Device : 객체를 생성하고, GPU에 메모리 할당 담당Context : 렌더링 작업 담당 D3D11CreateDevice() : Device 생성 함Swap Chain 생성 Swap Chain : 화면에 그림을 그리기 위한 버퍼를 관리하고 버퍼에 그려진 이미지를 화면에 출력하는 객체 Swap Chain이 관리하는 버퍼는 GPU 공간에 있음.-> 백 버퍼와 프론트 버퍼를 Swap 하며 화면에 그리는 방식 1. DXGI_SWAP_CHAIN_DESC 구조체 설정 값 2. Swap Chain 객체 생성__uuidof() 함수를 통해 객체 고유 아이디를 찾아서 포인터.. 개발/DX11 2024. 5. 6.