Home Diary 倉庫

2004年08月21日

2004年08月21日

Pixel Shader Lifegame

東京タワーのよく見えるビルで、バイトしてる。最初の2ヶ月は会社側の試用期間ってことで、採用されるかどうかは2ヶ月後きまる。

内容は高速画像処理ということで、GPUを使った2次元画像処理。 守秘義務とかいう物があり、どこまで守秘すればいいのか把握していないため何もかかないことにするが、今日家にかえってきてふと思いたったので家のtheSpoke PremiumなVisual Studioをひさびさに起動して、GPUを使ったLifegameを書いてみた。

512x512のテクスチャを二枚用意して片方をソースにPixelShaderを掛けてもう片方にレンダリング。 次に二枚のテクスチャを入れかえて...を毎フレームおこない、画面にも表示。

Shaderはこんな感じ。

#define TEXSIZE 512
struct VS_OUTPUT{
	float4 Pos	: POSITION;
	float2 Tex	: TEXCOORD0;
};
struct PS_OUTPUT{
	float4 Col : COLOR;
};
float d = 1.0f/TEXSIZE;
PS_OUTPUT PShader(VS_OUTPUT v){
	PS_OUTPUT Out = (PS_OUTPUT)0;
	int3 count = 0;
	for(int i=0; i<1; i++){
		float4 c = tex2D(Sampler,v.Tex);
		if(tex2D(Sampler,v.Tex + float2(-d,+d))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2(-d, 0))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2(-d,-d))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2( 0,+d))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2( 0,-d))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2(+d,+d))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2(+d, 0))[i]>0.5f)	count[i]+=1;
		if(tex2D(Sampler,v.Tex + float2(+d,-d))[i]>0.5f)	count[i]+=1;
			
		if( (c[i]>0.5f) && (count[i]==2||count[i]==3) )
			Out.Col[i]=1.0f;
		else if( (c[i]<=0.5f) && (count[i]==3) )
			Out.Col[i]=1.0f;
		else
			Out.Col[i]=0.0f;
	}
	
	/*
	int4 c = round(tex2D(Sampler,v.Tex));
	int4 count = round(tex2D(Sampler,v.Tex + float2(-d,+d))[0])
			+round(tex2D(Sampler,v.Tex + float2(-d, 0)))
			+round(tex2D(Sampler,v.Tex + float2(-d,-d)))
			+round(tex2D(Sampler,v.Tex + float2( 0,+d)))
			+round(tex2D(Sampler,v.Tex + float2( 0,-d)))
			+round(tex2D(Sampler,v.Tex + float2(+d,+d)))
			+round(tex2D(Sampler,v.Tex + float2(+d, 0)))
			+round(tex2D(Sampler,v.Tex + float2(+d,-d)));
		
	//for(int i=0; i<1; i++){
	int i=0;
		int t=c[i];
		int r=count[i];
		if(t==1 && (r==2||r==3))
			Out.Col[i]=1.0f;
		else if(t==0 && r==3)
			Out.Col[i]=1.0f;
		else
			Out.Col[i]=0.0f;
	//}
	*/
	
	return Out;
}

RGBそれぞれライフゲームさせたかったが、このビデオカード(GeForce FX 5950 Ultra)が64命令以上ロードできないらしいので断念。Shaderはじめて3日の身なので、命令数へらす書き方を心得ていない。ちなみにこのカードは家での勉強用に会社が貸してくださった物。 会社のマシンのビデオカードならできるかも。