Mozna jste si vsimli, ze VMR9 sebou prinasi par problemu. Osobne mi prijde, ze prinasi vic problemu nez resi. Alespon v porovnani s Overlay rendererem v ATi grafikach s AVIVO.
Proto jsem napsal shader do MPC, ktery resi nize popsane problemy. Je na nej potreba SM2.0 grafika s podporou VMR9 renderless modu a lepsi.
1. problem je hloubka barev. RGB rozsah je tady 16-255, oproti 0-255 a tedy cerna neni cerna, ale seda.(minimalni je tedy RGB [16,16,16])
2. problem je spis zalezitost codecu, ale souvisi s nim. Renderuje se do desktop targetu a tedy vetsinou R8G8B8A8 nebo X8R8G8B8, potom dojde k prepocitani bit-depth barev a to ma za nasledek vetsi viditelnosti chyb v barevnych prechodech. V pripade XviD/DivX je to hlavne problem cervene, pripadne modre.
MediaPlayerClassic ve VMR9 Renderless modu umoznuje pouzivat vlastni shadery na zpracovani obrazu.Zkontrolujte si, ze fam funguji spravne.(Nektere prehravace maji neco podobneho jiz v sobe)
Problem c.1: Ukazka problemu. Vsimnete si svetleho pruhu na miste filmu. To neni filmem samotnym, ten je opravdu presne [0,0,0].
S pouzitim tohoto shaderu je vysledek korektni.
2. Resi i tento problem.(ten ovsem nelze odstranit uplne kvuli nizke hloubce barev v XviD/DivX) Bez shaderu. Se shaderem. Vsimnete si zmizeleho/potlaceneho ctvereckovani na cervenych odstinech.
Shader vypada takto:
Do MPC ho muzete vlozit copy-paste zpusobem(nezapomente prekompilovat) a nebo stahnout tento konfiguracni soubor a prehrat jim stavajici, co mate u MPC. Potom spustit film a vybrat v Shaders->VMR9 Haste Shader.Kód:sampler s0 : register(s0); float4 p0 : register(c0); float4 p1 : register(c1); #define width (p0[0]) #define height (p0[1]) #define counter (p0[2]) #define clock (p0[3]) #define one_over_width (p1[0]) #define one_over_height (p1[1]) #define c1 (16.0/255.0) #define c2 (255.0/219.0) #define sharpen_width (0.35) #define val0 (1.5) #define val1 (-0.075) #define PI acos(-1) float4 main(float2 tex : TEXCOORD0) : COLOR { //Depth_Correction float2 YV12fix = ((1.0-sharpen_width)/width, (1.0-sharpen_width)/height); tex+=YV12fix; float dx = sharpen_width/width + YV12fix; float dy = sharpen_width/height + YV12fix; //Sharpen convolution matrix float4 s1 = tex2D(s0, tex + float2(-dx,-dy)) * val1 ; float4 s2 = tex2D(s0, tex + float2(0,-dy)) * val1; float4 s3 = tex2D(s0, tex + float2(-dx,0)) * val1; float4 s4 = tex2D(s0, tex + float2(dx,0)) * val1; float4 s5 = tex2D(s0, tex + float2(0,dy)) * val1; float4 s6 = tex2D(s0, tex + float2(dx,dy)) * val1; float4 s7 = tex2D(s0, tex + float2(-dx,+dy)) * val1; float4 s8 = tex2D(s0, tex + float2(+dx,-dy)) * val1; float4 s9 = tex2D(s0, tex) * val0; float4 c0x = (s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 +s9); // Rescale color depth float4 c0 = (c0x-c1)*c2; //Color output return c0; }
Good Luck
ps. Pokud budete mit nekdo navrhy na lepsi metodu, jak vyresit ono ctvereckovani(tedy nez samplovani subpixelu pri rescalu textury), tak smele do toho. Navrhy jsou vitany.





Odpověď s citací