Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. únor 2012, 10:53:28 Předmět: [DX11] - 3D Texture Filtering |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. únor 2012, 12:31:33 Předmět: |
|
|
Ja by som viac pouzival lerp, je to prehladnejsie
Podla mna je to dobre, tiez by ma zaujimala chyba. Daj vediet  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. únor 2012, 14:00:26 Předmět: |
|
|
Tak chyba bude asi někde jinde...
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
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. únor 2012, 14:06:28 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. únor 2012, 14:27:39 Předmět: |
|
|
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 Stejně musí být v globální paměti.. do registru ani do shared memory se nevejde _________________ Perry.cz |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. únor 2012, 14:51:17 Předmět: |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 27. únor 2012, 14:54:17 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. únor 2012, 15:33:02 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. únor 2012, 15:49:17 Předmět: |
|
|
Asi bych to už dál neřešil 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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 27. únor 2012, 16:37:25 Předmět: |
|
|
A preco vlastne nemozes data dat do 3D texture resource namiesto 1D buffer resource? 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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. únor 2012, 16:46:32 Předmět: |
|
|
Ty data se na GPU prepisuji (teda zatim ne.. ale je to plan )... 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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. únor 2012, 17:13:06 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. únor 2012, 17:25:02 Předmět: |
|
|
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 |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 28. únor 2012, 12:10:38 Předmět: |
|
|
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 |
|
 |
|