그래픽스

혼합 현재 래스터화하는 픽셀(소위 원본 픽셀)을 후면 버퍼에 이미 래스터화되어 있는 픽셀(소위 대상 픽셀)과 섞는 혼합(blending) 기법이다. 물이나 유리 같은 반투명 물체를 렌더링할 수 있게 된다. 혼합 공식 현재 래스터화 중인 ij번째 픽셀, 즉 원본 픽셀(source pixel)에 대해 픽셀 셰이더가 출력한 색상이 Csrc라고 하자. 그리고 현재 후면 버퍼에 있는 ij번째 픽셀, 즉 대상 픽셀(destination pixel)의 색상이 Cdst라고 하자. 혼합을 적용하지 않는다면 Csrc가 Cdst를 덮어써서 후면 버퍼의 ij번째 픽셀의 새로운 색상이 된다. 그러나 혼합을 적용하면 Csrc와 Cdst를 일정한 공식에 따라 혼합해서 얻은 새로운 색상 C가 Cdst를 덮어쓰게 된다. 혼합 공식은 ..
텍스처 좌표 Direct3D는 u축이 이미지의 가로 방향이고 v축이 이미지의 세로 방향인 텍스처 좌표계를 사용한다. 텍스처를 구성하는 요소들을 텍셀(texel)이라고 부른다. 텍스처 좌표는 [0, 1]의 구간으로 정규화된 좌표성분들을 사용하는데 텍스처 이미지의 크기와는 독립적인 구간의 좌표들을 다룰 수 있게 하기 위한 것이다. 물체에 텍스처를 입히려면, 물체의 각 3차원 삼각형마다 그 삼각형에 입힐 텍스처 이미지상의 삼각형을 지정해야 한다. 정점에 지정된 텍스처 좌표들을 3차원 삼각형 면을 따라 삼각형 정점들과 동일한 s, t매개변수로 보간해서 텍스처 좌표 (u, v)를 구한다. 실제 응용에서는 여러 종류의 서로 무관한 이미지들을 하나의 커다란 텍스처 맵 (이를 텍스처 대지도(texture altas)라..
1. 파도 조명 예제를 빨간빛만 방출하도록 수정하고, 빛의 세기가 진동하게 해서 빛이 껌벅이는 것처럼 수정하라. UpdateMainPassCB에 Light 객체의 Strength를 변경하면 된다. void LitWavesApp::UpdateMainPassCB(const GameTimer& gt) { mMainPassCB.Lights[0].Strength = { sin(gt.DeltaTime() * 2000.f), 0.0f, 0.0f}; } 2. 파도 조명 예제에서, 재질들의 거칠기를 여러 가지로 변경하면서 시험해 보라. 언덕의 거칠기를 0, 파도의 거칠기를 1로 했을 때의 결과 void LitWavesApp::BuildMaterials() { grass->Roughness = 0.0f; water->Ro..
1. 도형 예제를, GeometryGenerator::CreateSphere 대신 GeometryGeneartor::CreateGeosphere를 사용하도록 수정하고, 세부 수준을 0, 1, 2, 3으로 바꿔보자. 3. 8장의 두개골 메시를 적재해서 렌더링해보자. 8장의 연습문제 'LitColumns' 예제 폴더의 Models/Skull.txt는 정점 목록과 색인 목록이 들어있다. 일단 이 두개골의 정점과 색인을 읽어서 정점 버퍼와 색인 버퍼를 만들어야 한다. 그 후, 기하구조 보조 구조체인 MeshGeometry를 채워서 멤버 데이터인 Geometries에 집어넣는다. void ShapesApp::BuildSkullGeometry() { std::ifstream fin("Models/skull.txt"..
2. 상자 예제를, 정점 버퍼 두 개를 사용해서 파이프라인에 정점들을 공급하도록 수정하라. 결론적으로 정점과 다른 입력 슬롯으로 색상 버퍼를 파이프라인에 묶어야 한다. 그러기 위해서는 색상을 위한 버퍼와 해당 버퍼의 뷰를 만들어서 IASetVertexBuffers 함수를 호출해야 한다. BoxApp 클래스에 색상 버퍼를 위한 멤버 변수를 만들어 준다. class BoxApp : public D3DApp { ... private: Microsoft::WRL::ComPtr ColorBufferCPU = nullptr; Microsoft::WRL::ComPtr ColorBufferGPU = nullptr; Microsoft::WRL::ComPtr ColorBufferUploader = nullptr; ... ..
5.7 테셀레이션 단계들 테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서(세분) 새로운 삼각형들을 만드는 과정을 말한다. 새 삼각형들을 새로운 위치로 이동함으로써 원래 메시에는 없는 세부적인 특징을 만들어 낼 수 있다. 테셀레이션에는 여러 가지 장점이 있다. 카메라에 가까운 삼각형들에는 테셀레이션을 적용해서 세부도를 높이고, 먼 삼각형들에는 테셀레이션을 적용하지 않는 방식의 세부수준(level of detail: LOD) 메커니즘을 구현할 수 있다. 관찰자가 실제로 볼 수 있는 부분에만 더 많은 삼각형을 사용하게 되므로 효율적이다. 메모리에는 저다각형(low-poly) 메시, 즉 적은 수의 삼각형들로 이루어진 메시를 담아두고 즉석에서 삼각형들을 추가함으로써 메모리를 절약할 수 있다. 애니메이션이나 ..
5.6 정점 셰이더 단계 정점 셰이더(vertex shader)를, 정점 하나를 받아서 정점 하나를 출력하는 함수로 생각해도 된다. 개념적으로, 하드웨어 안에서 다음과 같은 일이 일어난다고 할 수 있다. for(UINT i = 0; i < numVertices; ++i) outputVertex[i] = VertexShader( inputVertex[i] ); 변환, 조명, 변위 매핑 등 수많은 특수 효과를 정점 셰이더에서 수행할 수 있다. 5.6.1 국소 공간과 세계 공간 물체의 기하구조를 장면 전역의 좌표계를 기준으로 직접 구축하는 것이 아니라 물체 자신의 국소 좌표계를 기준으로 구축하는 것이 더 편하다. 전자의 좌표계를 세계공간(world space)라고 하고 후자를 국소 공간(local space)..
렌더링 파이프라인은 3차원 장면의 기하학적 서술과 가상 카메라의 위치 및 방향이 주어졌을 때, 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는데 필요한 일련의 단계들 전체를 가리키는 용어이다. 5.5 입력 조립기 단계 입력 조립기 (input assembler: IA) 단계는 메모리에서 기하 자료(정점들과 색인들)를 읽어서 기하학적 기본도형을 조립한다. 5.5.1 정점 정점은 기하 도형을 특징짓는 고유한 점이다. Direct3D의 정점은 공간적 위치 이외의 정보도 담을 수 있다. 이 덕분에 복잡한 렌더링 효과의 구현이 가능해진다. 조명 구현을 위해 정점에 법선 벡터를 추가하거나, 텍스처 적용을 위해 정점에 텍스처 좌표를 추가할 수 있다. Direct3D는 응용 프로그램이 ..
4.4 시간 측정과 애니메이션 애니메이션을 정확히 수행하려면 시간을 측정해야 한다. 애니메이션의 인접한 두 프레임 사이에 흐른 시간의 양을 측정할 수 있어야 한다. 4.4.1 성능 타이머 정밀한 시간 측정을 위해, Windows가 제공하는 성능 타이머를 사용한다. 성능 타이머의 시간 측정 단위는 '지나간 클럭 틱 들의 개수'이다. 성능 타이머로부터 틱 수 단위의 현재 시간을 얻을 때에는 다음과 같이 QueryPerformanceCounter 함수를 사용한다. __int64 currTime; QueryPerformanceCounter((LARGE_INTEGER*)&currTime); 초 단위 시간을 얻으려면, 우선 QueryPerformanceFrequency 함수를 이용해서 성능 타이머의 주파수(초당 틱..
4.3 Direct3D의 초기화 Direct3D 초기화 과정은 길지만, 응용 프로그램 실행 시 한 번만 해주면 된다. 책에서 말하는 초기화 과정은 다음과 같다. D3D12CreateDevice 함수를 이용해서 ID3D12Device를 생성한다. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다. 4X MSAA* 품질 수준 지원 여부를 점검한다. 명령 대기열과 명령 목록 할당자, 그리고 주 명령 목록을 생성한다. 교환 사슬을 서술하고 생성한다. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 대상 뷰를 생성한다. 깊이 스텐실 버퍼를 생성하고, 그와 연관된 깊이 스텐실 뷰를 생성한다. 뷰포트와 가위 판정용 사각형들을 설정한다.
KANTAM
'그래픽스' 카테고리의 글 목록