www.pudn.com > GPUVision_5-13-05-2.zip > DxDy.cg
// Main shader.
void main(float2 iCoords : TEX0,
uniform samplerRECT texture,
out float4 oColor : COLOR) {
// Sobel
float4 gx = -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2(-1.0, 0.0)) +
-texRECT(texture,iCoords + float2(-1.0, 1.0)) +
texRECT(texture,iCoords + float2( 1.0,-1.0)) +
2*texRECT(texture,iCoords + float2( 1.0, 0.0)) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
float4 gy = -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2( 0.0,-1.0) ) +
-texRECT(texture,iCoords + float2( 1.0,-1.0)) +
texRECT(texture,iCoords + float2(-1.0, 1.0)) +
2*texRECT(texture,iCoords + float2( 0.0, 1.0) ) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
// float4 gx = ddx(texRECT(texture,iCoords));
// float4 gy = ddy(texRECT(texture,iCoords));
oColor.x = max(max(gx.x,gx.y),gx.z)/6;
oColor.y = max(max(gy.x,gy.y),gy.z)/6;
oColor.z = length(oColor.xy);
oColor.w = atan(oColor.x/oColor.y);
// float dx = ddx(texRECT(texture,iCoords));
// float dy = ddy(texRECT(texture,iCoords));
//
// oColor = length(float2(dx,dy))*2;
// Step 2.
/*
float4 gx = 0;
float4 gy = 0;
// top left
float4 l = f4texRECT(texture, iCoords+float2(-1,-1));
gx += -l;
gy += -l;
// top
l = f4texRECT(texture, iCoords+float2( 0,-1));
gy += -2*l;
// top right
l = f4texRECT(texture, iCoords+float2( 1,-1));
gx += l;
gy += -l;
// left
l = f4texRECT(texture, iCoords+float2(-1, 0));
gx += -2*l;
// right
l = f4texRECT(texture, iCoords+float2( 1, 0));
gx += 2*l;
// bot left
l = f4texRECT(texture, iCoords+float2(-1, 1));
gx += -l;
gy += l;
// bot
l = f4texRECT(texture, iCoords+float2( 0, 1));
gy += 2*l;
// bot right
l = f4texRECT(texture, iCoords+float2( 1, 1));
gx += l;
gy += l;
float4 gx;
float4 gy;
gx= -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2(-1.0, 0.0)) +
-texRECT(texture,iCoords + float2(-1.0, 1.0)) +
texRECT(texture,iCoords + float2( 1.0,-1.0)) +
2*texRECT(texture,iCoords + float2( 1.0, 0.0)) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
gy= -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2( 0.0,-1.0) ) +
-texRECT(texture,iCoords + float2( 1.0,-1.0)) +
texRECT(texture,iCoords + float2(-1.0, 1.0)) +
2*texRECT(texture,iCoords + float2( 0.0, 1.0) ) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
// comment 2 lines for OpenVidia stuff
// gx = ddx(texRECT(texture,iCoords));
// gy = ddy(texRECT(texture,iCoords));
gx.w=0;
gy.w=0;
float4 g=length(gx)+length(gy);
g.w=atan(length(gy)/length(gx));
// comment for OpenVidia stuff
// g.w=degrees(atan(length(gy)/length(gx)));
/*
if(g.w >= 0 && g.w <= 22.5 ||
g.w > 157.5 && g.w <= 180) {
// g.r = 1;
g.w=0;
} else if ( g.w > 22.5 && g.w <= 67.5 ) {
// g.g = 1;
g.w=45;
} else if ( g.w > 67.5 && g.w <= 135) {
// g.b = 1;
g.w=90;
} else {
// g.r = 1;
// g.g = 1;
g.w=135;
}
*/
//oColor = g;
/* const float PI = 3.141592653589793238462643;
float u = f1texRECT(texture, iCoords+float2( 0,-1));
float l = f1texRECT(texture, iCoords+float2(-1,0));
float m = f1texRECT(texture, iCoords);
oColor.x = m-l;
oColor.y = u-m;
oColor.z = length(oColor.xy);
if(oColor.y != 0 && oColor.x != 0) {
oColor.w = (atan(oColor.x/oColor.y)+PI/2)*180/PI;
if(oColor.w < 22.5) {
oColor.w = 0;
oColor.x = 1;
} else if(oColor.w < 67.5) {
oColor.w = 45;
oColor.y = 1;
} else if(oColor.w < 135) {
oColor.w = 90;
oColor.z = 1;
} else {
oColor.w = 135;
oColor.x = 1;
oColor.y = 1;
}
} else if (oColor.y != 0) {
oColor.w = 90;
} else {
oColor.w = 0;
}*/
}
/*
float gx;
float gy;
oColor.x = -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2(-1.0, 0.0)) +
-texRECT(texture,iCoords + float2(-1.0, 1.0)) +
texRECT(texture,iCoords + float2( 1.0,-1.0)) +
2*texRECT(texture,iCoords + float2( 1.0, 0.0)) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
oColor.y = -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2( 0.0,-1.0) ) +
-texRECT(texture,iCoords + float2( 1.0,-1.0)) +
texRECT(texture,iCoords + float2(-1.0, 1.0)) +
2*texRECT(texture,iCoords + float2( 0.0, 1.0) ) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
oColor.z = length(oColor.xy);
oColor.w = atan(gy/gx);
*/
/*
float4 gx;
float4 gy;
gx= -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2(-1.0, 0.0)) +
-texRECT(texture,iCoords + float2(-1.0, 1.0)) +
texRECT(texture,iCoords + float2( 1.0,-1.0)) +
2*texRECT(texture,iCoords + float2( 1.0, 0.0)) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
gy= -texRECT(texture,iCoords + float2(-1.0,-1.0)) +
-2*texRECT(texture,iCoords + float2( 0.0,-1.0) ) +
-texRECT(texture,iCoords + float2( 1.0,-1.0)) +
texRECT(texture,iCoords + float2(-1.0, 1.0)) +
2*texRECT(texture,iCoords + float2( 0.0, 1.0) ) +
texRECT(texture,iCoords + float2( 1.0, 1.0));
// comment 2 lines for OpenVidia stuff
// gx = ddx(texRECT(texture,iCoords));
// gy = ddy(texRECT(texture,iCoords));
gx.w=0;
gy.w=0;
float4 g=length(gx)+length(gy);
g.w=atan(length(gy)/length(gx));
// comment for OpenVidia stuff
// g.w=degrees(atan(length(gy)/length(gx)));
if(g.w >= 0 && g.w <= 22.5 ||
g.w > 157.5 && g.w <= 180) {
// g.r = 1;
g.w=0;
} else if ( g.w > 22.5 && g.w <= 67.5 ) {
// g.g = 1;
g.w=45;
} else if ( g.w > 67.5 && g.w <= 135) {
// g.b = 1;
g.w=90;
} else {
// g.r = 1;
// g.g = 1;
g.w=135;
}
oColor = g;
*/