코드

VSSetConstantBuffer(슬롯번호, 설정할 상수버퍼의 수, 만들어 둔 상수버퍼의 주소)

슬롯번호는 cbuffer 버퍼이름 : register (b0)  <- 슬롯번호가 0번인 레지스터에 저장된..

식으로 명시적 설정을 할 수도 있고, 아래 VS 코드처럼 명시적설정하지 않을 경우 슬롯 0부터 할당된다.

 

 

PSSetShaderResources(슬롯번호, ShaderResourceview 개수, 설정할 셰이더 리소스 배열)

상수버퍼와 마찬가지로, Texture2D 형식으로 만들고, register (t0), (t1) 등으로 명시적 선언을 해 줄 수 있다. 

셰이더 리소스는 ID3D11ShaderResourceView* 를 넣는다. 

 

OMsetBlendState(설정할 오브젝트, 상수값(RGBA), 샘플용 마스크)

두 번째 필드는 D3D11_BLEND_BLEND_FACTOR에서 사용할 상수값을 RGBA별로 설정한 배열이며, 세번째필드 SampleMask는 멀티샘플 렌더타겟에서 어떤 샘플을 Enable로 할까 설정하는 값이라는데 지금은 잘 모르겠다.

 

OM스테이지에서는 픽셀셰이더에서 출력된 칼라값을 다른 값과 블렌드시켜서 최종 출력을 정할 수 있다.

 

 

버텍스 셰이더 코드

 

상수버퍼는 알다시피 16바이트 크기로 맞춰주어야 하고,(Vector4?) 맞지 않으면 알아서 패딩을 채운다고 한다. 

 

픽셀 셰이더 코드

 

 

 

INPUT_ELEMENT_DESC

 

D3D11_INPUT_ELEMENT_DESC vertexDesc[] = 

{

  {"POSITION" , 0 , DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}

  {"NORMAL" , 0 , DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}

}

앞에서부터

 

1. SemanticName(시맨틱 이름) : 정점셰이더에서 정해진 시맨틱 이름으로 구분할 수 있기 때문에 반드시 유효한 변수 이름이어야 한다.

 

2. SemanticIndex(시맨틱 인덱스) : 시맨틱에 부여된 색인번호. 하나의 정점 구조체에 여러개의 같은 형태의 시맨틱 요소가 있는 경우(텍스쳐가 두개라던가, 색깔이 세개라던가..) 개별적 시맨틱을 만들어 부여하는 대신 인덱스를 통하여 각각을 구별할 수 있게 만든다.

버텍스 셰이더 hlsl에서는 예제와 같이 0이면 POSITION0, 1이면 POSITION1 식으로 구분한다.

(ex. TEXCOORD1, TEXCOORD3...)

만약 셰이더코드에서 인덱스를 명시하지 않은 시맨틱은 index = 0 으로 취급된다.

 

3. Format(포맷) : 이 정점 버퍼의 자료 형식이 무엇인지를 나타낸다.

 

4. InputSlog(슬롯) : 데이터를 가진 정점버퍼의 인덱스이다. Direct3D는 0~15까지 총 16개의 슬롯을 지원한다.

슬롯을 여러 개 사용하여(0슬롯에는 위치, 1슬롯에는 색상을 넣는다던가) 셰이더 코드에서 조합하여 정점을 생성할 수 있다. 물론 슬롯 하나에 위치,색상을 둘 다 넣어서 공급할 수도 있다.

 

5. AllignedByteOffset(성분 오프셋) : 입력 슬롯을 하나만 사용할 경우, 위치와 색상을 같이 공급한다던가 위치와 노말을 같이 공급할 수 있을 것이다.  이럴 경우 이 성분들을 구분하기 위한 오프셋이다. 

 

struct Vertex

{

   float3 Pos;

   float3 Normal;

}

 

이라면, Pos의 오프셋은 0, 노말의 오프셋은 12이다. (Pos가 float3, 즉 float(4bytes) * 3  이기 때문에 12부터 시작해야 하기 때문)

 

만약 Normal 뒤에 다른 성분이 붙는다면 그 성분의 오프셋은 24이다.

 

6. InputSlotClass : 인스턴싱에 쓰인다는데 아직 잘 모르겠다

 

7. ""

 

 

 

SUBRESOURCE_DATA

 

 

 

+ Recent posts