Recensubs HQ

Inverse Kernel Resize and you, Tutto quello che hai sempre voluto sapere ma non hai mai osato chiedere

« Older   Newer »
  Share  
view post Posted on 3/2/2013, 04:12     +1   -1
Avatar

Snobbery Inside

Group:
Utente abilitato
Posts:
2,197
Reputation:
+1,005
Location:
Favolandia

Status:


Premessa, se non siete encoder o non volete tutta la pappardella iniziale scrollate pure fino alle conclusioni.

Bene, detto questo è utile dare una definizione di quello che si intende con inversione del kernel, e lascio la parola all'autore di dither, uno dei plugin di cui ormai nessuno può evitare l'utilizzo (se non lo usate e/o non sapete l'inglese saltate alle conclusioni o chiudere il topic, il tutto evidentemente non fa per voi)
Inverting the kernel allows to “undo” a previous upsizing by compensating the loss in high frequencies, giving a sharper and more accurate output than classic kernels, closer to the original.

Ok, la base è quella, dovendo essere più espliciti la tecnica nasce da un problema onnipresente parlando di full hd, ovvero che il materiale non è realmente 1080p ma spesso ad una risoluzione inferiore (480, 540 o 720 di solito), questo potrebbe anche essere accettabile, il vero problema però è il modo in cui gli anime vengono quasi sempre portati a 1080p, ovvero attraverso un resize bilineare, che blurra da matti perdendo parecchia nitidezza (le altre frequenze di cui si parlava sopra).
Ridimensionare alla risoluzione originale aiuta a non rilasciare un file mastodontico e blurratissimo, ma non compensa la perdita originale.
Proprio per questo sono nate le tecniche di inversione del kernel, che sono incluse in due plugin per avisynth, dither e debilinear.

Senza troppo perderci in inutili chiacchere posto 3 immagini, ognuna ridimensionata a 1280x720 con un metodo diverso
Blackman4taps
Dither16_invks_bilinear
Debilinear

Apritele ognuna in una scheda diversa, potrete vedere da soli la differenza tra i vari metodi.
In particolare tra debilinear e blackman c'è una differenza di dettaglio veramente evidente (e anche una differenza di filesize, la maggiore nitidezza infatti incide in modo sfavorevole da questo punto di vista, e potete aspettarvi anche un aumento di bitrate richiesto del 20%).
Tra dither16 e debilinear la differenza invece è meno evidente (il secondo però dovrebbe apparirvi leggermente più nitido).
La differenza tra i due è semplice, debilinear è l'inversione perfetta di un BilinearResize di avisynth, l'invks invece usa un algoritmo diverso, che ha più parametri di controllo ma che, a conti fatti, restituisce un'immagine meno nitida ma anche meno priva di artefatti.
E debilinear, proprio per come è stato progettato, è molto più facile che li crei. Scordatevi infatti il crop e scordatevi una resa accettabile nel caso ci siano dettagli superiori a quelli della risoluzione finale.

E proprio i dettagli a risoluzione superiori rispetto a quella finale sono il vero problema del metodo, il chroma, i crediti, le scritte a schermo, i titoli, tutti queste parti possono contenere dettaglio che mal si sposa con i metodi di inversione del kernel, soprattutto debilinear.
Per il chroma non è un grosso problema, si può fare 444 o accontentarsi di un normale resize, tutto il resto fino a ieri richiedeva l'utilizzo di dither16 tappandosi il naso.
Da oggi invece non è più così perché c'è una bella funzioncina che dovrebbe aiutare a maskare i dettagli e permettere un merge salvifico.
La parola alle immagini
Blackman
DebilinearNotMasked
DebilinearMasked



Direi che si commentano da sole.
La funzione
CODICE
#masking detail v0.1a
function MaskDetail(clip clp, int final_width, int final_height, int "RGmode", int "cutoff", float "gain", int "expandN", int "inflateN", bool "blur_more", float "src_left", float "src_top", float "src_width", float "src_height")
{
RGmode = default( RGmode,  3)  # spatial filter to remove false positive (noise, compression artifact and so on) , this is its mode
cutoff = default( cutoff,  70 ) # exclude from the mask the pixel with less than this value
gain = default( gain,  0.75 ) # increase the value of the remaining pixel
expandN = default( expandN,  2 ) # how many mt_expand
inflateN = default( inflateN,  1 ) #how many mt_inflate
blur_more = default( blur_more,  false ) #additional blur after resize
src_left= default( src_left,  0 )
src_top = default( src_top,  0 )
src_width = default( src_width,  0 )
src_height = default( src_height,  0 )
CUT   = string(cutoff)
GAN = string(gain)

diff=mt_makediff(clp,clp.debilinearY(final_width,final_height).bilinearresize(clp.width(),clp.height()),u=1,v=1)
initial_mask = diff.histogram("luma").Removegrain(RGmode,-1).mt_lut("x "+CUT+" < 0 x "+GAN+" 256 x + 256 / * * ?",u=1,v=1)
expanded = initial_mask.expandMask(expandN)
inflated = expanded.inflateMask(inflateN)
final = blur_more ? inflated.BilinearResize(final_width, final_height, src_left, src_top, src_width, src_height).Removegrain(12,-1) : inflated.BilinearResize(final_width, final_height, src_left, src_top, src_width, src_height)
return final.Greyscale()
}

function expandMask(clip clp, int "expandN")
{
return expandN > 0 ? expandMask(clp.mt_expand(u=1,v=1), expandN - 1) : clp
}
function inflateMask(clip clp, int "inflateN")
{
return inflateN > 0 ? inflateMask(clp.mt_inflate(u=1,v=1), inflateN - 1) : clp
}


Per chi è a digiuno di reverse polish notation il lut fa x < cutoff ? 0 : x * gain * (256+x) / 256
Il resto si capisce anche dando una rapida lettura.
Ovviamente è una funzione da tweakare in base alle esigenze e a quanto si voglia una mask precisa (in questo caso è molto importante anche cosa si sceglie come metodo di removegrain)

Come test il tutto è stato applicato ai blu-ray di one off, che sono stati il motivo principale che mi hanno spinto a completare questa funzione, però il campo di applicazione non è affatto limitato ai blu-ray, ad esempio la funzione mi è tornata molto utile per lo scrolling text di Vividred Operation
Dither_invks_puro
Dither_invks_maskato

Decisamente meglio.

Ok, dopo questa introduzione lunghissima è arrivato il momento di qualche snippet di codice.
Con One Off ho usato
CODICE
mask = MaskDetail(last,1280,720,expandN=2,inflateN=1,RGmode=3,cutoff=70,gain=0.8,blur_more=true)
Dither_convert_8_to_16()
big=last
DebilinearY(1280,720,lsb_inout=true)
noalias=big.Dither_resize16(1280,720,kernel="blackmanminlobe", taps=5)
masked = Dither_merge16_8(noalias,last, mask.invert(), u=1,v=1)
strange(0,3138,masked)
strange(21069,21235,masked)
strange(40796,0,masked)
MergeChroma(noalias)
#segue codice per output a 10bit

(uso la maschera invertita perché così se tutto il video è da maskare posso fare u=2 e V=2 e risparmiare il mergechroma finale)

Per Vividreddo
CODICE
#mask fatto a mano prima di scrivere la funzione, quindi escluso
Dither_convert_8_to_16()
big=last
Dither_resize16(1280,720,kernel="bilinear", invks=true,y=3, u=1, v=1,src_left=2, src_width=-2)
noalias=big.Dither_resize16(1280,720,kernel="blackmanminlobe", taps=4,src_left=2, src_width=-2,y=3,u=3,v=3)
masked = Dither_merge16_8(noalias,last, mask.invert(), u=1,v=1)
strange(2949,3020,noalias)
strange(792,2949,masked)
strange(17463,18508,masked)
strange(32583,34811,masked) #in realtà dalla 3 in poi ho messo una zona a parte per il "continua", dato che è inutile maskarlo
MergeChroma(noalias)
#segue codice per output a 10bit


La differenza è data soprattutto dalla sorgente, già solo il crop renderebbe sconsigliato Debilinear per Vivid, in più parliamo di una trasmissione tv, dove blocking, scagate varie dell'mpeg2, noise ecc ecc sono all'ordine del giorno.
Invks di dither aiutare a dare più nitidezza e direi che oltre non è saggio spingersi.
E anche invks di solito lo uso con l'opzione invkstaps=4 o meno, sia per bloatare di meno sia per assicurarmi che ci siano meno artefatti (per gli screen ho preferito tornare a settaggi più spinti per illustrare meglio la differenza).

L'altra alternativa sarebbe usare Dither_resize16nr, che è un wrapper intorno a Dither_resize16 (lo si usa allo stesso modo, aggiungendo noring=true) che dovrebbe aiutare a combattere il rining.
Considerato che l'inverse kernel più che altro crea aliasing, e che l'nr non lo rimuove del tutto, direi che l'utilità non è esagerata.
Va bene per avere ancora maggiore sicurezza rispetto al dither invks classico e risparmiare un po' di filesize, ma personalmente non mi convince, ho fatto qualche encode di prova e ho notato un'immagine più piatta, con meno digital noise e quindi a maggiore rischio artefatti (ho provato con Strike Witches S2, che ha della gran fapdigital grain).

Conclusioni aka tl;dr
L'inverse kernel è un ottimo modo per ridare al video quella nitidezza che aveva in origine, ma non è né la panacea di tutti i mali né un settaggio "set and forget".
Per i blu-ray upscalati e la roba su cruncyroll presa bene mi sentirei di consigliarlo nella maggioranza dei casi, nella serie tv solo se avete la sbatta di perdere del gran tempo sul ts, perché l'inverse kernel rende più nitido il video ma molto più evidenti gli errori o le mancanze dell'encoder, insomma, soprattutto per anime d'azione su canali pietosi non è detto che il gioco valga la candela.
È una di quelle cose da valutare da persona a persona e di caso in caso (come, imho, il delogo).
Se siete saltati fin qui dalla prima riga e pensiate che possa valere la pena di tentare, ignorate il codice postato e ripartite dall'ìnizio a leggere.
Se invece questo non fa al caso vostro chiudete pure il topic e infilate la testa tra la sabbia, ma sappiate che personalmente porrei un limite di voto settato a 7 per gli encoding da blu-ray fatti senza inverse kernel.

Spero di essermi ricordato di scrivere un po' tutto. ma nel caso fatemi pure notare cosa ho scordato, o se ho scritto fesserie (i typo/errori vari da 4 di mattina li correggerò io in seguito, segnalate roba di concetto XD).
Ci sarebbero altri punti da toccare (inverse kernel + 444, inverse kernel con fap-upscale a 1080p ecc ecc), ma non ne ho tempo, voglia ed è anche giusto che pure mirkosp e Mad Hatter tirino un po' fuori la paglia dal culo postando script/immagini/opinioni.
 
Web  Top
view post Posted on 3/2/2013, 10:34     +1   -1
Avatar

Distruttore di mercati

Group:
Utente abilitato
Posts:
682
Reputation:
+163
Location:
Aiur

Status:


Provata proprio adesso sulla seconda di vividred usando maskdetail e funziona una meraviglia.
Grazie davvero!

Edited by Liquid Dr4k3 - 3/2/2013, 10:53
 
Top
view post Posted on 3/2/2013, 14:08     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Avrei dovuta scriverla io ma non avevo balle, grazie per avermi risparmiato tempo. :V
 
Web  Top
view post Posted on 4/2/2013, 18:55     +1   -1
Avatar

Apprendista encoder

Group:
Utente abilitato
Posts:
611
Reputation:
+213
Location:
Loli Island

Status:


*si toglie la paglia dal culo*

Se avete letto tutto il malloppone di chibi e la discussione di mirko Vs chibi sul 4:4:4 vi siete già fatti la vostra idea. Ma ora veniamo a parlare di casi particolari. Abbiamo visto che il fare 4:4:4 è idealmente la miglior soluzione possibile per gli anime visto che non sono quasi mai 1080 oppure a 1080 hanno solo qualche elemento/scena/sigle. Tuttavia ci sono anime che pur non essendo 1080 puro, ci si avvicinano molto e addirittura hanno le sigle che sono veramente a 1080, e naturalmente sto parlando dei nuovi show kyoani, personalmente verificato solo hyouka e chu2koi. Prendendo chu2koi abbiamo le sigle a 1080p, mentre l'anime è stato fatto a 955.5p(956p in termini reali, semplicemente hanno croppato prima di upscalare per evitare problemi coi bordi nel BD). Beh quindi facciamo 1700x956 4:4:4!11!1!!!1! Fare i castelli in aria è bello, ma non dobbiamo dimenticare di tenere i piedi per terra ogni tanto. Se già in molti si lamentano di non riuscire a riprodurre 720p hi444pp, in quanti pensate riescano a riprodurre 956p hi444pp? Quasi nessuno sostanzialmente. È vero che in genere bisogna sbattersene, però non è un formato fruibile dalla maggior parte delle persone, e anche per noi è sostanzialmente sconveniente, visto che parliamo di hi444pp per una risoluzione che è vicinissima al 1080p e i tempi di encoding sarebbero lunghissimi. Inoltre non dimentichiamoci che le sigle sono realmente a 1080p. La soluzione più ovvia è quindi quella di rellare a 1080 diretto. Tuttavia col reverse upscale si può fare un tweaking un attimo più intelligente. Se debilinear può infatti annullare l'upscale dimmerda originario, perché non lo annulliamo lì dove necessario e upscalare poi noi con un kernel migliore? Finora la roba migliore per upscalare è sicuramente nnedi3, che però upscala per potenze di 2 e fa centershift, quindi dobbiamo correggere noi tutto ciò:
CODICE
#vostra sorgente#
dither_convert_8_to_16()
o = last
debilinear(1700,956,lsb_inout=true)#ovviamente mettete la res che serve a voi e fate trim per eventuali sezioni 1080p puro
nnedi3_rpow2(2,nns=4,nsize=4,qual=2,pscrn=4)#upscale 2x
Dither_resize16(1920,1080,src_left=-0.5,src_top=-0.5,kernel="spline16",invks=true,invkstaps=4)#invkstaps regolatelo in base all'immagine, dato che potrebbe introdurre artefatti non desiderati, il crop è per correggere il centershift che fa nnedi internamente
Mergechroma(o)#merge del chroma originario
#output a 10-bit#

Con questo script riuscirete ad avere un upscale assai migliore rispetto al classico bilinear che fanno i PR0. Personalmente userò questo script per fare anche varie prove su interi filmati...
avete mai avuto la sensazione che gli fps indicati da x264 non siano quelli effettivi? Beh se avete provato questo script l'avrete sicuramente, visto che x264 vi segnerà 0.00 fps, quando in realtà si parla di 1x10^-19 fps! Minchia la velocità stratosferica! :trollface:
Ora parliamo seriamente, il grande problema di quella chain è nnedi3, che sarà anche buono e tutto ma soffre principalmente di qualche problema:
1. Non mi piace la gestione del grain in tutto il procedimento, che tende a diventare assai più evidente.
2. nnedi è lento, ma proprio lento come la morte
3. nnedi non è 16-bit aware, ciò significa che il video che gli state dando per lui è 1700x1912 8-bit e lo state upscalando 2x(quindi 3400x3824 coi settaggi più lenti e state poi tornando a 1080 con un altro resize, il vostro procio ringrazia.

Quindi riassumendo:

- Se avete un pc uscito fuori dalla nasa e/o volete buttare ore/giorni sull'encode, prego, accomodatevi pure

- Se non volete perdere tutto questo tempo usare opzioni più umane di nnedi(ho usato le più lente appost, :trollface:) e soprattutto usarlo a 8-bit potrebbe fare al caso vostro

- In caso contrario usate un kernel umano da dither_resize16 e upscalate senza nnedi3


NB: State molto attenti a come settate i vari passaggi, in quanto potrebbero risultare in immagini oversharpate(mi riferisco in particolar modo al numero di invkstaps), quindi USATE GLI OCCHI!!11!1!1!!!

P.S: Upperò qualche screen quando mi ritroverò materiale adatto sottomano, visto che si parla di roba >720p, altrimenti ha assai poco senso(discorso simile si può però fare da dvd, senza ovviamente debilinear visto che non c'è nulla da annullare, ma lì ci andrei cauto a causa dei >DVD, >Mpeg-2, >Extreme lowpass).

Edited by Mad_Hatter™ - 4/2/2013, 19:09
 
Top
view post Posted on 4/2/2013, 19:08     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Io la paglia in culo la tengo, però faccio presente che, nel caso illustrato dal mio esimio collega maddo, una volta riportato a 1080, potreste voler sharpare ancora, e per questo specifico caso di sharpening mi sento di suggerire finesharp, sharpener scritto da Didée apposta per gli upscale 720->1080, e parecchio veloce (teoricamente inteso per poter essere usato tranquillamente in playback diretto).

Esempio personale, da "Meloetta no Kirakira Recital" (anime principalmente 720p, ma con alcuni spezzoni a 1080p effettivo):
Sorgente: 1 2
Filtrato: 1 2
Il procedimento qui è stato debilinear a 720 -> nnedi3_rpow2 *2 con cshift bilinearresize -> debilinear a 1080 (invks è solo a 16bit; per semplicità e rapidità ho fatto tutto a 8bit) -> finesharp; giudicate da voi il risultato.
 
Web  Top
view post Posted on 4/2/2013, 19:34     +1   -1

Member

Group:
Utente abilitato
Posts:
968
Reputation:
+161
Location:
Trentino Alto Adige

Status:


Mah... sembrava un thread serio... :hmm:

Beh comunque grazie a Tada per il primo post e a mirkosp per finesharp :D

Per uno come me che è ancora "sotto la linea di galleggiamento" questo botta e risposta che non riesco a decodificare almeno mi ha dato degli spunti per giocare un po' con gli encode.

Grazie.
 
Top
view post Posted on 4/2/2013, 19:54     +1   -1
Avatar

Apprendista encoder

Group:
Utente abilitato
Posts:
611
Reputation:
+213
Location:
Loli Island

Status:


CITAZIONE (rocksel @ 4/2/2013, 19:34) 
Mah... sembrava un thread serio... :hmm:

Beh comunque grazie a Tada per il primo post e a mirkosp per finesharp :D

Per uno come me che è ancora "sotto la linea di galleggiamento" questo botta e risposta che non riesco a decodificare almeno mi ha dato degli spunti per giocare un po' con gli encode.

Grazie.

Mi stai dicendo che non sono serio, vado in un angolino a piangere, :sob:
 
Top
view post Posted on 4/2/2013, 20:23     +1   -1

Member

Group:
Utente abilitato
Posts:
968
Reputation:
+161
Location:
Trentino Alto Adige

Status:


CITAZIONE (Mad_Hatter™ @ 4/2/2013, 19:54) 
Mi stai dicendo che non sono serio, vado in un angolino a piangere, :sob:

:D

Visto che lo sharpening da te e da mirkosp è visto come una delle più grosse bestemmie rivolgibili al dio dell'encode, seconda solo all'upscale e che qui ci sono tutte e due... beh.

In ogni caso, anche come "esempio contrario" è comunque utile.

Grazie anche a te, quindi.
 
Top
view post Posted on 4/2/2013, 20:29     +1   -1
Avatar

Apprendista encoder

Group:
Utente abilitato
Posts:
611
Reputation:
+213
Location:
Loli Island

Status:


CITAZIONE (rocksel @ 4/2/2013, 20:23) 
CITAZIONE (Mad_Hatter™ @ 4/2/2013, 19:54) 
Mi stai dicendo che non sono serio, vado in un angolino a piangere, :sob:

:D

Visto che lo sharpening da te e da mirkosp è visto come una delle più grosse bestemmie rivolgibili al dio dell'encode, seconda solo all'upscale e che qui ci sono tutte e due... beh.

In ogni caso, anche come "esempio contrario" è comunque utile.

Grazie anche a te, quindi.

Mica è vero, lo sharpening e l'upscale a volte servono e sono necessari, uno si incazza se li vede ingiustificati.
 
Top
view post Posted on 4/2/2013, 20:36     +1   -1

Member

Group:
Utente abilitato
Posts:
968
Reputation:
+161
Location:
Trentino Alto Adige

Status:


CITAZIONE (Mad_Hatter™ @ 4/2/2013, 20:29) 
Mica è vero, lo sharpening e l'upscale a volte servono e sono necessari, uno si incazza se li vede ingiustificati.

Ops. Prendo atto, chiedo scusa per l'intervento fuori luogo e ti do il cambio nell'angolino. :(
 
Top
view post Posted on 5/2/2013, 23:27     +1   -1
Avatar

Snobbery Inside

Group:
Utente abilitato
Posts:
2,197
Reputation:
+1,005
Location:
Favolandia

Status:


Ennesima interessante funzioncina

EDIT un anno dopo: No, col cazzo, usate altro, davvero.

CODICE
function MightyUpscale(clip clp, int real_width, int real_height, string "invkernel", int "taps")
{
invkernel = default( invkernel,  "bilinear")  # inverse kernel used in the final sharpening step
taps = default( taps, 5 ) # kernel taps of the final sharpening step
clp.debilineary(real_width, real_height)
turnright()
nnedi3(1, dh=true,U=false,V=false,nsize=0,nns=2)
turnleft()
nnedi3(1, dh=true,U=false,V=false,nsize=0,nns=2)
big=last
Dither_convert_8_to_16().Dither_resize16(clp.width(),clp.height(),kernel=invkernel, invks=true,y=3, u=1, v=1,src_left=-0.5,src_top=-0.5, src_width=big.width(), src_height=big.height(),invkstaps=taps)
#Spline36Resize(1920,1080,-0.5,-0.5,last.width(),last.height())
Mergechroma(clp.Dither_convert_8_to_16())
}


Real_width e real_height sono le dimensioni reali del filmato, invkernel e taps servono per controllare la quantità di sharpening aggiunta nell'ultimo step.
Per fare un esempio sempre con one off
http://screenshotcomparison.com/comparison/6324
Il primo screenshot è quello originario, il secondo è MightyUpscale con 6 taps (risoluzione originaria 1280,720, chiaramente).
A livello di velocità supero tranquillamente i 20fps in caso di risoluzione reale 1280,720, con Hyouka o Chuuni probabilmente si scenderebbe un po', ma ipotizzo che sul pc di Maddo non dovrebbe scendere sotto i 15, che è più che buono per un upscale come dio comanda.
Ah, l'output è 16bit stacked.

Precisazioni:
- debilinear non può essere usato dato che non riesce a fare centershift (per lo meno non con i valori validi per gli altri resize, e non ho voglia né tempo per capire come mai non vada)
- se l'immagine non dovesse essere sufficientemente nitida (ma dubito succeda, per roba a 720 è comunque meglio encodare a 720, per roba a 955.5 o simili il risultato dovrebbe essere decisamente più nitido, e quindi più che sharpare è facile che si debba evitare di esagerare con taps e kernel) si può usare finesharp come suggeriva sp. O accontentarsi, perché in fondo non parliamo di anime a 1080p reali, e ogni sharpening bloata il filesize.
- non avevo la sbatta di parametrizzare nnedi3, forse potrebbe valere la pena di inserire nns e forse nsize, ma poi ho sempre paura che i parametri vengano usati a cazzo e basandosi su sentito dire o leggende metropolitane, visto che a livello visivo l'impatto è quasi nullo.

Edit:
TODO: Incorporare il crop (pre-crop e post-crop + dither16 come downsizer, insomma, 6 parametri in totale)

Edited by Tada no Snob - 25/7/2014, 18:10
 
Web  Top
view post Posted on 6/2/2013, 10:45     +1   -1
Avatar

Distruttore di mercati

Group:
Utente abilitato
Posts:
682
Reputation:
+163
Location:
Aiur

Status:


tutto chiaro, l'unica cosa che non capisco bene è il crop del luma nell'ultimo resize:

src_left=-0.5,src_top=-0.5, src_width=big.width(), src_height=big.height()

se me lo potessi spiegare te ne sarei grato ^^
 
Top
view post Posted on 6/2/2013, 11:15     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Nnedi3 fa un centershift diverso rispetto ai resizer di avisynth, per cui ci vuole uno shift di mezzo pixel da sinistra e dall'alto per ricompensare.
Comunque fare
CODICE
big=last
[...] src_width=big.width(), src_height=big.height()[...]

Non serve, perché facendo direttamente src_width=width, src_height=height, va a prendere i valori del last, che in quel punto coincide ancora con big (e poi big non viene più usato).
 
Web  Top
view post Posted on 6/2/2013, 11:21     +1   -1
Avatar

Distruttore di mercati

Group:
Utente abilitato
Posts:
682
Reputation:
+163
Location:
Aiur

Status:


Il mio dubbio consisteva principalmente nel src_left=-0.5. Considerando che nella prima "colonna" di pixel luma e chroma sono allineati e considerando che si sta facendo turnright->nnedi->turnleft prendendo il field 1 (anzi, essendo dh=true è più preciso dire "avendo la prima riga sopra") in teoria lo shift orizzontale alla fine dei giochi non dovrebbe essere zero?
 
Top
view post Posted on 6/2/2013, 11:50     +1   -1
Avatar

Bimbosp

Group:
Administrator
Posts:
9,780
Reputation:
+929
Location:
Gallarate (VA)

Status:


Lo sta usando due volte nnedi, la prima per raddoppiare in "orizzontale", la seconda per raddoppiare in verticale.
 
Web  Top
28 replies since 3/2/2013, 04:12   5530 views
  Share