⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 programcg.cpp

📁 SiftGPU is an implementation of SIFT [1] for GPU. SiftGPU processes pixels parallely to build Gaussi
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
	cgGLSetTextureParameter(_param_dog_texu, texU);
	cgGLEnableTextureParameter(_param_dog_texu);
	cgGLSetTextureParameter(_param_dog_texd, texD);
	cgGLEnableTextureParameter(_param_dog_texd);
}

void ShaderBagCG::SetGenListStepParam(int tex, int tex0)
{
	cgGLSetTextureParameter(_param_genlist_step_tex, tex);
	cgGLEnableTextureParameter(_param_genlist_step_tex);
	cgGLSetTextureParameter(_param_genlist_step_tex0, tex0);
	cgGLEnableTextureParameter(_param_genlist_step_tex0);
}

void ShaderBagCG::SetGenVBOParam(float width, float fwidth, float size)
{
	float sizes[4] = {size*3.0f, fwidth, width, 1.0f/width};
	cgGLSetParameter4fv(_param_genvbo_size, sizes);
}


ProgramGPU* FilterGLCG::CreateFilterH(float kernel[], float offset[], int width)
{


	char buffer[10240];
	ostrstream out(buffer, 10240);

	out<<setprecision(8);

	if(GlobalUtil::_BetaFilter)
	{
		out<< "void main(uniform samplerRECT tex,";
		out<<"\n\tin float4 TexCoord0: TEXCOORD0,";
		out<<"\n\tout float4 FragColor : COLOR0 )";
		out<<"\n{\n\tfloat4 intensity4 = float4(0, 0, 0, 0), data;\n";
		out<<"float or = texRECT(tex, TexCoord0.xy).r, intensity;\n";

		for(int i = 0; i< width; i+=4)
		{
			out <<"data = float4(";
			for(int j = i; j < i + 4; j++)
			{
				if(j != i) out <<", \n";
				if(j >= width)
				{
					out<<"0";
				}else if(offset[j]==0.0)
				{
					out<<"or";
				}else
				{
					out<<"texRECT(tex, TexCoord0.xy + float2(float("<<offset[j] <<") , 0)).r";
				}
			}
			out << ");\n";
			out << "intensity4 += data * float4(";
			for(int k = i; k < i + 4; k++)
			{
				if(k != i) out <<", ";
				if(k >= width)	out<<"0";
				else			out<<kernel[k];
			}
			out << ");\n";

 		}
		out << "intensity4.xy += intensity4.zw;\n";
		out << "intensity = intensity4.x + intensity4.y;\n";
	}else
	{
		out<< "void main(uniform samplerRECT tex,";
		out<<"\n\tin float4 TexCoord0: TEXCOORD0,";
		out<<"\n\tout float4 FragColor : COLOR0 )";
		out<<"\n{\n\tfloat intensity = 0.0 ;  float2 pos;\n";

		for(int i = 0; i< width; i++)
		{
			if(offset[i]==0.0)
			{
				out<<"float or = texRECT(tex, TexCoord0.xy).r;\n";
				out<<"intensity+= or * "<<kernel[i]<<";\n";

			}else
			{
				out<<"pos = TexCoord0.xy + float2(float("<<offset[i] <<") , 0);\n";
				out<<"intensity+= "<<kernel[i]<<"*texRECT(tex, pos).r;\n";
			}
		}
	}
	//copy original data to red channel
	out<<"FragColor.r = or;\n"; 
	out<<"FragColor.b  = intensity;}\n"<<'\0';

	return new ProgramCG( buffer);
}


ProgramGPU* FilterGLCG::CreateFilterV(float kernel[], float offset[], int height)
{
	char buffer[10240];
	ostrstream out(buffer, 10240);
	out<<setprecision(8);

	if(GlobalUtil::_BetaFilter)
	{
		out<< "void main(uniform samplerRECT tex,";
		out<<"\n\tin float4 TexCoord0: TEXCOORD0,";
		out<<"\n\tout float4 FragColor : COLOR0 )";
		out<<"\n{\n\tfloat4 intensity4 = float4(0, 0, 0, 0), data;\n";
		out<<"float2 orb = texRECT(tex, TexCoord0.xy).rb; float intensity;\n";

		for(int i = 0; i< height; i+=4)
		{
			out <<"data = float4(";
			for(int j = i; j < i + 4; j++)
			{
				if(j != i) out <<", \n";
				if(j >= height)
				{
					out<<"0";
				}else if(offset[j]==0.0)
				{
					out<<"orb.y";
				}else
				{
					out<<"texRECT(tex, TexCoord0.xy + float2(0, float("<<offset[j] <<"))).b";
				}
			}
			out << ");\n";
			out << "intensity4 += data * float4(";
			for(int k = i; k < i + 4; k++)
			{
				if(k != i) out <<", ";
				if(k >= height)	out<<"0";
				else			out<<kernel[k];
			}
			out << ");\n";

 		}
		out << "intensity4.xy += intensity4.zw;\n";
		out << "intensity = intensity4.x + intensity4.y;\n";
	}else
	{
		out<< "void main(uniform samplerRECT tex,";
		out<<"\n\tin float4 TexCoord0: TEXCOORD0,";
		out<<"\n\tout float4 FragColor : COLOR0 )";
		out<<"\n{\n\tfloat intensity = 0.0 ;  float2 pos;\n";

		for(int i = 0; i< height; i++)
		{
			if(offset[i]==0.0)
			{
				out<<"float2 orb = texRECT(tex, TexCoord0.xy).rb;\n";
				out<<"intensity+= orb.y * "<<kernel[i]<<";\n";

			}else
			{
				out<<"pos = TexCoord0.xy + float2(0, float("<<offset[i] <<"));\n";
				out<<"intensity+= "<<kernel[i]<<"*texRECT(tex, pos).b;\n";
			}
		}
	}
	out<<"FragColor.b = orb.y;\n";
	out<<"FragColor.g = intensity - orb.x;\n"; // difference of gaussian..
	out<<"FragColor.r = intensity;}\n"<<'\0';
	
	return new ProgramCG( buffer);
}


ProgramGPU* FilterGLCG::CreateFilterHPK(float kernel[], float offset[], int width)
{
	//both h and v are packed...
	int i, j , xw, xwn;
	int halfwidth  = width >>1;
	float * pf = kernel + halfwidth;
	int nhpixel = (halfwidth+1)>>1;	//how many neighbour pixels need to be looked up
	int npixel  = (nhpixel<<1)+1;//
	char buffer[10240];
	float weight[3];
	ostrstream out(buffer, 10240);
	out<<setprecision(8);

	out<< "void main(uniform samplerRECT tex, float4 TexCoord0 : TEXCOORD0, out float4 FragColor : COLOR0 ){\n";
	out<< "float4 result = float4(0, 0, 0, 0); \nfloat4 pc; float2 coord; \n";
	///use multi texture coordinate because nhpixels can be at most 3
	for( i = 0 ; i < npixel ; i++)
	{

		out<<"coord = TexCoord0.xy + float2(float("<<i-nhpixel<<"),0);\n";
		out<<"pc=texRECT(tex, coord);\n";
		if(GlobalUtil::_PreciseBorder)		out<<"if(coord.x < 0) pc = pc.rrbb;\n";

		//for each sub-pixel j  in center, the weight of sub-pixel k 
		xw = (i - nhpixel)*2;
		for( j = 0; j < 3; j++)
		{
			xwn = xw  + j  -1;
			weight[j] = xwn < -halfwidth || xwn > halfwidth? 0 : pf[xwn];
		}
		//if(weight[1]!=0.0)	out<<"FragColor += "<<weight[1]<<"*pc;\n";
		//out<<"FragColor += float4("<<weight[2]<<","<<weight[0]<<","<<weight[2]<<","<<weight[0]<<")*pc.grab;\n";

		if(weight[1] == 0.0)
		{
			out<<"result += float4("<<weight[2]<<","<<weight[0]<<","<<weight[2]<<","<<weight[0]<<")*pc.grab;\n";
		}
		else
		{
			out<<"result += float4("<<weight[1]<<", "<<weight[0]<<", "<<weight[1]<<", "<<weight[0]<<")*pc.rrbb;\n";
			out<<"result += float4("<<weight[2]<<", "<<weight[1]<<", "<<weight[2]<<", "<<weight[1]<<")*pc.ggaa;\n";
		}

	}
	out<<
	"	 FragColor = result; }\n"<<'\0';
	return new ProgramCG( buffer);
}

ProgramGPU* FilterGLCG::CreateFilterVPK(float kernel[], float offset[], int height)
{

	//both h and v are packed...
	int i, j , yw, ywn;
	int halfh  = height >>1;
	float * pf = kernel + halfh;
	int nhpixel = (halfh+1)>>1;	//how many neighbour pixels need to be looked up
	int npixel  = (nhpixel<<1)+1;//
	char buffer[10240];
	float weight[3];
	ostrstream out(buffer, 10240);
	out<<setprecision(8);

	out<< "void main(uniform samplerRECT tex, float4 TexCoord0 : TEXCOORD0, out float4 FragColor : COLOR0 ){\n";
	out<< "float4 result = float4(0, 0, 0, 0);\nfloat4 pc; float2 coord;\n";
	///use multi texture coordinate because nhpixels can be at most 3

	for( i = 0 ; i < npixel ; i++)
	{

		out<<"coord = TexCoord0.xy + float2(0, float("<<i-nhpixel<<"));\n";
		out<<"pc=texRECT(tex, coord);\n";
		if(GlobalUtil::_PreciseBorder)	out<<"if(coord.y < 0) pc = pc.rgrg;\n";
		//for each sub-pixel j  in center, the weight of sub-pixel k 
		yw = (i - nhpixel)*2;
		for( j = 0; j < 3; j++)
		{
			ywn = yw + j  -1;
			weight[j] = ywn < -halfh || ywn > halfh? 0 : pf[ywn];
		}
		//if(weight[1]!=0.0)	out<<"FragColor += "<<weight[1]<<"*pc;\n";
		//out<<"FragColor += float4("<<weight[2]<<","<<weight[2]<<","<<weight[0]<<","<<weight[0]<<")*pc.barg;\n";
		if(weight[1] == 0.0)
		{
			out<<"result += float4("<<weight[2]<<","<<weight[2]<<","<<weight[0]<<","<<weight[0]<<")*pc.barg;\n";
		}else
		{
			out<<"result += float4("<<weight[1]<<","<<weight[1]<<","<<weight[0]<<","<<weight[0]<<")*pc.rgrg;\n";
			out<<"result += float4("<<weight[2]<<","<<weight[2]<<","<<weight[1]<<","<<weight[1]<<")*pc.baba;\n";
		}
	}
	out<<
	"	 FragColor = result; }\n"<<'\0';
	return new ProgramCG( buffer);
}


void ShaderBagCG::LoadGenListShader(int ndoglev, int nlev)
{
	ProgramCG * program;

	s_genlist_init_tight = new ProgramCG(
	"void main (\n"
	"uniform samplerRECT tex, in float4 TexCoord0 : TEXCOORD0,\n"
	"in float4 TexCoord1 : TEXCOORD1, in float4 TexCoord2 : TEXCOORD2, in float4 TexCoord3 : TEXCOORD3,\n"
	"out float4 FragColor : COLOR0){\n"
	"float4 helper = float4( texRECT(tex, TexCoord0.xy).r,  texRECT(tex, TexCoord1.xy).r,\n"
	"texRECT(tex, TexCoord2.xy).r, texRECT(tex, TexCoord3.xy).r);\n"
	"FragColor = float4(helper>0.0);\n"
	"}");

	s_genlist_init_ex = program = new ProgramCG(
	"void main (uniform float2 bbox, \n"
	"uniform samplerRECT tex, \n"
	"in float4 TexCoord0 : TEXCOORD0,\n"
	"in float4 TexCoord1 : TEXCOORD1, \n"
	"in float4 TexCoord2 : TEXCOORD2, \n"
	"in float4 TexCoord3 : TEXCOORD3,\n"
	"out float4 FragColor : COLOR0){\n"
	"float4 helper = float4( \n"
	"texRECT(tex, TexCoord0.xy).r, texRECT(tex, TexCoord1.xy).r,\n"
	"texRECT(tex, TexCoord2.xy).r, texRECT(tex, TexCoord3.xy).r);\n"
	"bool4 helper4 = bool4(TexCoord0.xy < bbox, TexCoord3.xy < bbox); \n"
	"bool4 helper2 = helper4.xzxz && helper4.yyww; \n"
	"FragColor = float4(helper2 && (helper>0.0 ));\n"
	"}");
	_param_genlist_init_bbox = cgGetNamedParameter( *program, "bbox");


	//reduction ...
	s_genlist_histo = new ProgramCG(
	"void main (\n"
	"uniform samplerRECT tex, in float2 TexCoord0 : TEXCOORD0,\n"
	"in float2 TexCoord1 : TEXCOORD1, in float2 TexCoord2 : TEXCOORD2, in float2 TexCoord3 : TEXCOORD3,\n"
	"out float4 FragColor : COLOR0){\n"
	"float4 helper; float4 helper2; \n"
	"helper = texRECT(tex, TexCoord0); helper2.xy = helper.xy + helper.zw; \n"
	"helper = texRECT(tex, TexCoord1); helper2.zw = helper.xy + helper.zw; \n"
	"FragColor.rg = helper2.xz + helper2.yw;\n"
	"helper = texRECT(tex, TexCoord2); helper2.xy = helper.xy + helper.zw; \n"
	"helper = texRECT(tex, TexCoord3); helper2.zw = helper.xy + helper.zw; \n"
	"FragColor.ba= helper2.xz+helper2.yw;\n"
	"}");


	//read of the first part, which generates tex coordinates 

	s_genlist_start= program =  LoadGenListStepShader(1, 1);
	_param_ftex_width= cgGetNamedParameter(*program, "width");
	_param_genlist_start_tex0 = cgGetNamedParameter(*program, "tex0");
	//stepping
	s_genlist_step = program = LoadGenListStepShader(0, 1);
	_param_genlist_step_tex= cgGetNamedParameter(*program, "tex");
	_param_genlist_step_tex0= cgGetNamedParameter(*program, "tex0");


}

ProgramCG* ShaderBagCG::LoadGenListStepShader(int start, int step)
{
	int i;
	char buffer[10240];
	//char chanels[5] = "rgba";
	ostrstream out(buffer, 10240);
	out<<"void main(out float4 FragColor : COLOR0, \n";

	for(i = 0; i < step; i++) out<<"uniform samplerRECT tex"<<i<<",\n";

	if(start)
	{
		out<<"uniform float width, \nin float2 tpos : TEXCOORD0){\n";
		out<<"float  index = floor(tpos.y) * width + floor(tpos.x) + 0.0001;\n";
		out<<"float2 pos = float2(0.5, 0.5);\n";
	}else
	{
		out<<"uniform samplerRECT tex, in float2 tpos: TEXCOORD0 ){\n";
		out<<"float4 tc = texRECT( tex, tpos);\n";
		out<<"float2 pos = tc.rg; float index = tc.b;\n";
	}
	out<<"float2 sum; 	float4 cc;\n";



	if(step>0)
	{
		out<<"float2 cpos = float2(-0.5, 0.5);\t float2 opos;\n";
		for(i = 0; i < step; i++)
		{
//#define SETP_CODE_2

#ifndef SETP_CODE_2
/*			out<<"cc = texRECT(tex"<<i<<", pos);\n";
			out<<"float sum3[3] = {cc.r, cc.r + cc.g, cc.r + cc.g + cc.b};\n";
			out<<"float3 cmp = float3(index > float3(sum3[0], sum3[1], sum3[2]));\n";
			out<<"opos.y = -0.5 + cmp.y; opos.x = -0.5 + cmp.x + (cmp.z - cmp.y);\n";
			out<<"index -= dot(cmp, cc.rgb);\n";
			out<<"pos = (pos + pos + opos);\n";*/

			out<<"cc = texRECT(tex"<<i<<", pos); sum.x = cc.r + cc.g;\n";
			out<<"if (index < sum.x){ if(index < cc.r) opos = cpos.xx; else {opos = cpos.yx; index -= cc.r;}}\n";
			out<<"else {index -= sum.x; if(index < cc.b) opos = cpos.xy; else{opos = cpos.yy; index -= cc.b;}}";
			out<<"pos = (pos + pos + opos);\n";

/*			out<<"cc = texRECT(tex"<<i<<", pos);\n";
			out<<"if (index <cc.r){ opos = cpos.xx;}\n";
			out<<"else{sum.x = cc.r + cc.g;";
					out<<"if(index < sum.x ) {opos = cpos.yx; index -= cc.r;}\n";
					out<<"else{sum.y = sum.x + cc.b;";
							out<<"if(index < sum.y ) {opos = cpos.xy; index -= sum.x;}\n";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -