.[ ČeskéHry.cz ].
[DX11] - 3D Texture Filtering

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2012, 10:53:28    Předmět: [DX11] - 3D Texture Filtering Odpovědět s citátem

Snažím se udělat ručně filtr na 3D texturu přes Trilineární interpolaci.
Bohužel výsledek vypadá oproti tomu, když použiji DX
TextureSampler je nastavený na D3D11_FILTER_MIN_MAG_MIP_LINEAR, nicméně měla by se číst pouze největší mipmapa (tzn. reálná data ?)
kód:

tex3D.SampleLevel(TextureSampler, texCoord, 0);


Pokud pošlu na GPU data jako pole (buffer), ručně si počítám okolí a udělám tri-filtraci, tak je výsledek "kostičkovaný".

kód:

   int3 posIndex0 = floor(pos);
   int3 posIndex1 = posIndex0 + 1;
   
   float3 diff = pos - posIndex0;
   float3 diffOposite = 1 - diff;

   float4 i1 = GetColor(posIndex0.x, posIndex0.y, posIndex0.z) * diffOposite.z + GetColor(posIndex0.x, posIndex0.y, posIndex1.z) * diff.z;
   float4 i2 = GetColor(posIndex0.x, posIndex1.y, posIndex0.z) * diffOposite.z + GetColor(posIndex0.x, posIndex1.y, posIndex1.z) * diff.z;
   float4 j1 = GetColor(posIndex1.x, posIndex0.y, posIndex0.z) * diffOposite.z + GetColor(posIndex1.x, posIndex0.y, posIndex1.z) * diff.z;
   float4 j2 = GetColor(posIndex1.x, posIndex1.y, posIndex0.z) * diffOposite.z + GetColor(posIndex1.x, posIndex1.y, posIndex1.z) * diff.z;
   
   float4 w1 = i1 * diffOposite.y + i2 * diff.y;
   float4 w2 = j1 * diffOposite.y + j2 * diff.y;

   return w1 * diffOposite.x + w2 * diff.x;


Pravděpodobně mám někde nějakou debilní chybu, ale prostě ji nemůžu najít.

Výpočet pozice v poli (bufferu) by měl být OK... tvar objektu sedí jenom jsou na něm aliasing artefakty a je kostičkovaný.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 27. únor 2012, 12:31:33    Předmět: Odpovědět s citátem

Ja by som viac pouzival lerp, je to prehladnejsie Smile
Podla mna je to dobre, tiez by ma zaujimala chyba. Daj vediet Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2012, 14:00:26    Předmět: Odpovědět s citátem

Tak chyba bude asi někde jinde... Evil or Very Mad
Ta fce GetColor provádí dekompresi texelu.. takže asi bude něco blbě tam.

Ale i tak... výkon je žalostně nízký oproti tomu, když použiji místo bufferu 3D texturu a NearestNeighbout

3D textura: 350FPS
Linear buffer: 120FPS

Jako že to bude horší jsem čekal... ale takhle to zase ne Confused
Přitom podle toho, co jsem četl, tak pro buffer by se mel v DX použít fast-path průchod pipelinou... zatímco pro texturu právě pomalejší cesta.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 27. únor 2012, 14:06:28    Předmět: Odpovědět s citátem

Neviem, ako mas organizovany ten buffer, ale tipujem, ze pri texture by mohla byt lepsia priestorova koherencia dat. To by ale aj tak nevysvetlovalo ten rozdiel... Tiez bacha na to, ze pri texture mozes nastavit sampler, aby ti vykonaval automaticky wrap/repeat/border, whatever, pri Load instrukcii mimo rozsahu dostanes tak maximalne nuly alebo nedefinovane hodnoty (nepamatam sa)...
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2012, 14:27:39    Předmět: Odpovědět s citátem

Buufer je na uint, přetékání se neděje...
Nejspíš je to v tom, že buffer je v globální paměti.. a textura se uloží "někam jinam", kde je rychlejší přístup.. ale moc nechápu kam Smile Stejně musí být v globální paměti.. do registru ani do shared memory se nevejde
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 27. únor 2012, 14:51:17    Předmět: Odpovědět s citátem

To nie, ale ale cache bude urcite nastavena nejak inak - pri texture si totiz moze dost dobre tipnut, ktore dalsie texely sa budu nacitavat v okolitych vlaknach, a tak ich preventivne fetchne, pri bufferi ma o dost mensiu sancu...
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 27. únor 2012, 14:54:17    Předmět: Odpovědět s citátem

Myslíte, že dnešní grafiky už nemají texture cache? Z Wikipedie jsem nepochopil, jak je to u Fermi, ale předchozí generace GeForce měla třeba 24kB texture cache per 24 ALUs.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 27. únor 2012, 15:33:02    Předmět: Odpovědět s citátem

Jasne, ze tam je furt cache. Ako pisu, "L3" (per ALU) sa zmensila, zato L2 sa zvacsila. Aj z danej stranky, co odkazujes, sa da ale vycitat, ze GeForce 400 prisposobili hlavne na GPGPU - pridali viac shared mem, ktora vsak nie je nijako skryta, mozno na ukor inych "tradicnych" parametrov. To je uz ale OT.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2012, 15:49:17    Předmět: Odpovědět s citátem

Asi bych to už dál neřešil Smile Vzorec je správně... dekomprese je taky správně (v případě nearest-neighbour vše jede jak má), takže chybu asi nenajdu...
Ad. to že je to pomalý při čtení s tím nic neudělám, pokud používám buffer místo textury

Jediné co mě napadlo, použít nearest-neighbour a nějak pak filtrovat vzniklou texturu..
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 27. únor 2012, 16:37:25    Předmět: Odpovědět s citátem

A preco vlastne nemozes data dat do 3D texture resource namiesto 1D buffer resource? Smile Vsak v DX11 je to uplne jedno, nie? 3D texture resource uplne pohodlne nainicializujes cely naraz s datami z CPU priamo pri volani ID3D11Device::CreateTexture3D(..., pInitialData, ...) (nastav spravne SysMemPitch a SysMemSlicePitch).
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 27. únor 2012, 16:46:32    Předmět: Odpovědět s citátem

Ty data se na GPU prepisuji (teda zatim ne.. ale je to plan Very Happy)... nejdriv se z nich cte, pak se prepisou.. je to bindnuty jako RWStructuredBuffer.. RWTexture tam je sice taky, ale co jsem četl, tak zápis do ní je pomalý oproti tomu bufferu
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. únor 2012, 17:13:06    Předmět: Odpovědět s citátem

Ladis napsal:
Myslíte, že dnešní grafiky už nemají texture cache? Z Wikipedie jsem nepochopil, jak je to u Fermi, ale předchozí generace GeForce měla třeba 24kB texture cache per 24 ALUs.


Texturová cache je cache, kterou využívá texturovací jednotka. Klidně to ale může být normální L1/L2/L3 a být sdílená i pro jiné účely (např.: některé GPU používají texturovou cache i pro vertex fetch a 1D buffery). Přístup k texturám v paměti je často rychlejší kvůli tomu, jak je ta textura v paměti uložena, nikoliv v tom, jak pod tím funguje cache.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 27. únor 2012, 17:25:02    Předmět: Odpovědět s citátem

Buffer bude obecně vždy pomalejší jak textura (zejména při filteringu), pokud si neimplementuješ vlastní optimalizaci přístupu do paměti, tedy simulovat v shaderu to, co dělá texturovací jednotka. Textura nebývá v paměti uložena lineárně jako na CPU, ale jsou tam hierarchicky uspořádané dlaždice. Tj. třeba při přístupu do (X+3,Y+6) by se ti do cache měl načíst blok 8x8, nikoliv blok 64x1. Při dalším přístupu do (X+2,Y+7) bys už měl ten 8x8 blok v cachi, namísto načítání dalšího bloku 64x1 o pixel níž.

GPU kreslí obraz taky po dlaždicích (tzn. počítá bloky o NxN pixelech), už proto se vyplatí tu texturu mít v uloženou v dlaždicích a nikoliv lineárně.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 28. únor 2012, 12:10:38    Předmět: Odpovědět s citátem

DX11 podporuje na textury Load, kde se pracuje s celociselnymi indexy. Ovsem nikde nemuzu dohledat, zda to pouziva cache nebo ne (a tim padem se to bude chovat stejne jako buffer). Podle testu mi ryhlost vychazi jako by to jelo bez cache, ale taky muze byt velky pomer "cache miss". Obecne dohledat v madn o cachi v dx11 nejak nic moc nejde.
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna