Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A C++ AMP több API-t tartalmaz a Concurrency::graphics névtérben, amelyekkel hozzáférhet a GPU-k textúrájának támogatásához. Néhány gyakori forgatókönyv a következő:
Az
textureosztályt adattárolóként használhatja a számításokhoz, és kihasználhatja a textúragyorsítótár és a GPU-hardver elrendezéseinek térbeli területi beállításait . A térbeli helység azon adatelemek tulajdonsága, amelyek fizikailag közel állnak egymáshoz.A futtatókörnyezet hatékony együttműködést biztosít a nem számítási árnyékolókkal. A képpontok, csúcspontok, tessellációk és a burkolatárnyékolók gyakran használnak vagy állítanak elő olyan textúrákat, amelyeket a C++ AMP-számításokban használhat.
A C++ AMP grafikus API-jai alternatív módszereket kínálnak az alszavas pufferek elérésére. A 8 bites vagy 16 bites skalárokból álló texeleket (textúraelemeket) ábrázoló formátumokkal rendelkező textúrák lehetővé teszik az ilyen csomagolt adattárolás elérését.
Megjegyzés:
A C++ AMP fejlécek elavultak a Visual Studio 2022 17.0-s verziójától kezdve.
Az AMP-fejlécek beépítése építési hibákat fog okozni. A figyelmeztetések elnémításához a _SILENCE_AMP_DEPRECATION_WARNINGS definiálása előtt az AMP-fejléceket be kell vonni.
A norma- és unormtípusok
A norm és unorm típusok skaláris típusok, amelyek korlátozzák a float értékek tartományát; ezt korlátozásnak nevezzük. Ezek a típusok explicit módon más skaláris típusokból is felépíthetők. Az öntés során az értéket először float típusra alakítják át, majd norm [-1.0, 1.0] vagy unorm [0.0, 1.0] által engedélyezett megfelelő tartományba szorítják be. A +/- végtelenből való öntés +/-1 értéket ad vissza. A NaN-ből történő öntés nincs meghatározva. Az A norm implicit módon létrehozható egy unorm-ből, és nincs adatvesztés. Az implicit konverziós operátor float az ilyen típusokon van definiálva. A bináris operátorok ezen típusok és más beépített skaláris típusok között vannak definiálva, például float, int: +, -, *, /, ==, !=, >, <, >=, <=. Az összetett hozzárendelési operátorok is támogatottak: +=, -=, *=, /=. A - unáris negációs operátor a norm típusokhoz van definiálva.
Kis vektorkódtár
A Rövid vektortár a HLSL-ben definiált vektortípus néhány funkcióját biztosítja, és általában a texelek definiálására szolgál. A rövid vektor olyan adatszerkezet, amely egy-négy azonos típusú értéket tartalmaz. A támogatott típusok a következőkdouble: , float, int, normuintés unorm. A típusnevek az alábbi táblázatban láthatók. Minden típushoz tartozik egy megfelelő typedef is, amely nem rendelkezik aláhúzásjelekkel a névben. Az aláhúzásjelekkel rendelkező típusok az Egyidejűség::grafikus névtérben találhatók. Azok a típusok, amelyek nem rendelkeznek aláhúzásjelekkel , a Concurrency::graphics::d irect3d névtérben találhatók, hogy egyértelműen elkülönülhessenek a hasonló nevű alapvető típusoktól, például __int8 és __int16.
| Típus | Hossz 2 | Hossz 3 | Hossz 4 |
|---|---|---|---|
| dupla | double_2 dupla2 |
double_3 dupla3 |
double_4 dupla4 |
| float | float_2 float2 |
float_3 float3 |
float_4 float4 |
| Int | int_2 int2 |
int_3 int3 |
int_4 int4 |
| norma | norm_2 norm2 |
norm_3 norma3 |
norm_4 norm4 |
| uint (előjel nélküli egész szám) | uint_2 uint2 |
uint_3 uint3 |
uint_4 uint4 |
| unormális | unorm_2 unorm2 |
unorm_3 unorm3 |
unorm_4 unorm4 |
Működtetők
Ha egy operátor két rövid vektor között van definiálva, akkor egy rövid vektor és egy skalár között is definiálva van. Emellett az egyiknek igaznak kell lennie:
A skalár típusának meg kell egyeznie a rövid vektor elemtípusával.
A skalár típusa implicit módon konvertálható a vektor elemtípusává csak egy felhasználó által meghatározott átalakítással.
A művelet komponensenként történik a rövid vektor és a skaláris minden egyes összetevője között. Az érvényes operátorok a következők:
| Operátor típusa | Érvényes típusok |
|---|---|
| Bináris operátorok | Minden típusra érvényes: +, -, *, , /Egész számtípusokra érvényes: %, ^, |, &, <<>>A két vektornak azonos méretűnek kell lennie, és az eredmény egy azonos méretű vektor. |
| Relációs operátorok | Minden típusra érvényes: == és != |
| Összetett hozzárendelés operátora | Minden típusra érvényes: +=, -=, , *=/=Egész számtípusokra érvényes: %=, ^=, |=, &=, <<=>>= |
| Növekmény- és csökkentés operátorok | Minden típusra érvényes: ++, --Az előtag és a postfix is érvényes. |
Bitenkénti NOT operátor (~) |
Egész számtípusokra érvényes. |
Unary - operátor |
Érvényes az összes típusra, kivéve unorm és uint. |
Örvénylő kifejezések
A rövid vektortár támogatja a vector_type.identifier kiegészítő szerkezetet egy rövid vektor összetevőinek eléréséhez. Az identifierúgynevezett örvénylő kifejezés a vektor összetevőit határozza meg. A kifejezés lehet l-érték vagy r-érték. Az azonosító egyes karakterei lehetnek: x, y, z és w; vagy r, g, b és a. Az "x" és az "r" a nulladik összetevőt jelenti, az "y" és a "g" az első összetevőt jelenti, és így tovább. (Figyelje meg, hogy az "x" és az "r" nem használható ugyanabban az azonosítóban.) Ezért az "rgba" és a "xyzw" ugyanazt az eredményt adja vissza. Az egykomponensű tartozékok, például az "x" és az "y" skaláris értéktípusok. A többkomponensű hozzáférők rövid vektortípusok. Ha például egy int_4 elnevezett fourInts és 2, 4, 6 és 8 értéket tartalmazó vektort hoz létre, akkor fourInts.y a 4 egész számot adja vissza, és fourInts.rg egy int_2 2 és 4 értéket tartalmazó objektumot ad vissza.
Textúraosztályok
Sok GPU rendelkezik olyan hardverekkel és gyorsítótárral, amelyek képpontok és texelek lekérésére, valamint képek és textúrák renderelésére vannak optimalizálva. Az texture<T,N> osztály, amely a texel objektumok tárolóosztálya, elérhetővé teszi ezeknek a GPU-knak a textúráját. A texel lehet:
Egy
int,uint,float,double,normvagyunormskaláris.Egy rövid vektor, amely két vagy négy összetevőből áll. Az egyetlen kivétel a
double_4, amely nem engedélyezett.
Az texture objektum rangja 1, 2 vagy 3 lehet. Az texture objektum csak a meghívás parallel_for_eachlambdájában található hivatkozással rögzíthető. A textúra a GPU-n Direct3D textúraobjektumként van tárolva. A Direct3D textúráiról és texeljeiről további információt a Direct3D 11 textúráinak bemutatása című témakörben talál.
A használt texel típus egyike lehet a grafikus programozásban használt számos textúraformátumnak. Az RGBA-formátumok például 32 bitet használhatnak, amelyek mindegyike 8 bittel rendelkezik az R, G, B és A skaláris elemekhez. A grafikus kártya textúra hardvere a formátum alapján elérheti az egyes elemeket. Ha például az RGBA formátumot használja, a textúrahardver minden 8 bites elemet 32 bites formában képes kinyerni. A C++ AMP-ben beállíthatja a texel skaláris elemenkénti bitjeinek számát, hogy biteltolás nélkül automatikusan hozzáférhessen a kód egyes skaláris elemeihez.
Textúraobjektumok példányosítása
A textúraobjektum inicializálás nélkül deklarálható. Az alábbi példakód több textúraobjektumot deklarál.
#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));
}
Konstruktorokkal is deklarálhat és inicializálhat objektumokat texture . Az alábbi példakód egy texture objektumot példányosít az objektumok vektorából float_4 . A skaláris elemenkénti bitek az alapértelmezett értékre lesznek beállítva. Ezt a konstruktort nem használhatja norm, unorm, vagy a norm és unorm rövid vektoraival, mert nem rendelkeznek alapértelmezett bitekkel skaláris elemenként.
#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());
}
Az objektumokat deklarálhatja és inicializálhatja texture egy konstruktor túlterhelésével is, amely a forrásadatokra mutató mutatót, a forrásadatok bájtban megadott méretét és a skaláris elemenkénti biteket mutatja.
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);
}
Az ezekben a példákban szereplő textúrák az alapértelmezett gyorsító alapértelmezett nézetében jönnek létre. A konstruktor egyéb túlterheléseit is használhatja, ha objektumot accelerator_view szeretne megadni. Nem hozhat létre textúraobjektumot processzorgyorsítón.
Az objektum egyes dimenzióinak méretére texture az alábbi táblázatban látható korlátozások vonatkoznak. Futásidejű hiba lép fel, ha túlléped a határokat.
| Textúra | Méretkorlátozás dimenziónként |
|---|---|
| textúra<T,1> | 16384 |
| textúra<T,2> | 16384 |
| textúra<T,3> | 2048 |
Olvasás textúraobjektumokból
Egy objektumból texture a textúra::operátor[], textúra::operátor(), vagy a textúra::get metódus használatával olvashat. A két operátor egy értéket ad vissza, nem egy hivatkozást. Ezért nem írhat a texture objektumba a texture::operator[] használatával.
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();
}
Az alábbi példakód bemutatja, hogyan tárolhat textúracsatornákat egy rövid vektorban, majd hogyan érheti el az egyes skaláris elemeket a rövid vektor tulajdonságaiként.
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;
});
}
Az alábbi táblázat az érvényes biteket sorolja fel csatornánként az egyes rendezési vektortípusokhoz.
| Textúra adattípusa | Érvényes bitek skaláris elemenként |
|---|---|
| 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 |
| dupla, double_2 | 64 |
| norma, norm_2, norm_4 unorm, unorm_2, unorm, 4 |
8, 16 |
Textúra objektumokra írás
Használja a textúra::set metódust az texture objektumokba való írásra. A textúraobjektum lehet csak olvasható vagy olvasható/írható. Ahhoz, hogy egy textúraobjektum olvasható és írható legyen, a következő feltételeknek kell teljesülniük:
T csak egy skaláris összetevőt tartalmaz. (A rövid vektorok nem engedélyezettek.)
T nem
double,normvagyunorm.A
texture::bits_per_scalar_elementtulajdonság értéke 32.
Ha egyik sem igaz a háromból, akkor az texture objektum csak olvasható. Az első két feltételt a fordítás során ellenőrzi a rendszer. A fordítási hiba akkor keletkezik, ha olyan kóddal rendelkezik, ami megpróbál írni egy textúraobjektumba readonly. A rendszer futásidőben észleli a feltételt texture::bits_per_scalar_element , és a futtatókörnyezet létrehozza a unsupported_feature kivételt, ha írásvédett texture objektumba próbál írni.
Az alábbi példakód értékeket ír egy textúraobjektumba.
void writeTexture() {
texture<int, 1> tex1(16);
parallel_for_each(tex1.extent, [&tex1] (index<1> idx) restrict(amp) {
tex1.set(idx, 0);
});
}
Textúraobjektumok másolása
A textúraobjektumok közötti másoláshoz használja a másolási függvényt vagy a copy_async függvényt, ahogyan az az alábbi kód példában látható.
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));
}
A textúra::copy_to metódussal egyik textúrából a másikba is másolhat. A két textúra különböző accelerator_view-ken lehetnek. Amikor egy writeonly_texture_view objektumra másol, az adatok át lesznek másolva az alapul szolgáló texture objektumba. A skaláris elemenkénti biteknek és a mértékeknek azonosnak kell lenniük a forrás- és célobjektumokon texture . Ha ezek a követelmények nem teljesülnek, a program futása kivételt dob.
Textúranézet osztályok
A C++ AMP a Visual Studio 2013 texture_view osztályát mutatja be. A textúranézetek ugyanazokat a texeltípusokat támogatják, mint a textúraosztály, de a textúrákkal ellentétben további hardverfunkciókhoz, például a textúra mintavételezéséhez és a mipmapekhez is hozzáférést biztosítanak. A textúranézetek támogatják a csak olvasható, csak írható és olvasás- és írásvédett hozzáférést a mögöttes textúraadatokhoz.
Az írásvédett hozzáférést a
texture_view<const T, N>sablon specializáció biztosítja, amely támogatja az 1, 2 vagy 4 összetevővel rendelkező elemeket, a textúra mintavételezését és a nézet példányosításakor meghatározott mipmap-szintek dinamikus elérését.A csak írási hozzáférést a nem specializált sablonosztály
texture_view<T, N>biztosítja, amely támogatja a 2 vagy 4 összetevőt tartalmazó elemeket, és a nézet példányosításakor meghatározott mipmap-szintet érheti el. Nem támogatja a mintavételezést.Az olvasási-írási hozzáférést a nem specializált sablonosztály
texture_view<T, N>biztosítja, amely a textúrákhoz hasonlóan támogatja azokat az elemeket, amelyek csak egy összetevővel rendelkeznek; a nézet egy mipmap-szintet érhet el, amely a példányosításkor lesz meghatározva. Nem támogatja a mintavételezést.
A textúranézetek hasonlóak a tömbnézetekkel, de nem biztosítják a array_view osztály által a tömbosztályon keresztül biztosított automatikus adatkezelési és áthelyezési funkciókat. A texture_view csak a gyorsítónézeten érhető el, ahol a mögöttes textúraadatok találhatók.
writeonly_texture_view megszűnik
A Visual Studio 2013 esetében a C++ AMP jobb támogatást nyújt a hardveres textúra olyan funkcióihoz, mint a mintavételezés és a mipmaps, amelyeket a writeonly_texture_view osztály nem tudott támogatni. Az újonnan bevezetett texture_view osztály támogatja a funkciók writeonly_texture_viewegy szuperhalmazát; ennek következtében writeonly_texture_view elavult.
Javasoljuk – legalábbis új kód esetén –, hogy használja a texture_view-t a korábban a writeonly_texture_view által biztosított funkcionalitás eléréséhez. Hasonlítsa össze az alábbi két kódmintát, amelyek két összetevőt (int_2) tartalmazó textúraobjektumba írnak. Figyelje meg, hogy mindkét esetben a nézetet wo_tv4érték szerint kell rögzíteni a lambda kifejezésben. Az alábbi példa az új texture_view osztályt használja:
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));
});
}
És itt van az elavult writeonly_texture_view osztály:
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));
});
}
Mint látható, a két kódpéldának majdnem azonosnak kell lennie, amikor csak az elsődleges mipmap-szintre ír. Ha a meglévő kódban használta writeonly_texture_view , és nem tervezi továbbfejleszteni a kódot, nem kell módosítania. Ha azonban a kód továbbfejlesztésén gondolkodik, javasoljuk, hogy írja át a használatba texture_view , mert a benne lévő fejlesztések támogatják az új hardver-textúrafunkciókat. Olvasson tovább, hogy többet megtudjon ezekről az új képességekről.
Az elavulással writeonly_texture_viewkapcsolatos további információkért tekintse meg a C++ AMP textúranézet-kialakításának áttekintését a natív kód párhuzamos programozásáról szóló blogon.
Textúranézet objektumainak példányosítása
A texture_view deklarálása hasonló egy array_view deklarálásához, amely egy tömbhöz társul. Az alábbi példakód több texture , hozzájuk társított objektumot és texture_view objektumot deklarál.
#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
}
Figyelje meg, hogy egy olyan textúranézet, amelynek elemtípusa nem const, és egy összetevővel rendelkezik, írás-olvasás, de egy olyan textúranézet, amelynek elemtípusa nem const, de több összetevővel rendelkezik, csak írásra. A const elemtípusok textúranézetei mindig írásvédettek, de ha az elemtípus nem const, akkor az elem összetevőinek száma határozza meg, hogy írásvédett (1 összetevő) vagy írásvédett (több összetevő).
A nézet elemtípusa texture_view– a const-ness és a hozzá tartozó összetevők száma – szintén szerepet játszik annak meghatározásában, hogy a nézet támogatja-e a textúra mintavételezését, és hogy a mipmap szintek hogyan érhetők el:
| Típus | Összetevők | Olvasás | Írj! | Mintavételezés | Mipmap-hozzáférés |
|---|---|---|---|---|---|
| <texture_view const T, N> | 1, 2, 4 | Igen | Nem (1) | Igen | Igen, indexelhető. A tartomány a példányosításkor lesz meghatározva. |
| <Texture_view T, N> | 1 2, 4 |
Igen Nem (2) |
Igen Igen |
Nem (1) Nem (1) |
Igen, egy szint. A szint a példányosításkor van meghatározva. Igen, egy szint. A szint a példányosításkor van meghatározva. |
Ebből a táblázatból láthatja, hogy az írásvédett textúranézetek teljes mértékben támogatják az új képességeket, cserébe a nézetbe nem tudnak írni. A írható textúranézetek korlátozottak, mivel csak egy mipmap-szinthez férnek hozzá. Az írási-olvasási textúranézetek még a írhatónál is specializáltabbak, mivel hozzáfűzik azt a követelményt, hogy a textúranézet elemtípusa csak egy összetevőből áll. Figyelje meg, hogy a mintavételezés írható textúranézetek esetében nem támogatott, mert ez egy olvasás-orientált művelet.
Olvasás Textúranézet-objektumokból
A nem mintavételezett textúraadatok textúranézeten keresztüli olvasása ugyanúgy működik, mint a textúra önmagából való olvasása, azzal a kivétellel, hogy a textúrákat hivatkozás alapján rögzítik, míg a textúranézeteket érték alapján rögzítik. Az alábbi két példakód bemutatása; elsőként csak a texture használatával:
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));
});
}
És ugyanez a példa, kivéve, hogy most az osztályt texture_view használja:
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));
});
}
A lebegőpontos típusokon alapuló textúranézetek — például float, float_2 vagy float_4 — szintén olvashatók textúra mintavételezéssel, ami lehetővé teszi a különböző szűrési és címzési módok hardveres támogatásának kihasználását. A C++ AMP támogatja a számítási forgatókönyvekben leggyakrabban használt két szűrési módot – pontszűrés (legközelebbi szomszéd) és lineáris szűrés (súlyozott átlag) és négy címzési mód – burkolt, tükrözött, befogó és szegélyes. A címzési módokról további információt address_mode Enumerálás című témakörben talál.
A C++ AMP által közvetlenül támogatott módokon kívül az alapul szolgáló platform egyéb szűrési és címzési módjaihoz is hozzáférhet az interop API-k használatával, amellyel közvetlenül a platform API-jaival létrehozott textúra mintavevőt alkalmazhat. A Direct3D például támogatja az egyéb szűrési módokat, például az anizotróp szűrést, és más címzési módot alkalmazhat a textúra minden dimenziójára. Létrehozhat egy textúramintát, amelynek koordinátái függőlegesen burkoltak, vízszintesen tükrözöttek, és anisotróp szűréssel vannak mintavételezve a Direct3D API-k használatával, majd az interop API használatával felhasználhatja a make_sampler C++ AMP kódban. További információ: Textúramintavétel a C++ AMP-ben a Natív kód párhuzamos programozása blogon.
A textúranézetek a mipmapek olvasását is támogatják. Az írásvédett textúranézetek (amelyek const elemtípussal rendelkeznek) a legnagyobb rugalmasságot nyújtják, mivel a példányosításkor meghatározott mip-szintek köre dinamikusan mintavételezhető, és mivel az 1, 2 vagy 4 összetevőt tartalmazó elemek támogatottak. Az olyan olvasási-írási textúranézetek, amelyek elemei egy összetevőt tartalmaznak, szintén támogatják a mipmapokat, de csak a példányosításkor meghatározott szinten. További információ: Textúra és Mipmaps a Natív kód párhuzamos programozása blogon.
Írás textúra megtekintési objektumokba
Használja a texture_view::get metódust az alapul szolgáló texturetexture_view objektumba való íráshoz. A textúranézet lehet csak olvasható, olvasható és írható, vagy csak írható. Ahhoz, hogy a textúra nézet írható legyen, olyan elemtípussal kell rendelkeznie, amely nem const; ahhoz, hogy a textúranézet olvasható és írható legyen, az elemtípusnak is csak egy összetevővel kell rendelkeznie. Ellenkező esetben a textúra nézet írásvédett. A textúra nézetben egyszerre csak egy mipmap-szintet érhet el, a szint pedig a nézet példányosításakor lesz megadva.
Ez a példa bemutatja, hogyan írhat a 4 mipmap-szinttel rendelkező textúra második legrészletesebb mipmap-szintjére. A mipmap legrészletesebb szintje a 0. szint.
// 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);
});
Interoperabilitás
A C++ AMP futtatókörnyezet támogatja az interoperabilitást texture<T,1> az ID3D11Texture1D és az texture<T,2>, valamint az texture<T,3> között. A get_texture metódus egy objektumot texture vesz fel, és egy IUnknown felületet ad vissza. A make_texture metódus egy IUnknown felületet és egy accelerator_view objektumot használ, és visszaad egy objektumot texture .
Lásd még
double_2 osztály
double_3 osztály
double_4 osztály
float_2 osztály
float_3 osztály
float_4 osztály
int_2 osztály
int_3 osztály
int_4 osztály
norm_2 osztály
norm_3 osztály
norm_4 osztály
short_vector struktúra
short_vector_traits struktúra
uint_2 osztály
uint_3 osztály
uint_4 osztály
unorm_2 osztály
unorm_3 osztály
unorm_4 osztály