텍스처 관련

DirectX11/Direct3D 초기화 2016. 7. 3. 17:31

자원 뷰 (Resource View)

자원 뷰는 자원을 파이프라인에 묶는데(bind) 사용되는 객체이다.


자원뷰의 종류

렌더 타겟 뷰 ( ID3D11RenderTargetView )

깊이/스텐실 뷰 ( ID3D11DepthStencilView )

셰이더 자원 뷰 ( ID3D11ShaderResourceView )

순서 없는 접근 뷰 ( ID3D11UnordereAccessView )


각각의 자원뷰에 대한 설명은 참고 링크에 있다.


자원 뷰들은 독립적으로 두가지 일을 한다.

1. Direct3D에게 자원의 사용방식(즉, 파이프라인의 어떤 단계에 묶을 것인지)을 알려주는 것

2. 생성 시점에서 무형식을 지정한 자원 형식의 구체적인 형식을 결정하는 것

( 무형식 자원의 경우 텍스처 원소를 한 파이프 라인 단계에서는 부동소수점 값으로서 사용하고 다른 단계에서는 정수로서 사용하는 것이 가능함을 뜻한다.)


D3D11 에선 리소스를 생성하고 자원 뷰를 사용해서 파이프 라인에 묶는다.

묶는 방법은

D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE 

위 처럼 단계를 지정한 결속 플래그를 사용해서 묶는다.


즉, 텍스처를 사용하기 위해선 그 텍스처에 자원뷰가 필요하고 자원뷰를 파이프라인에 묶어서 사용한다.(텍스처가 파이프라인에 묶이는것이 아니라 자원뷰가 묶이는 것)


텍스처의 플래그가 설정되지 않은 뷰에 대해선 뷰를 생성할 수 없다.

텍스처가 D3D11_BIND_DEOTG_STENCIL 플래스가 설정되지 않았으면 ID3D11DepthStencilView를 생성할 수 없다.


D3D11에서 이렇게 하는 이유는?

실행시점 모듈(런타임)과 구동기(드라이버)가 유효성 점검과 매핑을 뷰 생성 시점에서 수행할 수 있기 때문에 결속 시점에서의 형식 점검이 최소화된다.

따라서 텍스처를 렌더대상과 쉐이더 자원으로 사용할 때는 두 개의 뷰를 생성할 필요가 있다.


* 참고

[리소스 뷰에 대한 대략적인 설명]

http://grandstayner.tistory.com/entry/DirectX11%EC%9D%98-%EC%9E%90%EC%9B%90-%EB%B7%B0


[D3D11 텍스쳐 생성]

http://blog.naver.com/sorkelf/40169749877


[자원의 종류 등등]

http://grandstayner.tistory.com/entry/DirectX-11%EC%9D%98-%EC%9E%90%EC%9B%90%EB%93%A4%EC%9D%98-%EA%B0%9C%EC%9A%94


그 외 : 다중 표본화


이해한 것으로는 다중 표본화란 픽셀 하나만 가지고 하나의 픽셀을 출력하는 것이 아니라 화면을 부드럽게 만들기 위해 픽셀의 인접 픽셀들을 이용해서 화면을 부드럽게 출력하는 것이 아닐까 싶다...

 표본화를 많이 할수록 품질은 좋아지겠지만 속도가 느려진다.

#define D3D11_MAXMULTISAMPLE_SAMPLE_COUNT ( 32 )

 최대 표본 갯수는 32로 정해져 있지만 표본을 4개에서 8개 추출해서 하는 경우가 많다.

(심오한 내용으로 보이니 조금만 알고가는 정도로 넘어가자)

'DirectX11 > Direct3D 초기화' 카테고리의 다른 글

화면 출력  (0) 2016.07.02
Direct3D 기본  (0) 2016.07.02
posted by 알쿠미

화면 출력

DirectX11/Direct3D 초기화 2016. 7. 2. 23:11

1. 이중버퍼링

애니메이션이 깜빡대는 현상을 방지하기 위해 이중 버퍼를 사용한다.

하나는 화면 밖에서 그리고 바꿔치기 하는 것이다.

전면 버퍼와 후면버퍼를 교환해서 화면에 표시하는 것을 제시(Presenting)이라고 한다.


버퍼들을 바꾸는 것은 내용을 바꾸는 것이 아니라 포인터만 맞바꾸는 것이기 때문에 효율적이다.


* 후면 버퍼는 텍스처이므로 그 원소를 텍셀이라고 불러야 하지만, 여기선 그냥 픽셀이라고 한다.


2. 깊이 버퍼링

깊이 버퍼는 이미지 자료를 담지 않은 텍스처이다.

깊이 버퍼는 후면버퍼의 픽셀들과 일대일로 대응한다. 깊이는 0.0 ~1.0 커질수록 멀다.


한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해, 깊이 버퍼링, z-버퍼링 이라는 기법을 사용한다.

깊이 버퍼링에서 물체를 그리는 순서는 중요하지 않다.


깊이 버퍼링 알고리즘

* 렌더링 되는 각 픽셀의 깊이 값을 계산해서 깊이 판정을 수행하고 깊이 값을 비교했을때 관찰자에 가장 가까운 픽셀이 승리하여 후면 버퍼에 기록된다.


깊이 버퍼도 텍스처이므로 특정한 자료형 형식을 지정해서 생성해야 한다.

ⓐ DXGI_FORMAT_D32_FLOAT_S8X24_UNIT : 각 텍셀은 32비트 부동소수점 깊이 값과 [0, 255] 구간으로 사상되는 8비트 부호 없는 정수 스텐실 값(스텐실 버퍼에 쓰임), 그리고 다른 용도 없이 채움(Padding)용으로만 쓰이는 24비트로 구성된다.


ⓑ DXGI_FORMAT_D32_FLOAT : 각 텍셀은 하나의 32비트 부동소수점 깊이 값이다.


ⓒ DXGI_FORMAT_D24_UNORM_S8_UNIT : 각 텍셀은 [0, 1] 구간으로 사상되는 부호 없는 24비트 깊이 값 하나와 [0, 255] 구간으로 사상되는 8비트 부호 없는 정수 스텐실 값으로 구성된다.


ⓓ DXGI_FORMAT_D16_UNORM : 각 텍셀은 [0, 1] 구간으로 사상되는 부호 없는 16비트 깊이 값이다.


(스텐실 버퍼를 반드시 사용하는 것은 아니지만 만일 사용해야 한다면 스텐실 버퍼를 깊이 버퍼에 부착해야 한다.)

'DirectX11 > Direct3D 초기화' 카테고리의 다른 글

텍스처 관련  (0) 2016.07.03
Direct3D 기본  (0) 2016.07.02
posted by 알쿠미

Direct3D 기본

DirectX11/Direct3D 초기화 2016. 7. 2. 22:16

1. Direct3D 9와 11의 차이점

Direct3D 9 과 Direct3D 11이 다른점 9는 능력 집합의 일부만 지원하고 하드웨어가 지원하지 않는 기능을 사용했을 때 지원하는지를 점검하고 지원하지 않으면 호출이 실패하게 되었지만 11에선 기능을 지원하는지 점검할 필요 없이 11의 대응장치이려면 반드시 능력집합 전체를 지원해야한다.

 

2. COM ( Component Object Model )

DirectX의 프로그래밍 언어 독립성과 하위 호환성을 가능하게 하는 기술이다.

흔히 인터페이스라고 불린다.

 

COM의 인터페이스는 C++의 new 키워드로 생성하지 않는다.

인터페이스를 사용하고 난 후에는 delete로 삭제하는 것이 아니라 그 인터페이스의 Release 메소드를 호출해 주어야 한다.

(COM인터페이스는 IUnknown이라는 COM 인터페이스의 기능을 상속받는데, 그 인터페이스가 Release라는 메서드를 제공한다.) - COM객체들이 자신만의 방법으로 메모리를 관리하기 때문이다.

 

3. 텍스처 및 자료 자원 형식

텍스처는 자료 원소들의 행렬이라고 생각하면된다. 2차원 텍스처엔 한 픽셀의 색상이 들어갈 수 있고 , 법선 맵핑에선 3차원 벡터가 들어갈 수도 있다.

하지만 모든 데이터가 들어갈수 있는것은 아니고 정해진 포멧을 따르는 자료만 담을 수 있다.

구체적인 형식은 DXGI_FORMAT이라는 열거형으로 지정한다.

 

ⓐ DXGI_FORMAT_R32G32B32_FLOAT : 각 원소는 32비트 부동소수점 성분 세개로 이루어진다.

 

ⓑ DXGI_FORMAT_R16G16B16A16_UNORM : 각 원소는 [0,1] 구간으로 사상되는 16비트 성분 네개로 이루어진다.

 

ⓒ DXGI_FORMAT_R32G32_UNIT : 각 원소는 32비트 부호없는 정수 성분 두 개로 이루어 진다.

 

ⓓ DXGI_FORMAT_R8G8B8A8_UNORM : 각 원소는 [0,1] 구간으로 사상되는 8비트 부호 없는 성분 네개로 이루어진다.

 

ⓔ DXGI_FORMAT_R8G8B8A8_SNORM : 각 원소는 [-1, 1] 구간으로 사상되는 8비트 부호 있는 성분 네개로 이루어진다.

 

ⓕ DXGI_FORMAT_R8G8B8A8_SINT : 각 원소는 [-128, 127] 구간으로 사상되는 8비트 부호있는 정수 성분 네 개로 이루어진다.

 

ⓖ DXGI_FORMAT_R8G8B8A8_UNIT : 각 원소는 [0, 255] 구간으로 사사아되는 8비트 부호 없는 정수 성분 네 개로 이루어진다.

 

DXGI_FORMAT_R8G8B8A8_TYPELESS 이런 무형식도 가능하고

DXGI_FORMAT_R32G32B32_FLOAT 이 형식을 사용하더라도 색이 아니라 3차원 벡터를 넣는 것도 가능하다.

 

'DirectX11 > Direct3D 초기화' 카테고리의 다른 글

텍스처 관련  (0) 2016.07.03
화면 출력  (0) 2016.07.02
posted by 알쿠미