View Full Version : AviShader Released!
Antitorgo
28th December 2004, 11:06
Since not everyone reads the Avisynth dev forum... From http://forum.doom9.org/showthread.php?s=&threadid=86793
(if cross-posting this one time for release issues is "bad", then mods please slap my wrist) Please keep dev issues on the dev forum thread, and usage issues in this one.
Merry X-Mas everyone:
http://www.blosser.org/d9/dlAviShader01.rar
version 0.1 Alpha
Usage:
clip.ConvertToRGB32().AviShader("effect filename", "technique to use")
Ex:
clip.ConvertToRGB32().AviShader("c:\effect.fx", "Default")
Some limitations are:
- Multipass isn't working yet (It wasn't in CShader either, but I'm 99.9% sure I know the reason)
- You need to convert to RGB32. I'm working on YV12 support, because I don't want to hurt performance. If you leave it in YV12 colorspace, it'll look really funky.
- No temporal support yet, I know how I want to do it though.
- No width/height constant support in the FX files yet, I want to add this so that the filter kernels are more accurate. (Ex: The sharpen kernel is just a guess)
- 900 million other things.
Please, please leave feedback on speeds etc. Plus, I need more ideas on cool filters to write!
State of Mind
31st December 2004, 01:54
I get the impression no one seems interested in this filter, but I admire you for your hard work. What does this filter actually do?
stickboy
31st December 2004, 02:12
... but the development thread has lots of development-related posts that most people won't be interested in.
I agree with State of Mind: you should describe your filter here too.
Antitorgo
31st December 2004, 02:50
Ah, yes... it would make sense if I described it some here. I'm used to people knowing what it is in the dev forum I forgot...
Avisynth is a generic plugin that uses your 3D card's hardware to assist with rendering. Currently, I only have a few generic techniques, and the plugin needs a lot of work, but it should give some people the idea that yes, hardware assisted rendering is possible.
Examples:
clip.Undot().ConvertToRGB32().AviShader("c:\effect.fx", "BlackAndWhite")
clip.Undot().ConvertToRGB32().AviShader("c:\effect.fx", "Funky")
clip.Undot().ConvertToRGB32().AviShader("c:\effect.fx", "Wavy")
I'm currently working on the resizing code, and have supersampling code in the works. My current tests are doing a 4x SSXSharpen at ~12fps but it is using a linear resize. I'm putting in a bilinear resize right at this moment.
I'll post more on a new version when I get the resizing code fixed up.
State of Mind
31st December 2004, 17:51
So, this filter's purpose is...?
To allow hardware such as my video card to assist in the encoding of my videos?
Socio
31st December 2004, 19:06
Anyone else have a problem downloading it?
ObiKenobi
31st December 2004, 19:20
Originally posted by Socio
Anyone else have a problem downloading it?
Nope, just downloaded it right now.
ObiKenobi
31st December 2004, 19:20
Originally posted by State of Mind
So, this filter's purpose is...?
To allow hardware such as my video card to assist in the encoding of my videos?
It uses your video card to assist in rendering effects. Has nothing to do with encoding the video. Download and read the help file and it will tell you the effects it can currently do.
Socio
31st December 2004, 20:58
I finally downloaded it,
I have tested it out and like what I see so far! I am using a ATI card I do not see and differences if I enable AA or AF even to full, does AA or AF have any affect on the process?
Soulhunter
1st January 2005, 01:08
Originally posted by Socio
...does AA or AF have any affect on the process?
Nope, afaik this shouldnt affect process... ;)
Bye
Antitorgo
1st January 2005, 02:43
Turning on AF will probably do nothing, since it is "looking" at a flat plane striaght on. AF should only come into play when looking at a plane at an angle...
Forcing AA depends on what the graphics vendor considers AA... If I recall correctly, ATI doesn't AA the textures (which this is), just the vertices. This way, they get fullscreen AA cheaper. I think they called it multi-sampling or something like that... Anyway, there was a little hullaballoo in the gaming community, and some folks figured out how to get it turned back on in the drivers... maybe do a search for it? I think maybe nVidia does AA the textures if you force it, but since I only have ATI cards, I don't know...
I'm still working on the supersampling stuff, it slows down things a lot when you are dealing with 4x, because it is 16x the data. The biggest issue however, is that for speed purposes, I am trying to get it to supersample on the card, that way, d/ling back from the card isn't super slow, just semi-slow. ;) Anyway, the graphics cards only support point and bilinear resizing, so I'm working on a shader to take a point re-sized texture, and do some sort of interpolation like bicubic or lanczos on it. (I think I might have bicubic down now actually). Plus, I'm seeing if I can't utilize the vector shader to calculate some of the math instead of doing it all in the pixel shader. (Right now, everything is a pixel shader). Plus, I've added some speed improvements, where I'm re-using some COM objects more often and some other odd tricks that makes things faster. This has brought CPU utilization down to 70% on my box no matter what my framerate seems to be (30fps for simple stuff, 4fps for complex supersampled stuff, it is still 70-80%).
dbzgundam
10th January 2005, 04:58
It no workie for me. ^^;;
I get what would seem to be a memory error on the bottom of VdubMod:
"AviSynth caught an access violation at blah blah blah, attempting to read from blah blah blah."
Isn't this typically a memory issue, that I've noticed is often solved simply by SetMemoryMax? I have nothing but Telecide and crop running after MPEG2Source, and then AVIShader...
If it matters (I wouldn't be surprised), my crappy graphics card is an old GeForce MX 440SE. :(
708145
10th February 2005, 22:01
Wow awesome!
I have a Radeon8500 maybe that's why it doesn't work?
clip.ConvertToRGB32().AviShader("e:\effect.fx", "Default")
bailed out with an access violation! :(
I really like the idea to offload some filters (all?) to the GPU and I'll buy a faster one if neccessary! Since I don't play games there was no need to upgrade so far, but for encoding I'd do it ;)
bis besser,
Tobias
Antitorgo
10th February 2005, 22:20
Yeah, on a Radeon 8500 I wouldn't expect it to work (It only supports PS_1_1 I think).
It won't work on an old GeForceMX card either...
Basically, if you don't have a GeForceFX or a Radeon 9500+ this probably won't work for you.
I'm still working on things, I just have been busy working out a lot of the kinks. I'd hold off on buying a newer card until there are some good filters out there for doing the processing... Plus by that time, maybe ATi will have released their newer cards... Oh, but when you do buy a new GPU, buy me one too ;)
708145
10th February 2005, 22:49
I looked up the specs: It supports up to PS1.4 No PS2.0 :(
That makes 4 GPUs then since I'm sure you want SLI, too :D
bis besser,
Tobias
yidaki
7th March 2005, 14:35
hmm, this could be very interesting in the future..
theoretically, you could the h/w deinterlacing from purevideo in your nvidia card :)
that's probably 15-30% of my cpu to the gpu :D
Longinus
12th March 2005, 07:30
This plugins sounds really good (I always wanted to use the power of my GPU to video processing). Virtualdub 1.6 is using something like this for preview, right?
Anyway... I can't get this to work. It crashes my Virtualdub (or anything else).. Avisynth 2.55, WinXP, Geforce FX 5700.
s.virojanadara
8th March 2008, 05:41
:thanks: This is a quite useful plugin. I just wrote the bilateral filter to use with anime so your guys may try out.
Requirement
1. My filter design to use with Antitorgo's avishader 0.42 you can download here
http://www.blosser.org/d9/dlAviShader042.rar
2. Graphic card that support at least pixel shader 2.a
/*
HLSL Bilateral Filter for avishader version 0.42
Written by Sompon Virojanadara <s.virojanadara[]gmail.com>
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
SOMPON VIROJANADARA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Filters:
This file compose with 2 technique
1. BilateralFilter use a full kernel of bilateral filter technique time complexcity is O(n^2) where n is depend on geometric constant
2. Approx_BilateralFilter is a bilateral technique based on Pham and van Vliet [2005] time complexcity is O(2n) where n is depend on geometric constant
Constant Setting:
1. with - width of source video in pixel you want to sampling or downsampling into.
2. height - height of source video in pixel you want to sampling or downsampling into.
3. photometric - less: preserve more edge
more: more noise will be remove
range: 0-1
4. geometric - size of kernel any odd number >= 3
(warning in BilateralFilter (fold_bilateral function) due to size restriction of Pixel shader 2.a you can't have size more than 5.)
Due to I cant make Pixel shader 3.0 work on avishader version 0.42 however it can work on avishader version 0.1. but that version doesn't support Approx_BilateralFilter -.-
However, if you want to have BilateralFilter with kernel size more than 5 don't hestitate to e-mail me (However, you need to have graphic card that support Pixel shader version 3.0))
*/
texture originalTexture;
texture frameTexture;
sampler2D frameSampler = sampler_state {
Texture = <frameTexture>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
sampler2D originalSampler = sampler_state {
Texture = <originalTexture>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
};
sampler2D weightSampler;
float4x4 worldViewProj : WorldViewProjection;
float4 texelSize;
float4 imageSize;
int frameNum;
float4 approx_bilateral_X( float2 Tex : TEXCOORD0 ) : COLOR0
{
const float width = 720;
const float height = 480;
const float photometric = 0.015;
const float geometric = 17;
const float midGeo = (geometric-1)/2 ;
const float midPoint = midGeo+1;
const float stepX = 1.0/width;
const float t = 1/(2*midGeo*midGeo);
const float p = 1/(2*photometric*photometric);
const float w2t = width * width * t;
float4 Color;
float tempG;
float3 tempW;
float3 tempC0;
float3 tempC1;
float3 tempC2;
float3 normalizer;
float2 position;
float x;
float optX;
float2 tTex;
tTex = Tex;
tTex += texelSize.xy;
normalizer = 1;
x = stepX;
tempC0 = tex2D( frameSampler, tTex.xy).xyz;
Color.xyz = tempC0;
for (int i = 0; i < midGeo; i++){
optX = x * x * w2t;
position = float2(tTex.x+x,tTex.y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x-x,tTex.y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
x += stepX;
}
Color.xyz = Color.xyz/normalizer.xyz;
Color.w = 1;
return Color;
}
float4 approx_bilateral_Y( float2 Tex : TEXCOORD0 ) : COLOR0
{
const float width = 720;
const float height = 480;
const float photometric = 0.015;
const float geometric = 17;
const float midGeo = (geometric-1)/2 ;
const float midPoint = midGeo+1;
const float stepY = 1.0/height;
const float t = 1/(2*midGeo*midGeo);
const float p = 1/(2*photometric*photometric);
const float h2t = height * height * t;
float4 Color;
float tempG;
float3 tempW;
float3 tempC0;
float3 tempC1;
float3 tempC2;
float3 normalizer;
float2 position;
float2 tTex;
tTex = Tex;
tTex += texelSize.xy;
float y;
float optY;
normalizer = 1;
y = stepY;
tempC0 = tex2D( frameSampler, tTex.xy).xyz;
Color.xyz = tempC0;
for (int i = 0; i < midGeo; i++){
optY = y * y * h2t;
position = float2(tTex.x,tTex.y+y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optY);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x,tTex.y-y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optY);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
y += stepY;
}
Color.xyz = Color.xyz/normalizer.xyz;
Color.w = 1;
return Color;
}
float4 fold_bilateral( float2 tTex : TEXCOORD0 ) : COLOR0
{
const float width = 280;
const float height = 210;
const float photometric = 0.025;
const float geometric = 5;
const float midGeo = (geometric-1)/2 ;
const float midPoint = midGeo+1;
const float stepX = 1.0/width;
const float stepY = 1.0/height;
const float startX = -stepX * midGeo;
const float startY = -stepY * midGeo;
const float t = 1/(2*midGeo*midGeo);
const float p = 1/(2*photometric*photometric);
const float w2t = width * width * t;
const float h2t = height * height * t;
float4 Color;
float tempG;
float3 tempW;
float3 tempC0;
float3 tempC1;
float3 tempC2;
float3 normalizer;
float2 position;
float x;
float y;
float optX;
float optY;
normalizer = 1;
x = stepX;
tempC0 = tex2D( frameSampler, tTex.xy).xyz;
Color.xyz = tempC0;
for (int i = 0; i < midGeo; i++){
y = stepY;
optX = x * x * w2t;
position = float2(tTex.x,tTex.y+y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x,tTex.y-y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x+x,tTex.y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x-x,tTex.y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
for (int j = 0; j < midGeo; j++){
optX += y*y*h2t;
position = float2(tTex.x+x,tTex.y+y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x-x,tTex.y+y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x+x,tTex.y-y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
position = float2(tTex.x-x,tTex.y-y);
tempC1 = tex2D( frameSampler, position).xyz;
tempC2 = tempC0-tempC1;
tempW = exp(-(tempC2*tempC2*p)-optX);
Color.xyz += (tempC1*tempW);
normalizer += (tempW);
y += stepY;
}
x += stepX;
}
Color.xyz = Color.xyz/normalizer.xyz;
Color.w = 1;
return Color;
}
technique Approx_BilateralFilter
{
pass P1 { PixelShader = compile ps_2_a approx_bilateral_X(); }
pass P2 { PixelShader = compile ps_2_a approx_bilateral_Y(); }
}
technique BilateralFilter
{
pass P1 { PixelShader = compile ps_2_a fold_bilateral(); }
}
chriszxl
13th July 2008, 17:30
cool stuff.....I would like put more work on gpu...bcos I really very little time to wacth HDTV and never play 3D games ,I thought I will before I buy my Geforce 9800GX2 videocard,I really dont know how to consume it ..
jclampy
14th December 2011, 01:29
Requirement
1. My filter design to use with Antitorgo's avishader 0.42 you can download here
http://www.blosser.org/d9/dlAviShader042.rar
Hi, would love to try this out but link is dead. Can anybody help? :o
Edit:
Hi guys a quick google found various plugins on this page: http://www.avisynth.info/?%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6
Mirror added for avishader 0.42 here: http://mediafire.com/?xkmatqlcvaoskv5
:cool:
SubPixie
14th December 2011, 14:26
Ah I see jclampy stumbled on avishader, that's probably a good indication MAME HLSL filter (http://forum.doom9.org/showpost.php?p=1540471&postcount=73) is about to be usable with Avisynth :D
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.