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