새 리소스 종류

Direct3D 11에 몇 가지 새로운 리소스 종류가 추가되었습니다.

읽기/쓰기 버퍼 및 텍스처

셰이더 모델 4 리소스는 읽기 전용입니다. 셰이더 모델 5는 해당하는 새 읽기/쓰기 리소스 집합을 구현합니다.

이러한 리소스에는 메모리에 직접 액세스하는 방법이 없기 때문에 인덱싱을 통해 메모리에 액세스하려면 리소스 변수가 필요합니다. 수식의 왼쪽과 오른쪽에 리소스 변수를 사용할 수 있습니다. 오른쪽에서 사용되는 경우 템플릿 형식은 단일 구성 요소(float, int 또는 uint)여야 합니다.

구조적 버퍼

구조화된 버퍼는 같은 크기의 요소를 포함하는 버퍼입니다. 하나 이상의 멤버 형식이 있는 구조를 사용하여 요소를 정의합니다. 다음은 3개의 멤버가 있는 구조체입니다.

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

다음과 같이 구조화된 버퍼를 선언하려면 이 구조를 사용합니다.

StructuredBuffer<MyStruct> mySB;

구조화된 버퍼는 인덱싱 외에도 다음과 같은 단일 멤버에 대한 액세스를 지원합니다.

float4 myColor = mySb[27].Color;

다음 개체 형식을 사용하여 구조화된 버퍼에 액세스합니다.

연동 연산을 구현하는 원자성 함수RWStructuredBuffer의 int 및 uint 요소에서 허용됩니다.

바이트 주소 버퍼

바이트 주소 버퍼는 바이트 오프셋으로 콘텐츠를 주소 지정 가능한 버퍼입니다. 일반적으로 버퍼 의 내용은 S*N에서 제공한 대로 각 요소(S) 및 요소 번호(N)에 대한 stride를 사용하여 요소별로 인덱싱됩니다. 원시 버퍼라고도 할 수 있는 바이트 주소 버퍼는 버퍼의 시작 부분에서 바이트 값 오프셋을 사용하여 데이터에 액세스합니다. 바이트 값은 DWORD가 정렬되도록 4의 배수여야 합니다. 다른 값이 제공되면 동작이 정의되지 않습니다.

셰이더 모델 5에는 읽기 전용 바이트 주소 버퍼와 읽기-쓰기 바이트 주소 버퍼 에 액세스하기 위한 개체 도입되었습니다. 바이트 주소 버퍼의 내용은 32비트 부호 없는 정수로 설계되었습니다. 버퍼의 값이 실제로 부호 없는 정수가 아니면 asfloat 과 같은 함수를 사용하여 읽습니다.

순서가 지정되지 않은 액세스 버퍼 또는 텍스처

순서가 지정되지 않은 액세스 리소스(다중 샘플링 없이 버퍼, 텍스처 및 텍스처 배열 포함)는 여러 스레드에서 임시로 순서가 지정되지 않은 읽기/쓰기 액세스를 허용합니다. 즉, 원자 함수를 사용하여 메모리 충돌을 생성하지 않고 여러 스레드에서 이 리소스 형식을 동시에 읽고 쓸 수 있습니다.

ID3D11Device::CreateBuffer 또는 ID3D11Device::CreateTexture2D와 같은 함수를 호출하고 D3D11_BIND_FLAG 열거형에서 D3D11_BIND_UNORDERED_ACCESS 플래그를 전달하여 순서가 지정되지 않은 액세스 버퍼 또는 텍스처를 만듭니다.

순서가 지정되지 않은 액세스 리소스는 픽셀 셰이더 및 컴퓨팅 셰이더에만 바인딩할 수 있습니다. 실행하는 동안 병렬로 실행되는 픽셀 셰이더 또는 컴퓨팅 셰이더에는 순서가 지정되지 않은 액세스 리소스가 바인딩됩니다.

버퍼 추가 및 사용

추가 및 사용 버퍼는 스택 작동 방식과 유사한 버퍼의 끝에서 값을 추가하고 제거하는 것을 지원하는 정렬되지 않은 리소스의 특수 형식입니다.

추가 및 소비 버퍼는 구조화된 버퍼여야 합니다.

이러한 리소스는 해당 메서드를 통해 사용하며, 이러한 리소스는 리소스 변수를 사용하지 않습니다.

컴퓨팅 셰이더 개요