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; 
 
  */