|
|
Idézet kuzanth :
Mivel sikerült megoldanom ezt a textúrás meg surface-es problémát, jó lenne tisztázni, hogy pontosan milyen lépések kellenek a glow/bloom (már azt se tudom melyik, úgy össze vagyok kavarva) effecthez. Ez így jó? :
1. Két surface deklarálása (globálisként, vagy elég lokálisként a Render fgv-ben?)
2. Mátrix beállítás (world, view, proj)
3. device.Clear(..) + RenderStates.ZEnable = true
4. BeginScene() - EndScene() közé a kirajzolás (ha ezt egy textúrázó effect csinálja, kell a device.SetTexture()?)
5. Texture rendertargettexure = new Texture(dev, dev.DisplayMode.Width, dev.DisplayMode.Height, 1, Usage.RenderTarget, Format.X8R8G8B8,
Pool.Default)
6. oldrendersurface = dev.GetRenderTarget(0)
7. rendersurface = rendertargettexure.GetSurfaceLevel(0)
8. dev.StretchRectangle(oldrendersurface, renderrect, rendersurface, renderrect, TextureFilter.None) //renderrect a Rectangle, mert a null-t valamiért nekem nem fogadja el
9. dev.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
System.Drawing.Color.FromArgb(0, 0, 0), 1.0f, 0) + dev.SetRenderState(RenderStates.ZEnable, true);
10. BeginScene() után az effectes kirajzolás, ahol az effect.SetValuenak át kell adni a rendertargettexture-t, mint textúrát + az egyéb változókat? Itt, ha megintcsak normál kirajzolásról van szó, kell a dev.SetTexture() a DrawSubset elé?
11. dev.EndScene() + dev.Present();
A kérdésekre meg külön válaszolok:
1. attól függ hol akarodv még használni ezeket a surface-eket
4. nem kell device.SetTexture() effecteknél viszont ilyenkor az effekt Value-ját kell használni. Működik a device-es SetTexture-el is kicsit másképp de sztem az elég fapados módszer.
10. Device.SetTexture() Fixed Function Pipeline-nál kell, programmable pipeline-nál (shaderek) az effect-en keresztül érdemes beálltani a texturát.
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
Mivel sikerült megoldanom ezt a textúrás meg surface-es problémát, jó lenne tisztázni, hogy pontosan milyen lépések kellenek a glow/bloom (már azt se tudom melyik, úgy össze vagyok kavarva) effecthez. Ez így jó? :
1. Két surface deklarálása (globálisként, vagy elég lokálisként a Render fgv-ben?)
2. Mátrix beállítás (world, view, proj)
3. device.Clear(..) + RenderStates.ZEnable = true
4. BeginScene() - EndScene() közé a kirajzolás (ha ezt egy textúrázó effect csinálja, kell a device.SetTexture()?)
5. Texture rendertargettexure = new Texture(dev, dev.DisplayMode.Width, dev.DisplayMode.Height, 1, Usage.RenderTarget, Format.X8R8G8B8,
Pool.Default)
6. oldrendersurface = dev.GetRenderTarget(0)
7. rendersurface = rendertargettexure.GetSurfaceLevel(0)
8. dev.StretchRectangle(oldrendersurface, renderrect, rendersurface, renderrect, TextureFilter.None) //renderrect a Rectangle, mert a null-t valamiért nekem nem fogadja el
9. dev.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
System.Drawing.Color.FromArgb(0, 0, 0), 1.0f, 0) + dev.SetRenderState(RenderStates.ZEnable, true);
10. BeginScene() után az effectes kirajzolás, ahol az effect.SetValuenak át kell adni a rendertargettexture-t, mint textúrát + az egyéb változókat? Itt, ha megintcsak normál kirajzolásról van szó, kell a dev.SetTexture() a DrawSubset elé?
11. dev.EndScene() + dev.Present();
Glow:
Rendertarget tex létrehozása;
Fullscreen Quad létrehozása;
1 render fázis:
Clear();
BeginScene();
RenderObjects(); //mártixok texek shaderek beállítása és render
EndScene();
2 render fázis:
Z kikapcs;
Két surface deklarálása és kinullozása;
Az egyikbe lekéred a backbuffert a másikba a tex nulladik mip szintjét.
StrechRect-el összepasszintod őket.
BeginScene();
Effect->SetTexture(a render target);
Begin();
BeginPass(); //itt most az egyszerűségért elhagyom a for ciklust de ettől még kell
RenderQuad();
EndPass();
End();
EndScene();
Z bekapcs;
Present();
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
Jól tudom, hogy a bloom csak az objetumon belül látszik, a glow, pedig azon kívül is (tehát a bloom az objektumon lévő textúra színeit erősíti, a glow meg fénylővé teszi)? Ez így elég fapados megfogalmazás volt, de asszem érthető a kérdés...
A Bloom is meg a Glow is látszik az objektumon kívül is annyi a különbséghogy Glownál az objektum konstans saját színében izzik míg Bloomnál a fénytől izzik az objektum (a Bloom egy gyengített HDR, csak a luminance calc. hiányzik belőle).
Reality is almost always wrong. - House
|
|
|
Jól tudom, hogy a bloom csak az objetumon belül látszik, a glow, pedig azon kívül is (tehát a bloom az objektumon lévő textúra színeit erősíti, a glow meg fénylővé teszi)? Ez így elég fapados megfogalmazás volt, de asszem érthető a kérdés...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Ezt azért kérdezem, mert egyelőre itt járok, de hiányzik az a fényeffectus, ami nem csak az objektumon belül szokott lenni, hanem kívül is. Vagy ez egy jó végeredmény? Ha igen, akkor ez most melyik effect  ?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Mivel sikerült megoldanom ezt a textúrás meg surface-es problémát, jó lenne tisztázni, hogy pontosan milyen lépések kellenek a glow/bloom (már azt se tudom melyik, úgy össze vagyok kavarva) effecthez. Ez így jó? :
1. Két surface deklarálása (globálisként, vagy elég lokálisként a Render fgv-ben?)
2. Mátrix beállítás (world, view, proj)
3. device.Clear(..) + RenderStates.ZEnable = true
4. BeginScene() - EndScene() közé a kirajzolás (ha ezt egy textúrázó effect csinálja, kell a device.SetTexture()?)
5. Texture rendertargettexure = new Texture(dev, dev.DisplayMode.Width, dev.DisplayMode.Height, 1, Usage.RenderTarget, Format.X8R8G8B8,
Pool.Default)
6. oldrendersurface = dev.GetRenderTarget(0)
7. rendersurface = rendertargettexure.GetSurfaceLevel(0)
8. dev.StretchRectangle(oldrendersurface, renderrect, rendersurface, renderrect, TextureFilter.None) //renderrect a Rectangle, mert a null-t valamiért nekem nem fogadja el
9. dev.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
System.Drawing.Color.FromArgb(0, 0, 0), 1.0f, 0) + dev.SetRenderState(RenderStates.ZEnable, true);
10. BeginScene() után az effectes kirajzolás, ahol az effect.SetValuenak át kell adni a rendertargettexture-t, mint textúrát + az egyéb változókat? Itt, ha megintcsak normál kirajzolásról van szó, kell a dev.SetTexture() a DrawSubset elé?
11. dev.EndScene() + dev.Present();
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
SDK : 2006 február (de már úton van az augusztusi). A .Net-et most töltöttem le úgy 3 hete. Hibakezelés (egyelőre) sehol sincs, így ha vmi hiba van, fel kell jönnie egy messageboxnak, hogy "A progiban hiba volt...", majd ok-ra kattintva kilépés. Egyébként a textúrás dolgot megoldottam, a Managed DX topicban frissítettem a dolgot. Ha megtennéd, hogy megnézed és kitalálunk valamit...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Minden szépen elindul (hibaüzenet nélkül), csak nem látszik a shader-hatás. Ha esetleg valakinek van ATI kártyája (ha pont x1300xt az még jobb ), esetleg elküldhetem neki a progit, és ha jelentkezett a hiba, csinál egy screenshotot, és mindenki látni fogja, hogy mi történt. Az alul megadott linken látszik, h a 6600GT-n hogy néz ki a dolog (elvileg ez a jó eredmény...).
És egyik fv sem dob semmit ami a shaderek körül dolgozik? Itt nem feltétlen hibaüzenetre meg hibával kifagyásra gondolok hanem pl egyszerű lekezelt exception-re mondjuk. A másik meg hogy melyik SDK-val van fordítva a progi (hónap+év)?
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
Megnéztem a PostProcess cikkedet. Sajnos C#-on belül valamiért nem műkszik a Stretch és a texture.GetSurfaceLevel(0)!!! Mindig elszáll vmi hibával a progi. Erre van ötlete valakinek?
Olyan nincs hogy nem működik, egyértelmű hogy a textúrával van valami elcseszve. Az elszáll itt konkrétan az jelenti hogy kihal a desktopra? Ha igen akkor debug fordítással nem próbáltad még megkeresni a hibát?
Reality is almost always wrong. - House
|
|
|
Cseles a gmail és észreveszi  (már próbáltam)...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
|
Most már végülis mind1, mert nem freemail  . Viszont a .Net mindemképp kell a fordításhoz, mert az exe-t le kell törölnöm, mert exe-t nem küld a gmail (vagy átnevezem, és akkor csak az exe, és a sok-sok resource megy, így megsprórolunk néhány byte-ot  )...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
A Freemail-cím összesen 25 MB adatot tud tárolni, egyszerre egy fájl mérete (amit küldesz) 5 MB lehet.
|
|
|
|
Oooopszzz....  így elsőre freemail-nek tűnt... Viszont a progihoz VS2005C# kell. Remélem ez nem gond?!
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Nem tudom, hogy tud a freemail fogadni 5mb adatot, de ha megnézed a mailcímem, nem is freemail hanem FIBERMAIL, nagy különbség.  Oks, akkor holnap.
|
|
|
KergeDelfin : tud fogadni a freemail 5mb adatot  ? Én úgy tudom, h nem...Holnap majd elküldöm, mert most nincs nálam (kellett a hely az augusztusi sdk-nak  )...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Minden szépen elindul (hibaüzenet nélkül), csak nem látszik a shader-hatás. Ha esetleg valakinek van ATI kártyája (ha pont x1300xt az még jobb ), esetleg elküldhetem neki a progit, és ha jelentkezett a hiba, csinál egy screenshotot, és mindenki látni fogja, hogy mi történt. Az alul megadott linken látszik, h a 6600GT-n hogy néz ki a dolog (elvileg ez a jó eredmény...).
Nekem egy radeon9600pro-m van, ha átdobod, megnézném.
msnm: flipper@fibermail.hu, este leszek elérhető.
Nálam hasonló probléma lépett fel glsl-el fordított irányban. (a saját kártyámon ment, Gef6600-on nem)
|
|
|
Megnéztem a PostProcess cikkedet. Sajnos C#-on belül valamiért nem műkszik a Stretch és a texture.GetSurfaceLevel(0)!!! Mindig elszáll vmi hibával a progi. Erre van ötlete valakinek?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Minden szépen elindul (hibaüzenet nélkül), csak nem látszik a shader-hatás. Ha esetleg valakinek van ATI kártyája (ha pont x1300xt az még jobb  ), esetleg elküldhetem neki a progit, és ha jelentkezett a hiba, csinál egy screenshotot, és mindenki látni fogja, hogy mi történt. Az alul megadott linken látszik, h a 6600GT-n hogy néz ki a dolog (elvileg ez a jó eredmény...).
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Technikai kérdés következik : nekem GeForce6600GT karim van, és az eddigi effectelős progikat is csak ezen a gépen próbáltam ki. A napokban viszont egy x1300XT (remélem jól írtam a típust)karin akartuk megnézni a progit, és sem a normal mapping nem volt észrevehető, sem pedig a vízfelszín nem jelent meg(ezt akartuk tesztelni, de se csillogás, se vízfelszín, csak egy-két fehéres csík...). Ezek szerint a HLSL csak GeForce kártyákon műkszik hibátlanul, és az ATI-kon nem? Esetleg az utasításkészlet nem egyezik meg teljesen, és ATI-hoz más utasításokat kellene használni (mondjuk ebben az esetben vmi hibával el kellett volna szállnia a proginak, nem?)?
Ilyesmi nincs, a HLSL szabvány szerinti nyelv és a Shader Model-ek is szabványok, nem különböznek sehol sem. Semmi hibát nem dob renderelésnél vagy valami ilyesmi? RefRast-al működik?
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
Így többszöri átolvasás után megértettem, hogy ugyanezt csinálom én is...De ha az 1-es opció a nyerő, akkor kell egy külső ciklus, ami végigmegy az összes effectelendő mesh-en, nem? Valahogy így :
Kód: effect.Technique = "..."; // "..." = a tech. neve, de ez most lényegtelen
int passes = effect.Begin(0);
effect.SetValue(...); //ide jönnek azok, amik nem változnak
...
for(int i=0;i<meshlist.Count;i++) //meshlist most pl egy arraylist a mesh-ek számára
{
effect.SetValue(...); //ide jönnek azok, amik változnak
for(int j=0;j<passes;j++) //minden meshre ráküldjük a passokban található effectet
{
effect.BeginPass(j);
//ide meg jöhet a drawsubset()
effect.EndPass(j);
}
}
effect.End();
Hopp látom multkor elfelejtettem válaszolni (el volt tárolva a memóriámban de ezek szerint nem sokáig  ). Tehát igen ez így lerendereli ugyanazzal a shaderrel az összes mesht. Ez mellé két féle képpen lehet motion blur-t tolni, vagy az oldschool módszerrel hogy rengetegszer újra rendereled a mesheket az előző world matrixokkal és minél öregebb a mátrix annál átlátszóbbá teszed a renderelt mesht. Eléggé favágó módszer. Vagy használod a postprocessing előnyeit, itt újra két választás van: vagy azt csinálod meg ami az SDK-ban Pixel Motion blur néven fut vagy bizonyos számú framet eltárolsz visszamenőleg és ezeket mosod össze.
Reality is almost always wrong. - House
|
|
|
Technikai kérdés következik : nekem GeForce6600GT karim van, és az eddigi effectelős progikat is csak ezen a gépen próbáltam ki. A napokban viszont egy x1300XT (remélem jól írtam a típust)karin akartuk megnézni a progit, és sem a normal mapping nem volt észrevehető, sem pedig a vízfelszín nem jelent meg( ezt akartuk tesztelni, de se csillogás, se vízfelszín, csak egy-két fehéres csík...). Ezek szerint a HLSL csak GeForce kártyákon műkszik hibátlanul, és az ATI-kon nem? Esetleg az utasításkészlet nem egyezik meg teljesen, és ATI-hoz más utasításokat kellene használni (mondjuk ebben az esetben vmi hibával el kellett volna szállnia a proginak, nem?)?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Kösze (TPG-nek is  )! Remélem C#-ra egy az egyben át lehet ültetni...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Köv. kérdés : hogyan lehet real-time elérni a lerenderelt "képet", mint "textúrát"? Feltételezem nem a surfaceloader.save ill. savetostream-mel, ezzel ugyanis egy képet lehet lementeni (mint ahogy azt a screenshot-nál is használom), és igényeimhez sajnos baromi lassú. Én ugyanis azt szeretném elérni, hogy amikor megtörtént/megtörténik a renderelés, a kész képet szeretném manipulálni, majd az eredményt megjeleníteni a képernyőn. Tehát valahogy így : backbufferből kinyerni a képet, manipulálni a képet, majd azt visszaírni a backbufferbe (esetleg rögtön a frontba, bár asszem ezért van a device.Present()...). Remélem érthető volt a kérdésem. Hangsúlyoznám, hogy nem a screenshot miatt kell, mert az már megvan, de ide sajnos ez lassú, mert egy jpg-t is kb 1,5-2 mp alatt csinál meg, én pedig szeretném az eddigi legalább 200fps-t fenntartani, ezért gondoltam, hogy valami real-time manipuláció segítene!
Ajánlom figyelmedbe TheProGamer cikkét a PostProcessingről, abban (már ha még jól emlékszem a cikk tartalmára  ) megtalálod a megfelelő választ a kérdésedre!
|
|
|
Köv. kérdés : hogyan lehet real-time elérni a lerenderelt "képet", mint "textúrát"? Feltételezem nem a surfaceloader.save ill. savetostream-mel, ezzel ugyanis egy képet lehet lementeni (mint ahogy azt a screenshot-nál is használom), és igényeimhez sajnos baromi lassú. Én ugyanis azt szeretném elérni, hogy amikor megtörtént/megtörténik a renderelés, a kész képet szeretném manipulálni, majd az eredményt megjeleníteni a képernyőn. Tehát valahogy így : backbufferből kinyerni a képet, manipulálni a képet, majd azt visszaírni a backbufferbe (esetleg rögtön a frontba, bár asszem ezért van a device.Present()...). Remélem érthető volt a kérdésem. Hangsúlyoznám, hogy nem a screenshot miatt kell, mert az már megvan, de ide sajnos ez lassú, mert egy jpg-t is kb 1,5-2 mp alatt csinál meg, én pedig szeretném az eddigi legalább 200fps-t fenntartani, ezért gondoltam, hogy valami real-time manipuláció segítene!
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Így többszöri átolvasás után megértettem, hogy ugyanezt csinálom én is...De ha az 1-es opció a nyerő, akkor kell egy külső ciklus, ami végigmegy az összes effectelendő mesh-en, nem? Valahogy így :
Kód: effect.Technique = "..."; // "..." = a tech. neve, de ez most lényegtelen
int passes = effect.Begin(0);
effect.SetValue(...); //ide jönnek azok, amik nem változnak
...
for(int i=0;i<meshlist.Count;i++) //meshlist most pl egy arraylist a mesh-ek számára
{
effect.SetValue(...); //ide jönnek azok, amik változnak
for(int j=0;j<passes;j++) //minden meshre ráküldjük a passokban található effectet
{
effect.BeginPass(j);
//ide meg jöhet a drawsubset()
effect.EndPass(j);
}
}
effect.End();
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Ezek szerint nem minden effecttípust lehet egyszerre használni olyan formában, ahogy az 1. pontban leírtam?
Ill. a C# kód hogy néz ki több effect esetén?
1.
...
effect beállítások (SetValue, BeginPass(),...)
majd jöhet a mesh drawsubset-je
effect pass, és effect lezárás
És ezt annyiszor ismételni, ahány mesh van (azaz ciklikusan!) Vagy :
2.
effect1 beállítások (SetValue, BeginPass(),...)
effect2 beállítások (SetValue, BeginPass(),...)
...
effectn beállítások (SetValue, BeginPass(),...)
majd jöhet az összes mesh drawsubset-je
effect1 pass, és effect1 lezárás
effect2 pass, és effect2 lezárás
...
effectn pass, és effectn lezárás
Remélem ez most nem csak a számomra érthető ...
A második opcióval nem érdemes foglalkozni. Az első meg valahog úgy néz ki de leírom pontosan hogy megy:
Begin, ennek elmented a visszatérési értékét
SetValue, azon értékek beállítása amik nem változnak a passok közben
for ciklus -> for (int i = 0; i < passes; i++) ->passes a Begin által vissza adott érték
SetValue, azon értékek beállítása amik passok közben változnak
BeginPass
DrawSubset
EndPass
for ciklus zárása
End
Remélem nem csesztem el semmit a leírás során de megeshet
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
Ezek szerint nem minden effecttípust lehet egyszerre használni olyan formában, ahogy az 1. pontban leírtam?
Mindenfélét lehet ami ugyanazon dolgozik. Viszont míg a Normal mapping a modellen dolgozik addig a motion blur a már kész renderelt képen tehát abszolút más renderelési szakaszban dolgoznak.
Reality is almost always wrong. - House
|
|
|
Ezek szerint nem minden effecttípust lehet egyszerre használni olyan formában, ahogy az 1. pontban leírtam?
Ill. a C# kód hogy néz ki több effect esetén?
1.
...
effect beállítások (SetValue, BeginPass(),...)
majd jöhet a mesh drawsubset-je
effect pass, és effect lezárás
És ezt annyiszor ismételni, ahány mesh van (azaz ciklikusan!) Vagy :
2.
effect1 beállítások (SetValue, BeginPass(),...)
effect2 beállítások (SetValue, BeginPass(),...)
...
effectn beállítások (SetValue, BeginPass(),...)
majd jöhet az összes mesh drawsubset-je
effect1 pass, és effect1 lezárás
effect2 pass, és effect2 lezárás
...
effectn pass, és effectn lezárás
Remélem ez most nem csak a számomra érthető  ...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Bár az eddigi problémáim még nem oldódtak meg, azért csak kérdezek mást is, hátha azzal sikerrel járok. Kérdésem : hogy lehet egyszerre kétféle effectet használni (pl egy normalmappinget és egy motion blurt, csak hogy nevén nevezzük a két konkrét effectet )? A következőket már próbáltam :
- 1 .fx file, benne egy technique két pass-al, első pass-ban vertexshader+normalmap pixelshader, a másodikban pedig a motion blur pixelshader
-1 .fx file, benne két technique egy-egy pass-al, első tech. vertexshader+normalmap pixelshader, a másodikban pedig a motion blur pixelshader (megnéztem úgy is, hogy mellé tettem mégegyszer a vertexshadert)
- 2 .fx file, bennük egy technique egy pass-al, első fileban vertexshader+normalmap pixelshader, a másodikban pedig a vertexsahder+motion blur pixelshader.
Ha ezek valamelyike jó, akkor már a C# kódban szúrtam el valamit...Ötletek, lehetőségek?
Az első lenne ilyenkor a hatásos viszont neked nem ez kell. A motion blur post-process effect kivéve ha Geometry Shader-el csinálod de gondolom nem.
Szerk: a Normal mappinges problémára egyenlőre nem tudok mondani semmit, nem is teljesen látom át a kódot de asszem írok egy ilyen shadert én is és ott kipróbálom a hibalehetőségeket.
Reality is almost always wrong. - House
|
|
|
Bár az eddigi problémáim még nem oldódtak meg, azért csak kérdezek mást is, hátha azzal sikerrel járok. Kérdésem : hogy lehet egyszerre kétféle effectet használni (pl egy normalmappinget és egy motion blurt, csak hogy nevén nevezzük a két konkrét effectet  )? A következőket már próbáltam :
- 1 .fx file, benne egy technique két pass-al, első pass-ban vertexshader+normalmap pixelshader, a másodikban pedig a motion blur pixelshader
-1 .fx file, benne két technique egy-egy pass-al, első tech. vertexshader+normalmap pixelshader, a másodikban pedig a motion blur pixelshader (megnéztem úgy is, hogy mellé tettem mégegyszer a vertexshadert)
- 2 .fx file, bennük egy technique egy pass-al, első fileban vertexshader+normalmap pixelshader, a másodikban pedig a vertexsahder+motion blur pixelshader.
Ha ezek valamelyike jó, akkor már a C# kódban szúrtam el valamit...Ötletek, lehetőségek?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Megnéztem +-al és *-al is, de egyik sem a várt eredményt adja. Ötletek?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Normalizálni kellene miután a két normal map értéket összeadtad. Ha két normál vektort összeadsz az eredmény vektornak már nem 1 lesz a hossza. Egyébként még soha nem láttam olyan hogy egy objektumhoz két normal map tartozott. A másik dolog: minek szorzod 1-el a normal értékeket? Az 1-el szorzás felesleges művelet meg amúgyis 2-vel szokták.
Reality is almost always wrong. - House
|
|
|
Nézd már meg ezt, plíz : csúúúúúnya! Asszem nem így kéne kinéznie... Behúzom a teljes shader kódot, mert lehet, hogy csak vmit rosszul írtam, de én tényleg nem látom, h mi a hiba. Elvileg ez egy normal mappinges dolog lenne, ami egy textúra esetén működik is.
Kód: texture meshtexture1;
texture meshtexture2;
texture meshtexture1N;
texture meshtexture2N;
float4x4 ModelWorld;
float4x4 ModelViewProj;
float4 LightPos;
sampler MeshTextureSampler1 =
sampler_state
{
Texture = <meshtexture1>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler MeshTextureSampler2 =
sampler_state
{
Texture = <meshtexture2>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler MeshTextureSampler1N =
sampler_state
{
Texture = <meshtexture1N>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler MeshTextureSampler2N =
sampler_state
{
Texture = <meshtexture2N>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
struct a2v
{
float4 Position : POSITION0;
float3 Normal : NORMAL;
float2 Texcoord0 : TEXCOORD0;
float2 Texcoord1 : TEXCOORD1;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
};
struct v2p
{
float4 Position : POSITION0;
float2 Texcoord0 : TEXCOORD0;
float2 Texcoord1 : TEXCOORD1;
float3 LightVec : TEXCOORD2;
float Att : TEXCOORD3;
float3 vHalf : TEXCOORD4;
};
struct p2f
{
float4 Color : COLOR0;
};
void vs(in a2v IN, out v2p OUT)
{
OUT.Position = mul(IN.Position, mul(ModelWorld, ModelViewProj));
float4 posWorld = mul(IN.Position, ModelWorld);
float3 light = normalize(LightPos - posWorld);
float3 eye = normalize(posWorld - light);
float3 vHalf = normalize(eye - LightPos);
float3x3 TBNMatrix = float3x3(IN.Tangent, IN.Binormal, IN.Normal);
OUT.LightVec = mul(TBNMatrix, light);
OUT.vHalf = mul(TBNMatrix, vHalf);
OUT.Att = 1.0f/( 1.0f + ( 0.005f * distance(LightPos.xyz, posWorld) ) );
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord1;
}
void ps(in v2p IN, out p2f OUT)
{
float4 color = tex2D(MeshTextureSampler1, IN.Texcoord0) +
tex2D(MeshTextureSampler2, IN.Texcoord1);
float3 normal = (1.0f * tex2D(MeshTextureSampler1N, IN.Texcoord0).rgb - 1.0f) +
(1.0f * tex2D(MeshTextureSampler2N, IN.Texcoord1).rgb - 1.0f);
float3 light = normalize(IN.LightVec);
float3 vHalf = normalize(IN.vHalf);
float diffuse = saturate(dot(normal, light));
float specular = pow(dot( normal, IN.vHalf) , 16);
float dsColor = 2.0 * (diffuse * specular) + 1.0;
OUT.Color = IN.Att * color * dsColor;
}
technique RenderScene_v2_0
{
pass P0
{
vertexshader = compile vs_2_0 vs();
pixelshader = compile ps_2_0 ps();
}
}
technique RenderScene_v3_0
{
pass P0
{
vertexshader = compile vs_3_0 vs();
pixelshader = compile ps_3_0 ps();
}
}
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Megnéztem...Biztos, h így kell ezt csinálni?
Kód: OUT.Color = tex2D(MeshTextureSampler0, IN.Texcoord0) +
tex2D(MeshTextureSampler1, IN.Texcoord1);
Mert ez nem azt csinálja, amit kellene (vagy én szúrtam el vhol vmit...).
Ha a két textúrához két külön texcoord tartozik a mesh-nél igen ez az egyik módszer. De két textúra értékét milliónyi módszerrel lehet keverni, ez az egyik. Lehetne a két mintát szorozni, kivonni, osztani stb a DXSDK-ban egy rakás módszert onnan ki tudod választani a mgefelelőt. De a két leggyakoribb módszer a minták összeadása és szorzása.
Reality is almost always wrong. - House
|
|
|
Megnéztem...Biztos, h így kell ezt csinálni?
Kód: OUT.Color = tex2D(MeshTextureSampler0, IN.Texcoord0) +
tex2D(MeshTextureSampler1, IN.Texcoord1);
Mert ez nem azt csinálja, amit kellene (vagy én szúrtam el vhol vmit...).
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Idézet kuzanth :
Köv. kérdés : És mi van akkor, ha nem tudod, hogy hány textúrával kell dolgoznod?
Maximálod a textúrák számát mondjuk 8-ban, csinálsz hozzá samplereket és csinálsz 8 shadert 8 technique-val. Az első shader és a hozzá tartózó tec 1 texre működik, a második kettőre a harmadik háromra stb egészen nyolcig.
Reality is almost always wrong. - House
|
|
|
Kód: float4x4 ModelWorld;
texture texture0;
texture texture1;
sampler MeshTextureSampler0 =
sampler_state
{
Texture = <texture0>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler MeshTextureSampler1 =
sampler_state
{
Texture = <texture1>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
struct a2v
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0;
float2 Texcoord1 : TEXCOORD1;
};
struct v2p
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0;
float2 Texcoord1 : TEXCOORD1;
};
struct p2f
{
float4 Color : COLOR0;
};
void vs( in a2v IN, out v2p OUT )
{
OUT.Position = mul(IN.Position, ModelWorld);
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord1;
}
void ps(in v2p IN, out p2f OUT)
{
OUT.Color = tex2D(MeshTextureSampler0, IN.Texcoord0) +
tex2D(MeshTextureSampler1, IN.Texcoord1);
}
Tehát valahogy így? A hangsúly végülis a pixelshaderen van, mert a többit tk. ugyanúgy csináltam. Bár a ps-ben én float4-et használok, de ez nem okoz gondot asszem.
Köv. kérdés : És mi van akkor, ha nem tudod, hogy hány textúrával kell dolgoznod?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Kód: texture ATex;
texture BTex;
float4x4 WVP;
sampler2D ATexSamp = sampler_state
{
texture = <ATex>;
MinFilter=linear;
MagFilter=linear;
MipFilter=linear;
};
sampler2D BTexSamp = sampler_state
{
texture = <BTex>;
MinFilter=linear;
MagFilter=linear;
MipFilter=linear;
};
struct VertexInput
{
float4 Pos : POSITION;
float2 Tex0 : TEXCOORD0;
float2 Tex1 : TEXCOORD1;
};
struct VertexOutput {
float4 PositionOut : POSITION;
float2 Tex0Out: TEXCOORD0;
float2 Tex1Out: TEXCOORD1;
};
VertexOutput VS_Transform(VertexInput IN)
{
VertexOutput OUT;
OUT.PositionOut = mul(IN.Pos,WVP);
OUT.Tex0Out = IN.Tex0;
OUT.Tex1Out = IN.Tex1;
return OUT;
}
float4 PS_SampleTexture(VertexOutput IN) : COLOR0
{
float3 Output = {0.0f,0.0f,0.0f};
Output = tex2D(ATexSamp,IN.Tex0Out) + tex2D(BTexSamp ,IN.Tex1Out);
return float4(Output,1.0f);
}
technique Tec
{
pass p0
{
VertexShader = compile vs_1_1 VS_Transform();
PixelShader = compile ps_1_1 PS_SampleTexture();
}
}
Ennek elvileg működnie kell. A kód feltételezi hogy a két texhez két külön textúrakoordináta tartozik.
Reality is almost always wrong. - House
|
|
|
Idézet kuzanth :
És már itt is van a következő kérdés, amit eddig a 3DStudio topicban tárgyaltunk :
Ha egy modellnek több diffuse textúrája is van, azokra hogyan kell hivatkozni a shaderben, mert az alábbi megoldás úgy látszik nem jó :
Kód: struct a2v
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0; //elvileg mindig ez az 1. diffuse textúra, amivel nincs is baj
float2 Texcoord1 : TEXCOORD1; //de ezt már nem fogadja el, mert csak sima material színe lesz a modellnek
};
struct v2p
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0; //ez a kettő ugyanaz, mint előbb
float2 Texcoord1 : TEXCOORD1;
};
A vertex shaderben pedig :
Kód: void vs( in a2v IN, out v2p OUT )
{
OUT.Position = mul(IN.Position, ModelWorld); //ez most lényegtelen
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord1;
}
Ha a vs-ben mind a két helyre IN.Texcoord0-t írok, akkor ugyan csak az első textúrával, de jól jelenik meg a modell, de ha így írom, mint itt fent, akkor a modellnek ilyen érdekes sárgás-barnás színe lesz. Mi lenne a jó megoldás?
A két külön textúrához meg van a két külön sampler? És külön textúrakoordináta tartozik vertexenként a textúrákhoz? Van Pixel Shader rész is vagy csak Vertex Shader üzemel? Hogy néz ki a Pixel Shder kódja?
Reality is almost always wrong. - House
|
|
|
Ez a megoldás, amit mindketten írtunk, miszerint :
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord0;
csak az egyik textúrát rakja rá a modellekre (és ez az ami zavar, mert mindkét kockára rárakja). Ez már csak azért is fura, mert ha ez tényleg csak az első koordot használja, akkor a második kockán elvileg nem lehetne semmilyen textúra!!! Egyébként érthető a problémám, vagy próbáljam részletezni?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
nem tom te írtad
|
|
|
Az .x fileban elvileg két textúrakoordináta is van (gondolom ez a két diffuse texkoord.), tehát elvileg úgy kellene írni, ahogy leírtam. Lehet, h csak az a probléma, hogy erre a progim nagyívből ..... és csak 1 texkoordot küld át? De akkor hogy kell előcsalni a másikat  ???
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
nah bár én nem vagyok mestere a dolognak de TEXCOORD1 a 2. texcoordlenne a vertexhez
namármost nagyon vszínű hogy csak egy 1 texcoordot küldesz át vagyis a jó megoldás:
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord0;
|
|
|
És már itt is van a következő kérdés, amit eddig a 3DStudio topicban tárgyaltunk :
Ha egy modellnek több diffuse textúrája is van, azokra hogyan kell hivatkozni a shaderben, mert az alábbi megoldás úgy látszik nem jó :
Kód: struct a2v
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0; //elvileg mindig ez az 1. diffuse textúra, amivel nincs is baj
float2 Texcoord1 : TEXCOORD1; //de ezt már nem fogadja el, mert csak sima material színe lesz a modellnek
};
struct v2p
{
float4 Position : POSITION;
float2 Texcoord0 : TEXCOORD0; //ez a kettő ugyanaz, mint előbb
float2 Texcoord1 : TEXCOORD1;
};
A vertex shaderben pedig :
Kód: void vs( in a2v IN, out v2p OUT )
{
OUT.Position = mul(IN.Position, ModelWorld); //ez most lényegtelen
OUT.Texcoord0 = IN.Texcoord0;
OUT.Texcoord1 = IN.Texcoord1;
}
Ha a vs-ben mind a két helyre IN.Texcoord0-t írok, akkor ugyan csak az első textúrával, de jól jelenik meg a modell, de ha így írom, mint itt fent, akkor a modellnek ilyen érdekes sárgás-barnás színe lesz. Mi lenne a jó megoldás?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Leteszteltem azt az előbb említett 'null'-os dolgot, de még azt is megpróbáltam, hogy nem létező textúrát próbáltam átadni. Természetesen egyik sem sikerült, így várom továbbra is a segítségeket!
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Nos? Valaki?
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
Már sikerült megírnom egy működő textúrázó shadert, viszont felmerült az a kérdés, hogy ha egy objectnek több textúrája is van, azt általánosan hogy szokás lekezelni? Feltételezem nem kell megírni 85 samplert, aztán ahol nincs textúra ott Null-t átadni, hanem biztos van erre vmi frappáns megoldás...? Avagy minden egyes objectnek külön shadert kell írni  ? Gondolom nem, mert érdekes lenne egy RPG játékban a kismillió object mellett ugyanennyi shader  ...
A memóriám már nem a régi. És ráadásul még a memóriám sem a régi...
Az élet attól szép, hogy bármi megtörténhet. És attól szar, hogy meg is történik...
Ha az egyik szinkronúszó megfullad, mit csinál a többi???
|
|
|
effect.SetValue("SceneTexture", meshTexture);
effect.CommitChanges();
ahol effect = Effect class
SceneTexture a shaderben textura változó
meshTexture = texture object
|
|
|
Legújabb project:
Smashed Potatoes
Legutóbb frissített project:
Smashed Potatoes
Friss kép a galériából:
|