次の方法で共有


グラフィックス (C++ AMP)

C++ AMP には、GPU の Concurrency::graphics テクスチャ サポートにアクセスするために使用できるいくつかの API が名前空間に含まれています。 一般的なシナリオを次に示します。

  • このクラスを texture 計算用のデータ コンテナーとして使用し、GPU ハードウェアの テクスチャ キャッシュとレイアウトの空間局所性 を利用できます。 空間的局所性は相互に物理的に近い場所に存在するデータ要素のプロパティです。

  • ランタイムには、非計算シェーダーとの効率的な相互運用性が提供されます。 ピクセル、頂点、テセレーション、およびハルの各シェーダーは、C++ AMP 計算で使用できるテクスチャを頻繁に使用または生成します。

  • C++ AMP のグラフィックス API には、サブワードがパックされたバッファーにアクセスするための別の方法が用意されています。 8 ビットまたは 16 ビットのスカラーで構成される "テクセル" (テクスチャ要素) を表す形式を備えたテクスチャによって、このようなパックされたデータ ストレージにアクセスできます。

Note

C++ AMP ヘッダーは、Visual Studio 2022 バージョン 17.0 以降では非推奨です。 AMP ヘッダーを含めると、ビルド エラーが発生します。 警告をサイレント状態にするには、AMP ヘッダーを含める前に _SILENCE_AMP_DEPRECATION_WARNINGS を定義します。

norm 型および unorm 型

norm 型と unorm 型は float 値の範囲を制限するスカラー型で、これは "クランプ" として知られています。 これらの型は他のスカラー型から明示的に作成することができます。 キャストでは、値はまず float にキャストされ、次に、norm [-1.0, 1.0] または unorm [0.0, 1.0] で許可されるそれぞれの領域にクランプされます。 +/- 無限値からのキャストは +/-1 を返します。 NaN からキャストは未定義です。 normunorm から暗黙的に作成することができ、データは失われません。 float への暗黙の変換演算子がこれらの型に定義されます。 バイナリ演算子は、これらの型とその他の組み込みスカラー型である floatint (+-*/==!=><>=<=) の間で定義されます。 複合代入演算子 (+=-=*=/=) もサポートされています。 単項否定演算子 (-) は、norm 型に定義されます。

short ベクター ライブラリ

short ベクター ライブラリには、HLSL で定義され、テクセルを定義するために一般的に使用されるベクター型 (DirectX HLSL) の機能の一部が用意されています。 short ベクターは同じ型の 1 ~ 4 つの値を保持するデータ構造体です。 サポートされる型はdoublefloatintnormuint、および unorm です。 次の表に型名を示します。 また、各型には、名前にアンダースコアがない、対応する typedef があります。 アンダースコアがある型は、Concurrency::Graphics 名前空間に存在します。 アンダースコアがない型は、__int8__int16 のような似た名前の基本型と明確に区別できるように、Concurrency::graphics::direct3d 名前空間にあります。

Type 長さ 2 長さ 3 長さ 4
倍精度浮動小数点 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 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

演算子

演算子が 2 つの short ベクターの間で定義されている場合、その演算子は short ベクターとスカラーの間でも定義されます。 また、これらのどちらかが TRUE である必要があります。

  • スカラーの型は short ベクターの要素型と同じである必要があります。

  • スカラーの型は、1 つのユーザー定義の変換のみを使用してベクターの要素型に暗黙的に変換できます。

操作は short ベクターの各コンポーネントとスカラーの間でコンポーネントごとに実行されます。 次に有効な演算子を示します。

演算子型 有効な型
バイナリ演算子 すべての型で有効: +-*/

整数型で有効: %^|&<<>>

2 つのベクターは同じサイズである必要があり、結果は同じサイズの 1 つのベクターになる。
リレーショナル演算子 すべての型で有効: ==!=
複合代入演算子 すべての型で有効: +=-=*=/=

整数型で有効: %=^=|=&=<<=>>=
インクリメント演算子およびデクリメント演算子 すべての型で有効: ++--

前置と後置の両方が有効。
ビット演算子 NOT (~) 整数型で有効。
単項 - 演算子 unormuint を除くすべての型で有効。

スウィズリング式

short ベクター ライブラリは、short ベクターのコンポーネントにアクセスする vector_type.identifier アクセサー構成体をサポートします。 identifier は、"スウィズリング式" と呼ばれ、ベクターのコンポーネントを指定します。 式は左辺値または右辺値のいずれかになります。 識別子内の個々の文字には、x、y、z、w または r、g、b、a を指定できます。 "x" と "r" は 0 番目のコンポーネントを意味し、"y" と "g" は 1 番目のコンポーネントを意味します (以下同様)。 ("x" と "r" を同じ識別子で使用できないことに注意してください)。したがって、"rgba" と "xyzw" は同じ結果を返します。 "x" と "y" のような単一コンポーネント アクセサーはスカラー値型です。 複数コンポーネント アクセサーは short ベクター型です。 たとえば、int_4 という名前で、値 2、4、6、8 を持つ fourInts ベクターを作成すると、fourInts.y は整数 4 を返し、fourInts.rg は値 2 および 4 を持つ int_2 オブジェクトを返します。

テクスチャのクラス

多くの GPU には、ピクセルとテクセルをフェッチし、イメージとテクスチャを表示するために最適化されたハードウェアとキャッシュがあります。 テクセル オブジェクトのコンテナー クラスであるクラスは texture<T,N> 、これらの GPU のテクスチャ機能を公開します。 テクセルは次のようになります。

  • intuintfloatdoublenorm、または unorm のスカラー。

  • 2 つまたは 4 つのコンポーネントを持つ short ベクター。 許可されない唯一の例外は double_4 です。

texture オブジェクトは、1、2、または 3 のランクになります。 texture オブジェクトは parallel_for_each の呼び出しのラムダの参照によってのみキャプチャできます。 テクスチャは、Direct3D テクスチャ オブジェクトとして GPU に格納されます。 Direct3D でのテクスチャおよびテクセルの詳細については、「Direct3D 11 でのテクスチャの概要」を参照してください。

使用するテクセル型が、グラフィックス プログラミングで使用される多くのテクスチャ形式の 1 つになっている場合があります。 たとえば、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 オブジェクトをインスタンス化しています。 スカラー要素ごとのビットは既定値に設定されます。 スカラー要素ごとの既定のビットがないため、normunormnorm、および unorm の short ベクターを持つコンストラクターを使用することはできません。

#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 オブジェクトの各次元のサイズには制限があります。 制限を超えるとランタイム エラーが生成されます。

テクスチャ ディメンションあたりのサイズ制限
texture<T,1> 16384
texture<T,2> 16384
texture<T,3> 2048

テクスチャ オブジェクトからの読み取り

texture::operator[]texture::operator() 演算子、または texture::get メソッドを使用して、texture オブジェクトから読み取ることができます。 2 つの演算子は、参照ではなく値を返します。 したがって、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();
}

次のコード例では、short ベクターにテクスチャ チャネルを格納し、short ベクターのプロパティとして個々のスカラー要素にアクセスする方法を説明します。

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;
        });
}

次の表は、各 short ベクター型のチャネルごとの有効なビットを示します。

テクスチャ データ型 スカラー要素ごとの有効なビット
int、int_2、int_4

uint、uint_2、uint_4
8, 16, 32
int_3、uint_3 32
float、float_2、float_4 16, 32
float_3 32
double、double_2 64
norm、norm_2、norm_4

unorm、unorm_2、unorm_4
8、16

テクスチャ オブジェクトへの書き込み

texture::set メソッドを使用して texture オブジェクトに書き込みます。 テクスチャ オブジェクトは読み取り専用または読み取り/書き込み可能にすることができます。 読み取り/書き込み可能なテクスチャ オブジェクトについては、次の条件が満たされている必要があります。

  • T にあるのは 1 つのスカラー コンポーネントのみです。 (short ベクターは使用できません。)

  • T は doublenorm、または unorm のいずれでもありません。

  • texture::bits_per_scalar_element プロパティは 32 です。

3 つすべてが満たされない場合、texture オブジェクトは読み取り専用です。 最初の 2 つの条件は、コンパイル中にチェックされます。 readonly テクスチャ オブジェクトに書き込もうとするコードがあると、コンパイル エラーが生成されます。 texture::bits_per_scalar_element の条件は実行時に検出され、読み取り専用 texture オブジェクトに書き込もうとすると、ランタイムによって unsupported_feature 例外が生成されます。

次のコード例では、値をテクスチャ オブジェクトに書き込みます。

void writeTexture() {
    texture<int, 1> tex1(16);

    parallel_for_each(tex1.extent, [&tex1] (index<1> idx) restrict(amp) {
        tex1.set(idx, 0);
    });
}

テクスチャ オブジェクトをコピーする

次のコード例に示すように、copy 関数または 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 メソッドを使用して 1 つのテクスチャから別のテクスチャにコピーすることもできます。 2 つのテクスチャは異なる accelerator_views に置くことができます。 writeonly_texture_view オブジェクトにコピーすると、データは基になる texture オブジェクトにコピーされます。 スカラー要素ごとのビットおよび範囲はコピー元とコピー先の texture オブジェクトで同じにする必要があります。 これらの条件が満たされない場合、ランタイムは例外をスローします。

テクスチャ ビューのクラス

C++ AMP では、Visual Studio 2013 に texture_view クラスが導入されています。 テクスチャ ビューでは、texture クラスと同じテクセル型とランクをサポートしていますが、テクスチャとは異なり、テクスチャ サンプリングや MIPMAP などの追加のハードウェア機能へのアクセスも提供しています。 テクスチャ ビューは基になるテクスチャ データへの読み取り専用、書き込み専用、読み取り/書き込みアクセスをサポートします。

  • 読み取り専用アクセスは texture_view<const T, N> テンプレートの特殊化によって提供されます。これは 1、2、または 4 つのコンポーネント、テクスチャ サンプリング、およびビューをインスタンス化するときに決定される MIPMAP レベルの範囲への動的アクセスを持つ要素をサポートします。

  • 書き込み専用アクセスは、特殊化されていないテンプレート クラス texture_view<T, N> によって提供されます。これは 2 つまたは 4 つのコンポーネントを持ち、ビューをインスタンス化するときに決定される 1 つの MIPMAP レベルにアクセスできる要素をサポートします。 サンプリングはサポートされません。

  • 読み取り/書き込みアクセスは、特殊化されていないテンプレート クラス texture_view<T, N> によって提供されます。これはテクスチャのように、コンポーネントを 1 つだけ持つ要素をサポートし、ビューはインスタンス化されるときに決定される 1 つの MIPMAP レベルにアクセスできます。 サンプリングはサポートされません。

テクスチャ ビューは配列ビューに似ていますが、array_view クラスarray クラス経由で提供する自動データ管理および移動機能は提供しません。 texture_view は、基になるテクスチャ データが存在するアクセラレータ ビューにのみアクセスできます。

非推奨とされる writeonly_texture_view

Visual Studio 2013 では、C++ AMP は、writeonly_texture_view クラスでサポートできなかった、サンプリングや MIPMAP のようなハードウェア テクスチャ機能のサポートが強化されています。 最近導入された texture_view クラスは writeonly_texture_view の機能のスーパーセットをサポートしており、その結果、writeonly_texture_view は非推奨とされます。

少なくとも新しいコードについては、以前は texture_view によって提供された機能へのアクセスに writeonly_texture_view を使用することをお勧めします。 2 つのコンポーネント (int_2) を持つテクスチャ オブジェクトに書き込む、次の 2 つのコード例を比較します。 どちらのケースでも、ビュー wo_tv4 はラムダ式の値でキャプチャされる必要があることに注意してください。 新しい texture_view クラスを使用する例を次に示します。

void write2ComponentTexture() {
    texture<int_2, 1> tex4(16);

    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));
    });
}

非推奨とされる writeonly_texture_view クラスを次に示します:

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));
    });
}

おわかりのように、2 つのコード例は、プライマリ MIPMAP レベルに書き込んでいるだけである場合にはほぼ同じです。 既存のコードで writeonly_texture_view を使用し、そのコードを拡張するつもりがない限り、変更する必要はありません。 ただし、そのコードをさらに改善するつもりであるなら、その中で機能を強化すると新しいハードウェア テクスチャ機能をサポートできるため、texture_view を使用できるように書き直すことをお勧めします。 これらの新しい機能の詳細については、以下をお読みください。

writeonly_texture_view が使用されなくなったことの詳細については、ネイティブ コードでの並列プログラミングについてのブログ「C++ AMP でのテクスチャ ビュー デザインの概要」を参照してください。

テクスチャ ビュー オブジェクトのインスタンス化

texture_view の宣言は配列に関連付けられている array_view の宣言に似ています。 次のコード例では、複数の texture オブジェクトとそれらに関連付けられた texture_view オブジェクトを宣言しています。

#include <amp.h>
#include <amp_graphics.h>
using namespace concurrency;
using namespace concurrency::graphics;

void declareTextureViews()
{
    // Create a 16-texel texture of int, with associated texture_views.
    texture<int, 1> intTexture(16);
    texture_view<const int, 1> intTextureViewRO(intTexture);  // read-only
    texture_view<int, 1> intTextureViewRW(intTexture);        // read-write

    // Create a 16 x 32 texture of float_2, with associated texture_views.
    texture<float_2, 2> floatTexture(16, 32);
    texture_view<const float_2, 2> floatTextureViewRO(floatTexture);  // read-only
    texture_view<float_2, 2> floatTextureViewRO(floatTexture);        // write-only

    // Create a 2 x 4 x 8 texture of uint_4, with associated texture_views.
    texture<uint_4, 3> uintTexture(2, 4, 8);
    texture_view<const uint_4, 3> uintTextureViewRO(uintTexture);  // read-only
    texture_view<uint_4, 3> uintTextureViewWO(uintTexture);        // write-only
}

要素型が非定数で 1 つのコンポーネントを持つテクスチャ ビューは読み取り/書き込みで、要素型は非定数であるが複数のコンポーネントを持つテクスチャ ビューは書き込み専用であることに注意してください。 定数要素型のテクスチャ ビューは常に読み取り専用ですが、要素型が非定数である場合は、要素内のコンポーネント数によって読み取り/書き込み可能 (1 コンポーネント) か書き込み専用 (複数のコンポーネント) かが決定されます。

texture_view の要素型 (定数であるかどうかとそのコンポーネントの数) も、ビューがテクスチャ サンプリングをサポートするかどうかおよび MIPMAP レベルへのアクセス方法の決定に役割を果たします。

Type コンポーネント Read Write サンプリング MIPMAP アクセス
texture_view<const T, N> 1, 2, 4 はい いいえ (1) はい ○、インデックス可能。 範囲はインスタンス化時に決定。
Texture_view<T, N> 1

2, 4
はい

いいえ (2)
はい

はい
いいえ (1)

いいえ (1)
○、1 レベル。 レベルはインスタンス化時に決定。

○、1 レベル。 レベルはインスタンス化時に決定。

このテーブルから、読み取り専用のテクスチャ ビューはビューに書き込めない代わりに新しい機能を完全にサポートすることを確認できます。 書き込み可能なテクスチャ ビューは 1 つの MIPMAP レベルにのみアクセスできるように制限されています。 読み取り/書き込みテクスチャ ビューは書き込み可能なテクスチャ ビューよりもさらに特殊化されています。これはテクスチャ ビューの要素型が 1 つのコンポーネントのみを持っているという要件が追加されているためです。 これは読み取り指向の操作であるため、サンプリングは書き込み可能テクスチャ ビューではサポートされないことに注意してください。

テクスチャ ビュー オブジェクトからの読み取り

テクスチャ ビューでのサンプル化されていないテクスチャ データの読み取りは、テクスチャ自体からのデータの読み取りと同じです。ただし、テクスチャ ビューは値によってキャプチャされますが、テクスチャは参照によってキャプチャされます。 次の 2 つのコード例では、まず、texture のみを使用する場合を示します。

void write2ComponentTexture() {
    texture<int_2, 1> text_data(16);

    parallel_for_each(extent<1>(16), [&] (index<1> idx) restrict(amp) {
        tex_data.set(idx, int_2(1, 1));
    });
}

そして、texture_view クラスを使用する以外は同じである場合を示します。

void write2ComponentTexture() {
    texture<int_2, 1> tex_data(16);

    texture_view<int_2, 1> tex_view(tex_data);

    parallel_for_each(extent<1>(16), [=] (index<1> idx) restrict(amp) {
        tex_view.set(idx, int_2(1, 1));
    });
}

たとえば、float、float_2、または float_4 などの、浮動小数点型に基づく要素のテクスチャ ビューは、さまざまなフィルター処理モードおよびアドレッシング モードに対するハードウェア サポートを利用するにテクスチャ サンプリングを使用して読み取ることもできます。 C++ AMP は計算シナリオで最も一般的な 2 つのフィルター処理モード (ポイント フィルタリング (ニアレストネイバー) およびリニア フィルタリング (加重平均))、および 4 つのアドレッシング モード (wrapped、mirrored、clamped、border) をサポートしています。 アドレス指定モードの詳細については、「address_mode 列挙型」を参照してください。

C++ AMP が直接サポートするモードに加えて、プラットフォーム API を直接使用して作成されたテクスチャ サンプラーを採用する相互運用 API を使用して、基になるプラットフォームの他のフィルター処理モードとアドレッシング モードにアクセスすることができます。 たとえば、Direct3D は異方性フィルタリングなどの他のフィルター処理モードをサポートし、テクスチャの大きさごとに別のアドレッシング モードを適用できます。 座標が垂直方向にラップされ、水平方向にミラー化され、Direct3D API を使用した異方性フィルタリングでサンプル化されるテクスチャ サンプラーを作成し、make_sampler 相互運用 API を使用して C++ AMP コードでサンプラーを利用することができます。 詳細については、ネイティブ コードでの並列プログラミングに関するブログの「C++ AMP でのテクスチャのサンプリング」を参照してください。

また、テクスチャ ビューは MIPMAP の読み取りをサポートします。 定数要素型である読み取り専用のテクスチャ ビューは最も高い柔軟性を備えています。これはインスタンス化で決定された MIPMAP レベルの範囲が動的にサンプル化され、1、2、または 4 つのコンポーネントを持つ要素がサポートされるためです。 また、1 つのコンポーネントを持つ要素がある読み取り/書き込みテクスチャ ビューも MIPMAP をサポートしますが、インスタンス化で決定されたレベルのみです。 詳細については、ネイティブ コードでの並列プログラミングに関するブログ「MIPMAP を使用するテクスチャ」を参照してください。

テクスチャ ビュー オブジェクトへの書き込み

texture_view オブジェクトを介して基になる texture に書き込むには、texture_view::get メソッドを使用します。 テクスチャ ビューは読み取り専用、読み取り/書き込み、または書き込み専用のいずれかです。 書き込み可能なテクスチャ ビューは非定数である要素型を持つ必要があり、読み取り/書き込み可能なテクスチャ ビューの要素型は、1 つのコンポーネントのみを持つ必要があります。 それ以外の場合、テクスチャ ビューは読み取り専用です。 テクスチャ ビューで一度にテクスチャの 1 つの MIPMAP レベルにのみアクセスでき、ビューがインスタンス化されるときにレベルが指定されます。

この例では、4 つの MIPMAP レベルを持つテクスチャの 2 番目に詳細な MIPMAP レベルに書き込む方法を示します。 最も詳細な MIPMAP レベルはレベル 0 です。

// Create a texture that has 4 mipmap levels : 16x16, 8x8, 4x4, 2x2
texture<int, 2> tex(extent<2>(16, 16), 16U, 4);

// Create a writable texture view to the second mipmap level :4x4
texture_view<int, 2> w_view(tex, 1);

parallel_for_each(w_view.extent, [=](index<2> idx) restrict(amp)
{
    w_view.set(idx, 123);
});

相互運用性

C++ AMP ランタイムは texture<T,1>ID3D11Texture1D インターフェイス間、texture<T,2>ID3D11Texture2D インターフェイス間、および texture<T,3>ID3D11Texture3D インターフェイス間の相互運用性をサポートしています。 get_texture メソッドは texture オブジェクトを受け取り、IUnknown インターフェイスを返します。 make_texture メソッドは IUnknown インターフェイスおよび accelerator_view オブジェクトを受け取り、texture オブジェクトを返します。

関連項目

double_2 クラス
double_3 クラス
double_4 クラス
float_2 クラス
float_3 クラス
float_4 クラス
int_2 クラス
int_3 クラス
int_4 クラス
norm_2 クラス
norm_3 クラス
norm_4 クラス
short_vector 構造体
short_vector_traits 構造体
uint_2 クラス
uint_3 クラス
uint_4 クラス
unorm_2 クラス
unorm_3 クラス
unorm_4 クラス