Bagikan melalui


Grafik (C++ AMP)

C++ AMP berisi beberapa API di Concurrency::graphics namespace layanan yang dapat Anda gunakan untuk mengakses dukungan tekstur pada GPU. Beberapa skenario umum adalah:

  • Anda dapat menggunakan texture kelas sebagai kontainer data untuk komputasi dan mengeksploitasi lokalitas spasial cache tekstur dan tata letak perangkat keras GPU. Lokalitas spasial adalah properti elemen data yang secara fisik dekat satu sama lain.

  • Runtime memberikan interoperabilitas yang efisien dengan shader non-komputasi. Piksel, puncak, tesselulasi, dan shader lambung sering mengonsumsi atau menghasilkan tekstur yang dapat Anda gunakan dalam komputasi C++ AMP Anda.

  • API grafis di C++ AMP menyediakan cara alternatif untuk mengakses buffer kemasan sub-kata. Tekstur yang memiliki format yang mewakili texel (elemen tekstur) yang terdiri dari skalar 8-bit atau 16-bit memungkinkan akses ke penyimpanan data kemasan tersebut.

Catatan

Header AMP C++ tidak digunakan lagi dimulai dengan Visual Studio 2022 versi 17.0. Menyertakan header AMP apa pun akan menghasilkan kesalahan build. Tentukan _SILENCE_AMP_DEPRECATION_WARNINGS sebelum menyertakan header AMP apa pun untuk membungkam peringatan.

Jenis norma dan unorm

Jenis norm dan unorm adalah jenis skalar yang membatasi rentang float nilai; ini dikenal sebagai penjepit. Jenis-jenis ini dapat dibangun secara eksplisit dari jenis skalar lainnya. Dalam transmisi, nilai pertama kali dilemparkan ke float dan kemudian dijepit ke wilayah masing-masing yang diizinkan oleh norm [-1.0, 1.0] atau unorm [0.0, 1.0]. Transmisi dari +/- infinity mengembalikan +/-1. Casting dari NaN tidak ditentukan. Dapat norm dibangun secara implisit dari unorm dan tidak ada kehilangan data. Operator konversi implisit ke float didefinisikan pada jenis ini. Operator biner didefinisikan antara jenis ini dan jenis skalar bawaan lainnya seperti dan : , , float, int+, -, *, /, ==, , !=, >. <>=<= Operator penugasan gabungan juga didukung: +=, , -=*=, /=. Operator negasi unary (-) didefinisikan untuk norm jenis.

Pustaka Vektor Pendek

Pustaka Vektor Pendek menyediakan beberapa fungsionalitas Jenis Vektor yang ditentukan dalam HLSL dan biasanya digunakan untuk menentukan texel. Vektor pendek adalah struktur data yang menyimpan satu hingga empat nilai dengan jenis yang sama. Jenis yang didukung adalah double, , floatint, norm, uint, dan unorm. Nama jenis diperlihatkan dalam tabel berikut ini. Untuk setiap jenis, ada juga yang sesuai typedef yang tidak memiliki garis bawah dalam namanya. Jenis yang memiliki garis bawah berada di Namespace Layanan Konkurensi::grafis. Jenis yang tidak memiliki garis bawah berada dalam Namespace Layanan Konkurensi::grafis::d irect3d sehingga dipisahkan dengan jelas dari jenis dasar yang dinamai serupa seperti __int8 dan __int16.

Jenis Panjang 2 Panjang 3 Panjang 4
ganda double_2

double2
double_3

double3
double_4

double4
float float_2

float2
float_3

float3
float_4

float4
int (integer) int_2

int2
int_3

int3
int_4

int4
norma norma_2

norma2
norm_3

norma3
norm_4

norma4
uint uint_2

uint2
uint_3

uint3
uint_4

uint4
unorm unorm_2

unorm2
unorm_3

unorm3
unorm_4

unorm4

Operator

Jika operator didefinisikan antara dua vektor pendek, maka operator juga didefinisikan antara vektor pendek dan skalar. Selain itu, salah satu dari ini harus benar:

  • Jenis skalar harus sama dengan jenis elemen vektor pendek.

  • Jenis skalar dapat dikonversi secara implisit ke jenis elemen vektor dengan hanya menggunakan satu konversi yang ditentukan pengguna.

Operasi ini dilakukan secara komponen-bijak antara setiap komponen vektor pendek dan skalar. Berikut adalah operator yang valid:

Jenis operator Jenis yang valid
Operator biner Valid pada semua jenis: +, -, *, , /

Valid pada jenis bilangan bulat: %, , ^, |&, <<,>>

Kedua vektor harus memiliki ukuran yang sama, dan hasilnya adalah vektor dengan ukuran yang sama.
Operator relasional Valid pada semua jenis: == dan !=
Operator penetapan gabungan Valid pada semua jenis: +=, -=, *=, /=

Valid pada jenis bilangan bulat: %=, , ^=, |=&=, <<=,>>=
Operator kenaikan dan penurunan Valid pada semua jenis: ++, --

Awalan dan pascafiks valid.
Operator BITWISE NOT (~) Valid pada jenis bilangan bulat.
Operator unary - Valid pada semua jenis kecuali unorm dan uint.

Ekspresi Menyibukkan

Pustaka Vektor Pendek mendukung vector_type.identifier konstruksi aksesor untuk mengakses komponen vektor pendek. identifier, yang dikenal sebagai ekspresi yang menggelegak, menentukan komponen vektor. Ekspresi dapat berupa nilai-l atau r-value. Karakter individu dalam pengidentifikasi mungkin: x, y, z, dan w; atau r, g, b, dan a. "x" dan "r" berarti komponen nol-th, "y" dan "g" berarti komponen pertama, dan sebagainya. (Perhatikan bahwa "x" dan "r" tidak dapat digunakan dalam pengidentifikasi yang sama.) Oleh karena itu, "rgba" dan "xyzw" mengembalikan hasil yang sama. Aksesor komponen tunggal seperti "x" dan "y" adalah jenis nilai skalar. Aksesor multi-komponen adalah jenis vektor pendek. Misalnya, jika Anda membuat int_4 vektor yang diberi nama fourInts dan memiliki nilai 2, 4, 6, dan 8, maka fourInts.y mengembalikan bilangan bulat 4 dan fourInts.rg mengembalikan int_2 objek yang memiliki nilai 2 dan 4.

Kelas Tekstur

Banyak GPU memiliki perangkat keras dan cache yang dioptimalkan untuk mengambil piksel dan texel dan untuk merender gambar dan tekstur. Kelas texture<T,N> , yang merupakan kelas kontainer untuk objek texel, mengekspos fungsionalitas tekstur GPU ini. Texel dapat berupa:

  • Skalar int, , uintfloat, doublenorm, , atau unorm .

  • Vektor pendek yang memiliki dua atau empat komponen. Satu-satunya pengecualian adalah double_4, yang tidak diizinkan.

Objek texture dapat memiliki peringkat 1, 2, atau 3. Objek texture hanya dapat ditangkap dengan referensi dalam lambda panggilan ke parallel_for_each. Tekstur disimpan pada GPU sebagai objek tekstur Direct3D. Untuk informasi selengkapnya tentang tekstur dan texel di Direct3D, lihat Pengenalan Tekstur di Direct3D 11.

Jenis texel yang Anda gunakan mungkin merupakan salah satu dari banyak format tekstur yang digunakan dalam pemrograman grafik. Misalnya, format RGBA dapat menggunakan 32 bit, dengan masing-masing 8 bit untuk elemen skalar R, G, B, dan A. Perangkat keras tekstur kartu grafis dapat mengakses elemen individual berdasarkan format. Misalnya, jika Anda menggunakan format RGBA, perangkat keras tekstur dapat mengekstrak setiap elemen 8-bit ke dalam bentuk 32-bit. Di C++ AMP, Anda dapat mengatur bit per elemen skalar texel Anda sehingga Anda dapat secara otomatis mengakses elemen skalar individual dalam kode tanpa menggunakan bit-shifting.

Membuat Instans Objek Tekstur

Anda dapat mendeklarasikan objek tekstur tanpa inisialisasi. Contoh kode berikut mendeklarasikan beberapa objek tekstur.

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

Anda juga dapat menggunakan konstruktor untuk mendeklarasikan dan menginisialisasi texture objek. Contoh kode berikut membuat texture instans objek dari vektor float_4 objek. Bit per elemen skalar diatur ke default. Anda tidak dapat menggunakan konstruktor ini dengan norm, , unormatau vektor pendek dan normunorm, karena mereka tidak memiliki bit default per elemen skalar.

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

Anda juga dapat mendeklarasikan dan menginisialisasi texture objek dengan menggunakan kelebihan beban konstruktor yang membawa penunjuk ke data sumber, ukuran data sumber dalam byte, dan bit per elemen skalar.

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

Tekstur dalam contoh ini dibuat pada tampilan default akselerator default. Anda dapat menggunakan kelebihan beban konstruktor lainnya jika Anda ingin menentukan accelerator_view objek. Anda tidak dapat membuat objek tekstur pada akselerator CPU.

Ada batasan ukuran setiap dimensi objek, seperti yang texture ditunjukkan dalam tabel berikut. Kesalahan run-time dihasilkan jika Anda melebihi batas.

Tekstur Batasan ukuran per dimensi
tekstur<T,1> 16384
tekstur<T,2> 16384
tekstur<T,3> 2048

Membaca dari Objek Tekstur

Anda dapat membaca dari texture objek dengan menggunakan tekstur::operator[], tekstur::operator() Operator, atau tekstur::get Method. Kedua operator mengembalikan nilai, bukan referensi. Oleh karena itu, Anda tidak dapat menulis ke texture objek dengan menggunakan 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();
}

Contoh kode berikut menunjukkan cara menyimpan saluran tekstur dalam vektor pendek, lalu mengakses elemen skalar individual sebagai properti vektor pendek.

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

Tabel berikut mencantumkan bit yang valid per saluran untuk setiap jenis vektor pengurutan.

Jenis data tekstur Bit yang valid per elemen skalar
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
norma, norm_2, norm_4

unorm, unorm_2, unorm, 4
8, 16

Menulis ke Objek Tekstur

Gunakan metode texture::set untuk menulis ke texture objek. Objek tekstur dapat dibaca atau dibaca/ditulis. Agar objek tekstur dapat dibaca dan ditulis, kondisi berikut harus benar:

  • T hanya memiliki satu komponen skalar. (Vektor pendek tidak diperbolehkan.)

  • T bukan double, , normatau unorm.

  • Properti texture::bits_per_scalar_element ini adalah 32.

Jika ketiganya tidak benar, maka texture objek tersebut adalah readonly. Dua kondisi pertama diperiksa selama kompilasi. Kesalahan kompilasi dihasilkan jika Anda memiliki kode yang mencoba menulis ke readonly objek tekstur. Kondisi untuk texture::bits_per_scalar_element terdeteksi pada waktu proses, dan runtime menghasilkan pengecualian unsupported_feature jika Anda mencoba menulis ke objek readonly texture .

Contoh kode berikut menulis nilai ke objek tekstur.

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

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

Menyalin Objek Tekstur

Anda dapat menyalin antara objek tekstur dengan menggunakan fungsi salin atau fungsi copy_async , seperti yang ditunjukkan dalam contoh kode berikut.

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

Anda juga dapat menyalin dari satu tekstur ke tekstur lainnya dengan menggunakan metode texture::copy_to . Dua tekstur dapat berada di accelerator_views yang berbeda. Saat Anda menyalin ke writeonly_texture_view objek, data disalin ke objek yang mendasar texture . Bit per elemen skalar dan tingkatnya harus sama pada objek sumber dan tujuan texture . Jika persyaratan tersebut tidak terpenuhi, runtime memberikan pengecualian.

Kelas Tampilan Tekstur

C++ AMP memperkenalkan Kelas texture_view di Visual Studio 2013. Tampilan tekstur mendukung jenis dan peringkat texel yang sama dengan Kelas tekstur, tetapi tidak seperti tekstur, tampilan tersebut menyediakan akses ke fitur perangkat keras tambahan seperti pengambilan sampel tekstur dan mipmap. Tampilan tekstur mendukung akses baca-saja, tulis-saja, dan baca-tulis ke data tekstur yang mendasar.

  • Akses baca-saja disediakan oleh texture_view<const T, N> spesialisasi templat, yang mendukung elemen yang memiliki 1, 2, atau 4 komponen, pengambilan sampel tekstur, dan akses dinamis ke berbagai tingkat mipmap yang ditentukan saat tampilan dibuat.

  • Akses hanya tulis disediakan oleh kelas texture_view<T, N>templat non-khusus , yang mendukung elemen yang memiliki 2 atau 4 komponen dan dapat mengakses satu tingkat mipmap yang ditentukan ketika tampilan dibuat. Ini tidak mendukung pengambilan sampel.

  • Akses baca-tulis disediakan oleh kelas texture_view<T, N>templat non-khusus , yang, seperti tekstur, mendukung elemen yang hanya memiliki satu komponen; tampilan dapat mengakses satu tingkat mipmap yang ditentukan ketika instans. Ini tidak mendukung pengambilan sampel.

Tampilan tekstur dianalogikan dengan tampilan array, tetapi tidak menyediakan manajemen data otomatis dan fungsionalitas pergerakan yang disediakan Kelas array_view melalui kelas array. Hanya texture_view dapat diakses pada tampilan akselerator tempat data tekstur yang mendasar berada.

writeonly_texture_view Tidak Digunakan Lagi

Untuk Visual Studio 2013, C++ AMP memperkenalkan dukungan yang lebih baik untuk fitur tekstur perangkat keras seperti pengambilan sampel dan mipmap, yang tidak dapat didukung oleh Kelas writeonly_texture_view. Kelas yang baru diperkenalkan texture_view mendukung superset fungsionalitas di writeonly_texture_view; sebagai hasilnya, writeonly_texture_view tidak digunakan lagi.

Sebaiknya—setidaknya untuk kode baru—yang Anda gunakan texture_view untuk mengakses fungsionalitas yang sebelumnya disediakan oleh writeonly_texture_view. Bandingkan dua contoh kode berikut yang menulis ke objek tekstur yang memiliki dua komponen (int_2). Perhatikan bahwa dalam kedua kasus, tampilan, wo_tv4, harus diambil berdasarkan nilai dalam ekspresi lambda. Berikut adalah contoh yang menggunakan kelas baru 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));
    });
}

Dan berikut adalah kelas yang tidak digunakan writeonly_texture_view lagi:

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

Seperti yang Anda lihat, dua contoh kode hampir identik ketika yang Anda lakukan adalah menulis ke tingkat mipmap utama. Jika Anda menggunakan writeonly_texture_view kode yang ada dan tidak berencana untuk meningkatkan kode tersebut, Anda tidak perlu mengubahnya. Namun, jika Anda berpikir untuk memajukan kode tersebut, kami sarankan Anda menulis ulang kode tersebut untuk digunakan texture_view karena penyempurnaan di dalamnya mendukung fitur tekstur perangkat keras baru. Baca selengkapnya untuk informasi selengkapnya tentang kemampuan baru ini.

Untuk informasi selengkapnya tentang penghentian writeonly_texture_view, lihat Gambaran Umum Desain Tampilan Tekstur di C++ AMP pada Pemrograman Paralel di blog Kode Asli.

Membuat Instans Objek Tampilan Tekstur

Mendeklarasikan texture_view mirip dengan mendeklarasikan array_view yang terkait dengan array. Contoh kode berikut mendeklarasikan beberapa texture objek dan texture_view objek yang terkait dengannya.

#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
}

Perhatikan bagaimana tampilan tekstur yang jenis elemennya non-const dan memiliki satu komponen baca-tulis, tetapi tampilan tekstur yang jenis elemennya non-const tetapi memiliki lebih dari satu komponen hanya menulis. Tampilan tekstur jenis elemen const selalu baca-saja, tetapi jika jenis elemen non-const, maka jumlah komponen dalam elemen menentukan apakah itu baca-tulis (1 komponen) atau tulis-saja (beberapa komponen).

Jenis elemen dari — texture_viewkesadarannya dan juga jumlah komponen yang dimilikinya—juga berperan dalam menentukan apakah tampilan mendukung pengambilan sampel tekstur, dan bagaimana tingkat mipmap dapat diakses:

Jenis Komponen Baca Tulis Pengambilan sampel Akses Mipmap
<texture_view const T, N> 1, 2, 4 Ya Tidak (1) Ya Ya, dapat diindeks. Rentang ditentukan pada instansiasi.
<Texture_view T, N> 1

2, 4
Ya

Tidak (2)
Ya

Ya
Tidak (1)

Tidak (1)
Ya, satu tingkat. Tingkat ditentukan pada instansiasi.

Ya, satu tingkat. Tingkat ditentukan pada instansiasi.

Dari tabel ini, Anda dapat melihat bahwa tampilan tekstur baca-saja sepenuhnya mendukung kemampuan baru dengan imbalan tidak dapat menulis ke tampilan. Tampilan tekstur yang dapat ditulis terbatas karena hanya dapat mengakses satu tingkat mipmap. Tampilan tekstur baca-tulis bahkan lebih khusus daripada yang dapat ditulis, karena menambahkan persyaratan bahwa jenis elemen tampilan tekstur hanya memiliki satu komponen. Perhatikan bahwa pengambilan sampel tidak didukung untuk tampilan tekstur yang dapat ditulis karena merupakan operasi berorientasi baca.

Membaca dari Objek Tampilan Tekstur

Membaca data tekstur yang tidak di-sampel melalui tampilan tekstur sama seperti membacanya dari tekstur itu sendiri, kecuali bahwa tekstur ditangkap oleh referensi, sedangkan tampilan tekstur diambil oleh nilai. Dua contoh kode berikut menunjukkan; pertama, dengan hanya menggunakan 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));
    });
}

Dan berikut adalah contoh yang sama, kecuali sekarang menggunakan texture_view kelas :

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

Tampilan tekstur yang elemennya didasarkan pada jenis floating-point—misalnya, float, float_2, atau float_4—juga dapat dibaca dengan menggunakan pengambilan sampel tekstur untuk memanfaatkan dukungan perangkat keras untuk berbagai mode pemfilteran dan mode alamat. C++ AMP mendukung dua mode pemfilteran yang paling umum dalam skenario komputasi—pemfilteran titik (tetangga terdekat) dan pemfilteran linier (rata-rata tertimbang)—dan empat mode pengalamatan—dibungkus, dicerminkan, dijepit, dan batas. Untuk informasi selengkapnya tentang mode alamat, lihat Enumerasi address_mode.

Selain mode yang didukung C++ AMP secara langsung, Anda dapat mengakses mode pemfilteran lain dan mode alamat platform yang mendasar dengan menggunakan API interop untuk mengadopsi sampler tekstur yang dibuat dengan menggunakan API platform secara langsung. Misalnya, Direct3D mendukung mode pemfilteran lain seperti pemfilteran anisotropic, dan dapat menerapkan mode pengalamatan yang berbeda ke setiap dimensi tekstur. Anda dapat membuat sampel tekstur yang koordinatnya dibungkus secara vertikal, dicerminkan secara horizontal, dan diambil sampelnya dengan pemfilteran anisotropik dengan menggunakan API Direct3D, lalu memanfaatkan sampler dalam kode AMP C++ Anda dengan menggunakan make_sampler API interop. Untuk informasi selengkapnya, lihat Pengambilan Sampel Tekstur di C++ AMP di blog Pemrograman Paralel di Kode Asli.

Tampilan tekstur juga mendukung pembacaan mipmap. Tampilan tekstur baca-saja (yang memiliki jenis elemen const) menawarkan fleksibilitas terbanyak karena rentang tingkat mip yang ditentukan pada instansiasi dapat diambil sampelnya secara dinamis, dan karena elemen yang memiliki 1, 2, atau 4 komponen didukung. Tampilan tekstur baca-tulis yang memiliki elemen yang memiliki satu komponen juga mendukung mipmaps, tetapi hanya dari tingkat yang ditentukan pada instansiasi. Untuk informasi selengkapnya, lihat Tekstur dengan Mipmaps di blog Pemrograman Paralel di Kode Asli.

Menulis ke Objek Tampilan Tekstur

Gunakan metode texture_view::get untuk menulis ke yang mendasar texture melalui texture_view objek. Tampilan tekstur dapat bersifat baca-saja, baca-tulis, atau tulis-saja. Agar tampilan tekstur dapat ditulis harus memiliki jenis elemen yang non-const; agar tampilan tekstur dapat dibaca dan dapat ditulis, jenis elemennya juga harus hanya memiliki satu komponen. Jika tidak, tampilan tekstur bersifat baca-saja. Anda hanya dapat mengakses satu tingkat mipmap tekstur sekaligus melalui tampilan tekstur, dan tingkat ditentukan saat tampilan dibuat.

Contoh ini menunjukkan cara menulis ke tingkat mipmap terperinci kedua dari tekstur yang memiliki tingkat 4 mipmap. Tingkat mipmap yang paling rinci adalah tingkat 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);
});

Interoperabilitas

Runtime C++ AMP mendukung interoperabilitas antara texture<T,1> dan antarmuka ID3D11Texture1D, antara texture<T,2> dan antarmuka ID3D11Texture2D, dan antara texture<T,3> dan antarmuka ID3D11Texture3D. Metode get_texture mengambil texture objek dan mengembalikan IUnknown antarmuka. Metode make_texture mengambil IUnknown antarmuka dan accelerator_view objek dan mengembalikan texture objek.

Lihat juga

Kelas double_2
Kelas double_3
Kelas double_4
Kelas float_2
Kelas float_3
Kelas float_4
Kelas int_2
Kelas int_3
Kelas int_4
Kelas norm_2
Kelas norm_3
Kelas norm_4
Struktur short_vector
Struktur short_vector_traits
Kelas uint_2
Kelas uint_3
Kelas uint_4
Kelas unorm_2
Kelas unorm_3
Kelas unorm_4