bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

輝度によるエッジ検出

t-potからのパクリ。
サンプリングポイントを増やして重みを付ければもっと良くなる。

異なる色の境界を黒にする。

処理の流れは下記の通り。
サンプリング→モノクロ化→輝度の差計算→ネガポジ反転

//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 PS(PS_INPUT input) : SV_Target
{
	float2 p = 0.5f*SizeInfo.zw;
	if(input.Pos.x < SizeInfo.x/2) {
		// sampling
		float4 p0 = Texture.Sample(SamplerLinear, input.Tex0+float2(-p.x, -p.y));
		float4 p1 = Texture.Sample(SamplerLinear, input.Tex0+float2(-p.x, +p.y));
		float4 p2 = Texture.Sample(SamplerLinear, input.Tex0+float2(+p.x, -p.y));
		float4 p3 = Texture.Sample(SamplerLinear, input.Tex0+float2(-p.x, -p.y));
		
		// mono
		float mono0 = 0.299f*p0.r + 0.587f*p0.g + 0.114f*p0.b;
		float mono1 = 0.299f*p1.r + 0.587f*p1.g + 0.114f*p1.b;
		float mono2 = 0.299f*p2.r + 0.587f*p2.g + 0.114f*p2.b;
		float mono3 = 0.299f*p3.r + 0.587f*p3.g + 0.114f*p3.b;
		
		// detect
		float diff = (mono0-mono3)*(mono0-mono3)+(mono1-mono2)*(mono1-mono2);
		diff = diff>0?1.0f:0.0f;
		float3 negaposi = 1.0f-diff;
		return float4(negaposi, 1.0f);
	} else {
		return Texture.Sample(SamplerLinear, input.Tex0); 
	}
}