본문 바로가기

Library/Computer Graphics

Lighting Under Local Illumination Model 3D 기하 정보를 읽어서, 이 기하 정보에 각 변환을 적용하여 화면에 렌더링했다고 하더라도, 이것이 곧 사실적인 3D 영상을 보여주는 것은 아니다. 왜냐하면 음영과 같은 조명 효과를 적용하지 않았기 때문이다. 아무리 3D 기하 정보를 토대로 물체를 구성했다고 하더라도, 광원을 적용하지 않으면 2D 영상과 다를 바 없는 밋밋한 영상을 얻을 수 밖에 없다. 조명 효과는 크게 지역 조명 모델(Local Illumination Model)과 전역 조명 모델(Global Illumination Model)으로 분류할 수 있는데, 개념적으로 둘의 가장 커다란 차이는 다른 물체로부터의 빛의 영향에 대한 고려이다. 지역 조명 방식에서는 다른 물체로부터의 입사되는 빛을 직접 추적하지 않는다. 하지만, 전역 조명 모델에서.. 더보기
DirectX HLSL Semantics 시멘틱(semantics)이란, 파라미터가 어떤 의도를 가지는지 알려주는, 쉐이더의 입력, 출력에 추가적으로 붙는 문자열이다. 시멘틱은 쉐이더 스테이지들 사이에서 전달되는 모든 변수들에 반드시 존재해야 한다. Direct3D 9와 Direct3D 10의 버텍스 쉐이더, 픽셀 쉐이더에서 지원되는 시멘틱은 다음과 같다. Vertex Shader Input Semantics (Input / Description / Type) BINORMAL[n] / Binormal / float4 BLENDINDICES[n] / Blend indices / uint BLENDWEIGHT[n] / Blend weight / float COLOR[n] / Diffuse and specular color / float4 NORMA.. 더보기
D3D10 Pipeline : Output-Merger Stage 아웃풋 머저(OM, output-merger) 스테이지는 파이프라인 상태, 픽셀 쉐이더에 의해 생성된 픽셀 데이터, 렌더 타겟의 요소, 그리고 깊이 / 스텐실 버퍼의 조합을 사용해서 최종적으로 렌더링될 픽셀의 컬러값을 생성한다. (OpenGL의 프래그먼트 연산 과정과 비슷하다) OM 스테이지는 어느 픽셀이 보여져야 할지 결정하고, 최종적인 픽셀 색상을 섞는(blending) 마지막 단계이다. 여기서, D3D9와 D3D10의 차이점은 다음과 같다 : D3D9는 어느 픽셀이 렌더 타겟에 출력되어야 할지 결정하기 위해 알파 테스트를 구현했지만, D3D10은 알파 테스트 구현을 제공하지 않는다. 이것은 픽셀 쉐이더나, 깊이 / 스텐실 테스트 함수를 사용하여 같은 효과를 낼 수 있기 때문이다. 깊이 / 스텐실 테.. 더보기
D3D10 Pipeline : Pixel Shader Stage 픽셀 쉐이더 스테이지는 개별 픽셀 조명, 포스트 프로세싱(post-processing)과 같은 풍부한 쉐이딩 기법을 가능하게 해준다. 픽셀 쉐이더는 상수 변수, 텍스처 데이터, 보정된 버텍스 값, 그리고 픽셀 당 생성되는 다른 데이터들을 조합하는 프로그램이다. 래스터라이저는 프리미티브에 의해 덮여지는 각 픽셀에 대해 픽셀 쉐이더를 호출하지만, 픽셀 쉐이더가 수행되지 않도록 널로 설정할 수도 있다. 텍스처를 멀티샘플링할 때, 각각의 텍스처에 대해 깊이 / 스텐실 테스트를 하는 것에 비해 픽셀 쉐이더는 픽셀에 대해 한번만 호출된다. 깊이 / 스텐실 테스트를 거친 샘플들은 픽셀 쉐이더 출력 컬러값으로 갱신된다. Inputs 파이프라인이 지오메트리 쉐이더(geometry shader)와 무관하도록 설정되었다면,.. 더보기
D3D10 Pipeline : Rasterization Stage 래스터라이저(rasterizer) 스테이지는 형상이나 프리미티브를 구성하는 벡터 정보를 픽셀로 구성되는 래스터 이미지로 변환한다. 래스터라이즈화가 이루어지는 동안, 각각의 프리미티브들은, 각 프리미티브들에 걸쳐 있는 버텍스 별 데이터를 보정하고 픽셀로 변환된다. 래스터라이즈화는 뷰 절두체에 맞게 버텍스를 클리핑하거나, 원근 처리를 위해 z로 나눠주거나, 프리미티브들을 2D 뷰포트에 매핑할지, 픽셀 쉐이더를 어떻게 호출할지 따위를 모두 포함한다. 픽셀 쉐이더를 사용하는 것이 선택 사항인 반면, 래스터라이저 스테이지는 언제나 클리핑, 원근 처리, 점들을 동차 좌표계로의 변환, 버텍스의 뷰포트 매핑을 수행한다. 파이프라인에게 픽셀 쉐이더가 없다고 알려줘서 래스터라이즈화를 하지 않을 수도 있고, D3D10_DE.. 더보기
D3D10 Pipeline : Stream-Output Stage 스트림 아웃풋(SO, stream-output) 스테이지의 목적은 지오메트리 쉐이더(geometry shader) 스테이지로부터의 버텍스 데이터를 메모리 상의 하나, 또는 이 이상의 버퍼에 연속적으로 출력하기 위한 것이다. SO 스테이지는 파이프라인에서 지오메트리 쉐이더 스테이지 후, 그리고 래스터라이저 스테이지 바로 전에 위치한다. 메모리로 스트림 출력되는 데이터는 연속적인 렌더링 패스에서 파이프라인으로 다시 읽혀지거나 스테이지 자원으로 복사될 수도 있다. 스트림 출력되는 데이터는 총량은 다양하다. ID3D10Device::DrawAuto()와 같은 API는 쓰여진 데이터의 총량에 대해 질의를 하지않고도 이 데이터를 다룰 수 있도록 디자인되었다. 삼각형이나 선 스트립이 IA 스테이지에 바인딩될 때, 각.. 더보기
D3D10 Pipeline : Geometry Shader Stage 지오메트리 쉐이더(geometry shader) 스테이지는 버텍스를 입력으로 받고, 출력으로 버텍스를 생성할 수 있는, 프로그램이 정의한 쉐이더 코드를 실행한다. 하나의 버텍스에 대해서만 동작하는 버텍스 쉐이더와 달리, 지오메트리 쉐이더는 하나의 완전한 프리미티브를 구성하는 모든 버텍스를 입력으로 받는다. 또, 지오메트리 쉐이더는 인접한 프리미티브들의 버텍스들도 입력으로 가져올 수 있다. 지오메트리 쉐이더는 IA 스테이지에서 생성된 값(시멘틱) SV_PrimitiveID를 사용한다. 이것은, 각 프리미티브 데이터가 그냥 보내질 것인지, 아니면 계산될 것인지 결정할 수 있다. 지오메트리 쉐이더는, 선택된 단일한 위상을 형성하는 여러 개의 버텍스을 출력하는 능력을 가진다. 지오메트리 쉐이더의 호출(invoc.. 더보기
D3D10 Pipeline : Vertex Shader Stage D3D10은 3개의 프로그래밍 가능한 쉐이더 스테이지를 가진다. 버텍스 쉐이더(vertex shader) 스테이지, 지오메트리 쉐이더(geometry shader) 스테이지, 픽셀 쉐이더(pixel shader) 스테이지가 그것이다. 각각의 쉐이더 스테이지는 고유한 기능을 수행하며, 쉐이더 모델 4.0을 기반으로 한다. 버텍스 쉐이더 스테이지는 IA(Input-Assembler)로부터 넘어온 버텍스를 처리한다. 즉, 각 버텍스에 대해서 변환, 스키닝(skinning), 모핑(morphing), 조명(lighting)과 같은 연산을 수행한다. 버텍스 쉐이더는 언제나 하나의 버텍스에 대해 연산을 하며, 하나의 버텍스를 출력값으로 가진다. 버텍스 쉐이더는 반드시 파이프라인이 실행되기 위해 활성화되어 있어야 하.. 더보기
D3D10 Pipeline : Input-Assembler Stage D3D10의 각 파이프라인은 기능적인 면에서 스테이지라는 것으로 분류된다. D3D10 파이프라인의 첫 단계는 IA(Input-Assembler) 스테이지인데, 이 스테이지의 가장 큰 목적은 파이프라인의 다른 스테이지에서 효과적으로 데이터를 사용할 수 있도록 데이터를 가공하는 것이다. (* 블로그지기 : IA 스테이지는 그 이름 때문에 OpenGL의 프리미티브 어셈블리(Primitive Assembly) 단계와 비슷하게 느껴지지만, OpenGL의 프리미티브 어셈블리 단계는 버텍스 연산 이후에 일어나며, 주로 클리핑 처리를 담당한다는 면에서 D3D10의 IA 스테이지와 구별된다) IA 스테이지는 버텍스들을 이미 정의되어 있는 D3D 프리미티브 타입으로 조합하는데, D3D10에서는 D3D9과 비교할 때 새롭게.. 더보기
DXGI(DirectX Graphics Infrastructure) Wrapper Implementation DXGI(DirectX Graphics Infrastructure)는 D3D의 렌더링 기능에 비해 상대적으로 변화가 느린, 하드웨어를 다루는 모듈을 D3D로부터 떼어낸 것이다. 주로 디스플레이 어댑터, 출력기기(outputs : 모니터), 스왑 체인과 같은 부분을 따로 구현한 것인데, 이로 인해 D3D는 좀 더 자유롭게 기능을 확장할 수 있게 되었다. 과거에는 프로그래머들이 렌더링과 상관없는 하드웨어 인프라에 접근하는 부분도 D3D의 버전업에 따라 다시 구현해야 했는데, DXGI의 등장으로 더 이상 이런 시간 소모적인 일을 할 필요가 없어졌다. 그러나, D3D10이나 D3D11을 다루는 대부분의 예제 코드들은 스왑 체인과 D3D 디바이스를 같이 생성하고 있다. 예제 코드이긴 하지만, 실제 코드를 이런 방.. 더보기