그래픽(C++ AMP)
C + + AMP 여러 Api에 포함 된 Concurrency::graphics 질감 지원 Gpu에 액세스 하는 데 사용할 수 있는 네임 스페이스.다음은 몇 가지 일반 시나리오입니다.
사용할 수는 질감 계산 및 악용에 대 한 데이터 컨테이너 클래스의 공간 효율 텍스처 캐시 및 레이아웃의 GPU 하드웨어.공간 효율은 물리적으로 서로 인접 하 고 데이터 요소입니다.
런타임에 계산 셰이더와 효율적으로 상호 운용성을 제공합니다.픽셀, 버텍스, 바둑판 무늬, 및 선체 셰이더 자주 사용 하거나를 C++ AMP 계산에 사용할 수 있는 질감을 생성 합니다.
그래픽 Api를 C++ AMP에 액세스 하려면 대체 방법으로 압축 된 버퍼 sub-word을 제공 합니다.한 질감 형식을 나타내는 텍셀 (질감 요소)의 8 비트 구성 또는 16 비트 스칼라 이러한 압축 된 데이터 저장소에 액세스할 수 있습니다.
[!참고]
C + + AMP Api 제공 하지 텍스처 샘플링 및 필터링 기능.C + + AMP의 상호 운용성 기능을 사용 하 고 Directcompute와 HLSL 코드를 작성 해야 합니다.
일반화 및 unorm 형식
norm 및 unorm 형식인의 범위를 제한 하는 스칼라 형식 float 값입니다. 이 이라고 클램핑.이러한 형식은 다른 스칼라 형식에서 명시적으로 생성할 수 있습니다.캐스팅에 값 먼저 캐스팅 된 float 다음-[1.0... 일반화가 허용 되는 각각의 영역을 설정 하 고1.0] 또는 unorm [0.0...1.0] 합니다.+ /-무한대 캐스팅에서 + /-1을 반환합니다.Nan으로 변환 정의 되지 않았습니다.일반화에는 unorm에서 암시적으로 생성할 수 있습니다 및 데이터 손실 되지 않습니다.Float는 암시적 변환 연산자는 이러한 형식에 대해 정의 됩니다.이항 연산자 처럼 정의 이러한 형식과 다른 기본 스칼라 형식 float 및 int: +,-, *, /, = =,! =, >, <>, =, < =.복합 대입 연산자 지원: + =,-=, * =, / =.단항 부정 연산자 (-) 일반화 형식에 대해 정의 됩니다.
짧은 벡터 라이브러리
짧은 벡터 라이브러리의 기능 중 일부를 제공 된 벡터 형식 HLSL에서 정의 하 고 정의 텍셀에 일반적으로 사용 됩니다.짧은 벡터에 네 개의 값을 동일한 형식의 데이터 구조입니다.The supported types are double, float, int, norm, uint, and unorm.형식 이름에는 다음 표에 표시 됩니다.각 종류는 또한 해당 하는 typedef 이름에서 밑줄 있는 하지 않습니다.밑줄 있는 형식에는 Concurrency::graphics 네임스페이스.밑줄을 사용 하지 않는 형식에는 Concurrency::graphics::direct3d 네임스페이스 같은 비슷한 이름을 가진 기본 형식에서 명확 하 게 구분 되는 __int8 및 __int16.
2 길이 |
3 길이 |
길이 4 |
|
---|---|---|---|
double |
double_2 double2 |
double_3 double3 |
double_4 double4 |
float |
float_2 float2 |
float_3 float3 |
float_4 float4 |
int |
int_2 int2 |
int_3 int3 |
int_4 int4 |
일반화 |
norm_2 norm2 |
norm_3 norm3 |
norm_4 norm4 |
uint |
uint_2 uint2 |
uint_3 uint3 |
uint_4 uint4 |
unorm |
unorm_2 unorm2 |
unorm_3 unorm3 |
unorm_4 unorm4 |
연산자
짧은 벡터와 스칼라 간의 정의 되 고 두 개의 짧은 벡터 사이 연산자가 정의 되어 있는 경우.또한,이 중 하나가 참 이어야 합니다.
스칼라 형식 짧은 벡터의 요소 형식과 같아야 합니다.
스칼라 형식 하나만 사용자 정의 변환을 사용 하 여 vector의 요소 형식으로 암시적으로 변환할 수 있습니다.
작업 component-wise 스칼라 사이의 짧은 벡터의 각 구성 요소에 전달 됩니다.유효한 연산자는 다음과 같습니다.
연산자 형식 |
유효한 형식 |
---|---|
이진 연산자 |
유효한 모든 형식: +,-, *, /, 유효한 정수 형식: %, ^, |, &, <<>>, 두 벡터를 크기가 같은 있고 결과 같은 크기의 벡터입니다. |
관계형 연산자 |
유효한 모든 형식: = = 및! = |
복합 대입 연산자 |
유효한 모든 형식: + =,-=, * =, / = 유효한 정수 형식: % =, ^ =, | =, & =, << = >> = |
증가 및 감소 연산자 |
유효한 모든 형식: + +,- 전위 및 후 위 모두 유효합니다. |
비트 논리 부정 연산자 (~) |
정수 형식에서 사용할 수 있습니다. |
단항-연산자 |
제외한 모든 형식에 유효한 unorm 및 uint. |
Swizzling 식
짧은 벡터 라이브러리 지원의 vector_type.identifier 접근자 구문을 짧은 벡터의 구성 요소에 액세스할 수 있습니다.identifier로 알려져 있습니다에 swizzling 식, 벡터의 구성 요소를 지정 합니다.식에서 l-value 또는 r-value는 될 수 있습니다.개별 문자 식별자에 있을 수 있습니다: x, y, z 및 w; r, g, b, 또는 a. ""x"r"평균 0 번째,"y"및"g"평균 첫 번째 구성 요소, 및 등.(표시 "x" 및 "r" 같은 식별자에 사용할 수 없습니다.) 따라서 "rgba" 및 "xyzw" 같은 결과 반환 합니다.단일 구성 요소의 접근자 등 "x" 및 "y"는 스칼라 값 형식입니다.결합니다 접근자 짧은 벡터 형식입니다.예를 들어, 구성는 int_4 라는 벡터 fourInts 및 값 2, 4, 6, 8, 다음이 fourInts.y 4 정수를 반환 하 고 fourInts.rg 반환는 int_2 2 및 4 값이 있는 개체.
텍스처 클래스
많은 Gpu 하드웨어 한 픽셀과 텍셀을 반입 하 고 이미지 및 텍스처 렌더링을 최적화 하는 캐시입니다.< T, N > 텍스처 텍셀이 개체에 대 한 컨테이너 클래스는 클래스 이러한 Gpu의 텍스처 기능을 노출 합니다.텍셀이 될 수 있습니다.
An int, uint, float, double, norm, or unorm scalar.
짧은 벡터 두 개 또는 네 개의 구성 요소가 있습니다.유일한 예외는 double_4를 사용할 수 없습니다.
texture 1, 2 또는 3 순위 개체를 가질 수 있습니다.texture 개체를 캡처한 참조 호출의 람다에 의해서만 parallel_for_each.텍스처 GPU에서 Direct3D 질감 개체로 저장 됩니다.질감과 텍셀 direct3d에 대 한 자세한 내용은 참조 하십시오. 11 direct3d에서에서 질감 소개.
텍셀이 형식을 사용 하면 그래픽 프로그래밍에서 사용 되는 많은 질감 형식 중 하나를 수 있습니다.예를 들어 RGBA 형식이 R, G, B 및 A의 스칼라 요소에 대해 각각 8 비트 32 비트를 사용할 수 있습니다.그래픽 카드의 하드웨어 질감 형식에 따라 개별 요소에 액세스할 수 있습니다.예를 들어 RGBA 포맷을 사용 하는 경우 텍스처 하드웨어 각 8 비트 요소 32 비트 형식으로 추출할 수 있습니다.C + + AMP에 비트 시프트를 사용 하지 않고 자동으로 개별 스칼라 요소는 코드에서 액세스할 수 있도록 해당 텍셀의 스칼라 요소 당 비트를 설정할 수 있습니다.
텍스처 개체 인스턴스화
질감 개체를 초기화 하지 않고 선언할 수 있습니다.다음 코드 예제에서는 몇 가지 질감 개체를 선언합니다.
#include <amp.h>
#include <amp_graphics.h>
using namespace concurrency;
using namespace concurrency::graphics;
void declareTextures() {
// Create a 16-texel texture of int.
texture<int, 1> intTexture1(16);
texture<int, 1> intTexture2(extent<1>(16));
// Create a 16 x 32 texture of float_2.
texture<float_2, 2> floatTexture1(16, 32);
texture<float_2, 2> floatTexture2(extent<2>(16, 32));
// Create a 2 x 4 x 8 texture of uint_4.
texture<uint_4, 3> uintTexture1(2, 4, 8);
texture<uint_4, 3> uintTexture2(extent<3>(2, 4, 8));
}
선언 하 고 초기화 하는 생성자를 수도 있습니다는 texture 개체입니다.다음 코드 예제에서는 인스턴스화하는 texture 개체에서 벡터를 float_4 개체.스칼라 요소 당 비트를 기본으로 설정 됩니다.이 생성자를 사용할 수 없습니다 norm, unorm, 또는 짧은 벡터의 norm 및 unorm, 스칼라 요소 당 비트 수는 기본 없기 때문에.
#include <amp.h>
#include <amp_graphics.h>
#include <vector>
using namespace concurrency;
using namespace concurrency::graphics;
void initializeTexture() {
std::vector<int_4> texels;
for (int i = 0; i < 768 * 1024; i++) {
int_4 i4(i, i, i, i);
texels.push_back(i4);
}
texture<int_4, 2> aTexture(768, 1024, texels.begin(), texels.end());
}
선언 및 초기화할 수 있는 texture 원본 데이터, 원본 데이터의 바이트 수, 크기 및 스칼라 요소 당 비트 포인터를 사용 하는 생성자 오버 로드를 사용 하 여 개체.
void createTextureWithBPC() {
// Create the source data.
float source[1024 * 2];
for (int i = 0; i < 1024 * 2; i++) {
source[i] = (float)i;
}
// Initialize the texture by using the size of source in bytes
// and bits per scalar element.
texture<float_2, 1> floatTexture(1024, source, (unsigned int)sizeof(source), 32U);
}
이러한 예제는 텍스처 기본 가속기의 기본 보기에서 만들어집니다.지정 하는 경우 생성자의 다른 오버 로드를 사용 된 accelerator_view 개체입니다.CPU 가속기의 질감 개체를 만들 수 없습니다.
각 치수의 크기에 제한을 가지는 texture 개체는 다음 표에서 같이.제한을 초과 하는 경우 런타임 오류가 생성 됩니다.
질감 |
크기 제한 |
---|---|
질감 < T 1 > |
16384 |
< 2 T > 텍스처 |
16384 |
< 2 T > 텍스처 |
2048 |
텍스처 개체에서 읽기
You can read from a texture object by using texture::operator[] 연산자, texture::operator() 연산자, or texture::get 메서드.texture::operator[] 연산자및 texture::operator() 연산자 는 참조가 아닌 값을 반환 합니다.따라서 쓸 수 있는 texture 개체를 사용 하 여 texture::operator[] 연산자.
void readTexture() {
std::vector<int_2> src;
for (int i = 0; i < 16 *32; i++) {
int_2 i2(i, i);
src.push_back(i2);
}
std::vector<int_2> dst(16 * 32);
array_view<int_2, 2> arr(16, 32, dst);
arr.discard_data();
const texture<int_2, 2> tex9(16, 32, src.begin(), src.end());
parallel_for_each(tex9.extent, [=, &tex9] (index<2> idx) restrict(amp) {
// Use the subscript operator.
arr[idx].x += tex9[idx].x;
// Use the function () operator.
arr[idx].x += tex9(idx).x;
// Use the get method.
arr[idx].y += tex9.get(idx).y;
// Use the function () operator.
arr[idx].y += tex9(idx[0], idx[1]).y;
});
arr.synchronize();
}
다음 코드 예제에서는 짧은 벡터를 텍스처 채널을 저장 한 다음 짧은 벡터 속성으로 스칼라의 개별 요소에 액세스 하는 방법을 보여 줍니다.
void UseBitsPerScalarElement() {
// Create the image data.
// Each unsigned int (32-bit) represents four 8-bit scalar elements(r,g,b,a values).
const int image_height = 16;
const int image_width = 16;
std::vector<unsigned int> image(image_height * image_width);
extent<2> image_extent(image_height, image_width);
// By using uint_4 and 8 bits per channel, each 8-bit channel in the data source is
// stored in one 32-bit component of a uint_4.
texture<uint_4, 2> image_texture(image_extent, image.data(), image_extent.size() * 4U, 8U);
// Use can access the RGBA values of the source data by using swizzling expressions of the uint_4.
parallel_for_each(image_extent,
[&image_texture](index<2> idx) restrict(amp)
{
// 4 bytes are automatically extracted when reading.
uint_4 color = image_texture[idx];
unsigned int r = color.r;
unsigned int g = color.g;
unsigned int b = color.b;
unsigned int a = color.a;
});
}
다음 표 정렬 벡터 형식의 각 채널 마다 유효한 비트입니다.
질감 데이터 형식 |
유효한 비트 스칼라 요소 / |
---|---|
int, int_2, int_4 uint, uint_2, uint_4 |
8, 16, 32 |
float, float_2, float_4 |
16, 32 |
이중, double_2 |
64 |
일반화, norm_2, norm_4 unorm, unorm_2, unorm, 4 |
8, 16 |
텍스처 객체를 작성합니다.
사용 된 texture::set 쓸 메서드 texture 개체.텍스처 개체는 읽기 전용 또는 읽기/쓰기 수 있습니다.텍스처 개체에 대 한 읽기 및 쓰기 가능으로 다음 조건이 충족 되어야 합니다.
T는 스칼라 구성 요소를 하나만 있습니다.(짧은 벡터 허용 되지 않습니다.)
T is not double, norm, or unorm.
texture::bits_per_scalar_element 속성은 32입니다.
세 가지 모두 참인 경우 다음에 texture 개체는 읽기 전용입니다.컴파일하는 동안 먼저 두 가지 조건은 검사 합니다.코드를 작성 하려고 하는 경우 컴파일 오류가 생성 되는 readonly 질감 개체.조건에 대 한 texture::bits_per_scalar_element 런타임에 감지 되 고 생성 런타임에서 unsupported_feature 쓰기 읽기 전용 하는 경우 예외 texture 개체.
다음 코드 예제에서는 질감 개체에 값을 씁니다.
void writeTexture() {
texture<int, 1> tex1(16);
parallel_for_each(tex1.extent, [&tex1] (index<1> idx) restrict(amp) {
tex1.set(idx, 0);
});
}
개체는 writeonly_texture_view를 사용합니다.
Writeonly_texture_view writeonly 보기 질감 개체의 클래스를 제공 합니다.writeonly_texture_view 개체는 람다 식의 값으로 캡처된 해야 합니다.다음 코드 예제에서는 사용 하는 writeonly_texture_view 개체에 쓸 수 있는 texture 두 구성 요소는 개체 (int_2).
void write2ComponentTexture() {
texture<int_2, 1> tex4(16);
writeonly_texture_view<int_2, 1> wo_tv4(tex4);
parallel_for_each(extent<1>(16), [=] (index<1> idx) restrict(amp) {
wo_tv4.set(idx, int_2(1, 1));
});
}
텍스처 개체 복사
사용 사용 하 여 텍스처 객체 간에 복사할 수 있는 복사 함수 또는 copy_async 다음 코드 예제에서와 같이 작동 합니다.
void copyHostArrayToTexture() {
// Copy from source array to texture object by using the copy function.
float floatSource[1024 * 2];
for (int i = 0; i < 1024 * 2; i++) {
floatSource[i] = (float)i;
}
texture<float_2, 1> floatTexture(1024);
copy(floatSource, (unsigned int)sizeof(floatSource), floatTexture);
// Copy from source array to texture object by using the copy function.
char charSource[16 * 16];
for (int i = 0; i < 16 * 16; i++) {
charSource[i] = (char)i;
}
texture<int, 2> charTexture(16, 16, 8U);
copy(charSource, (unsigned int)sizeof(charSource), charTexture);
// Copy from texture object to source array by using the copy function.
copy(charTexture, charSource, (unsigned int)sizeof(charSource));
}
한 텍스처를 사용 하 여 복사할 수도 있습니다는 texture::copy_to 메서드.두 텍스처의 다른 accelerator_views 수 있습니다.복사 하는 writeonly_texture_view 개체는 내부 데이터 복사 texture 개체입니다.원본 및 대상 범위 및 스칼라 요소 당 비트 같아야 texture 개체입니다.이러한 요구 사항이 충족 되지 않은 경우 런타임 예외가 throw 됩니다.
상호 운용성
C + + AMP 런타임 간의 상호 운용성을 지 원하는 texture<T,1> 및 ID3D11Texture1D 인터페이스, 사이 texture<T,2> 및 ID3D11Texture2D 인터페이스, texture<T,3> , ID3D11Texture3D 인터페이스.Get_texture 메서드 사용에 texture 반환 하 고 개체는 IUnknown 인터페이스.Make_texture 메서드는 IUnknown 인터페이스 및 accelerator_view 반환 하 고 개체를 texture 개체입니다.