heres 2 shaders, i do it in direct compute hlsl, so it gets to be real lazy 
code, cause its launched onto 2000 cores, so the imperitaveness to optimize is 
a lot more lax.

the top filter is what i use to suppress,  the bottom filter is a binary 
clamped version.
and the shader below that is whats doing the suppression itself,  i use a 
spiral raster so i can stop at a suppression radius once its collected a 
certain count of corners - so it will keep the dynamic density to the corner 
count post inhibition.

//BUFFER0: RETINA
[numthreads(32, 32, 1)]
void cs_corner_filter(uint3 DTid : SV_DispatchThreadID )
{
int 
bri1=(Buffer0[DTid.x+DTid.y*RES].f&0x000000FF)+((Buffer0[DTid.x+DTid.y*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+DTid.y*RES].f&0x00FF0000)>>16);
int 
bri2=(Buffer0[DTid.x+3+DTid.y*RES].f&0x000000FF)+((Buffer0[DTid.x+1+DTid.y*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+1+DTid.y*RES].f&0x00FF0000)>>16);
int 
bri3=(Buffer0[DTid.x+(DTid.y+1)*RES].f&0x000000FF)+((Buffer0[DTid.x+(DTid.y+1)*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+(DTid.y+1)*RES].f&0x00FF0000)>>16);
int xdif=abs(bri2-bri1);
int ydif=abs(bri3-bri1);
uint cornerval=xdif;  //did the multiply


BufferOut[DTid.x+DTid.y*RES].f=cornerval;
}

[numthreads(32, 32, 1)]
void cs_binary_corner_filter(uint3 DTid : SV_DispatchThreadID )
{
int 
bri1=(Buffer0[DTid.x+DTid.y*RES].f&0x000000FF)+((Buffer0[DTid.x+DTid.y*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+DTid.y*RES].f&0x00FF0000)>>16);
int 
bri2=(Buffer0[DTid.x+1+DTid.y*RES].f&0x000000FF)+((Buffer0[DTid.x+1+DTid.y*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+1+DTid.y*RES].f&0x00FF0000)>>16);
int 
bri3=(Buffer0[DTid.x+(DTid.y+1)*RES].f&0x000000FF)+((Buffer0[DTid.x+(DTid.y+1)*RES].f&0x0000FF00)>>8)+((Buffer0[DTid.x+(DTid.y+1)*RES].f&0x00FF0000)>>16);
int xdif=abs(bri2-bri1);
int ydif=abs(bri3-bri1);

if(xdif>10) BufferOut[DTid.x+DTid.y*RES].f=1;
       else BufferOut[DTid.x+DTid.y*RES].f=0;
}


//BUFFER0: CORNER
[numthreads(32, 32, 1)]
void cs_corner_count(uint3 DTid : SV_DispatchThreadID )
{
uint weight=(64*64)*64*5*10;  //this is the maximum corner score.
uint MAXTRAVEL=10000;
uint density=0;
bool turtle_stopped=false;
uint2 turtle=uint2(DTid.x,DTid.y);
uint turtle_radius=0;
uint turtle_dir=0; //LEFT UP RIGHT DOWN.
uint turtle_step=0;
uint turtle_length=1;
uint i;
for(i=0;i<MAXTRAVEL;i++) //turtle method for spiral raster
{
  if(turtle_stopped==false)
  {
   if(turtle.x<RES && turtle.y<RES
   && turtle.x>0 && turtle.y>0)
   {
    density+=Buffer0[turtle.x+turtle.y*RES].f;
   }
   else
   {
    density+=(256*3)/2;
   }
  
   if(density>=weight)
   {
    turtle_stopped=true;   
   }
   switch(turtle_dir){case 0:turtle.x--;break;case 1:turtle.y--;break;case 
2:turtle.x++;break;case 3:turtle.y++;break;}
   turtle_step++;
   if(turtle_step==turtle_length)
   {
    turtle_step=0;
    turtle_dir++;
    if(turtle_dir==3) turtle_dir=0; 
    if(turtle_dir==2) turtle_length++;
    if(turtle_dir==0) turtle_length++;
   }
  }
}

int detected_radius=length((int2)(turtle.x,turtle.y)-(int2)(DTid.x,DTid.y));
BufferOut[DTid.x+DTid.y*RES].f=detected_radius;
}

------------------------------------------
Artificial General Intelligence List: AGI
Permalink: 
https://agi.topicbox.com/groups/agi/Tc5e7e8b165534b2f-Mddbebaba0544e8c9c2c71e7e
Delivery options: https://agi.topicbox.com/groups/agi/subscription

Reply via email to