示例#1
0
	bool VolShader::emit_f(string& s)
	{
		ostringstream z;

		if (poly_)
		{
			z << ShaderProgram::glsl_version_;
			z << FRG_SHADER_CODE_CORE_PROFILE;
			//output
			s = z.str();
			return false;
		}

		//version info
		z << ShaderProgram::glsl_version_;
		z << VOL_INPUTS;
		if (fog_)
			z << VOL_INPUTS_FOG;
		z << VOL_OUTPUTS;

		//the common uniforms
		z << VOL_UNIFORMS_COMMON;

		//2d map location
		if (peel_ != 0 || color_mode_ == 2)
			z << VOL_UNIFORMS_2DMAP_LOC;

		//color modes
		switch (color_mode_)
		{
		case 0://normal
			z << VOL_UNIFORMS_SIN_COLOR;
			break;
		case 1://colormap
			z << VOL_UNIFORMS_COLORMAP;
			break;
		case 2://depth map
			z << VOL_UNIFORMS_SIN_COLOR;
			z << VOL_UNIFORMS_DEPTHMAP;
			break;
		}

		// add uniform for depth peeling
		if (peel_ != 0)
			z << VOL_UNIFORMS_DP;

		// add uniforms for clipping
		if (clip_)
		{
			z << VOL_UNIFORMS_CLIP;
			z << VOL_UNIFORMS_MATRICES;
		}

		// add uniforms for masking
		switch (mask_)
		{
		case 1:
		case 2:
			z << VOL_UNIFORMS_MASK;
			break;
		case 3:
			z << VOL_UNIFORMS_LABEL;
			break;
		case 4:
			z << VOL_UNIFORMS_MASK;
			z << VOL_UNIFORMS_LABEL;
			break;
		}

		//uniform for fog
		if (fog_)
			z << VOL_UNIFORMS_FOG_LOC;

		//functions
		if (clip_)
			z << VOL_CLIP_FUNC;
		//the common head
		z << VOL_HEAD;

		if (peel_ != 0 || color_mode_ == 2)
			z << VOL_HEAD_2DMAP_LOC;

		//head for depth peeling
		if (peel_ == 1)//draw volume before 15
			z << VOL_HEAD_DP_1;
		else if (peel_ == 2 || peel_ == 5)//draw volume after 15
			z << VOL_HEAD_DP_2;
		else if (peel_ == 3 || peel_ == 4)//draw volume after 14 and before 15
			z << VOL_HEAD_DP_3;

		//head for clipping planes
		if (clip_)
			z << VOL_HEAD_CLIP_FUNC;

		// Set up light variables and input parameters.
		z << VOL_HEAD_LIT;

		// Set up fog variables and input parameters.
		if (fog_)
			z << VOL_HEAD_FOG;

		//bodies
		if (shading_)
		{
			//no gradient volume, need to calculate in real-time
			z << VOL_DATA_VOLUME_LOOKUP;

			if (hiqual_)
				z << VOL_GRAD_COMPUTE_HI;
			else
				z << VOL_GRAD_COMPUTE_LO;

			z << VOL_BODY_SHADING;

			if (channels_ == 1)
				z << VOL_COMPUTED_GM_LOOKUP;
			else
				z << VOL_TEXTURE_GM_LOOKUP;

			switch (color_mode_)
			{
			case 0://normal
				if (solid_)
					z << VOL_TRANSFER_FUNCTION_SIN_COLOR_SOLID;
				else
					z << VOL_TRANSFER_FUNCTION_SIN_COLOR;
				break;
			case 1://colormap
				if (solid_)
				{
					z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID;
					z << get_colormap_proj();
					z << get_colormap_code();
					z << VOL_COMMON_TRANSFER_FUNCTION_CALC;
					z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID_RESULT;
				}
				else
				{
					z << VOL_TRANSFER_FUNCTION_COLORMAP;
					z << get_colormap_proj();
					z << get_colormap_code();
					z << VOL_COMMON_TRANSFER_FUNCTION_CALC;
					z << VOL_TRANSFER_FUNCTION_COLORMAP_RESULT;
				}
				break;
			}

			z << VOL_COLOR_OUTPUT;
		}
		else // No shading
		{
			z << VOL_DATA_VOLUME_LOOKUP;

			if (channels_ == 1)
			{
				// Compute Gradient magnitude and use it.
				if (hiqual_)
					z << VOL_GRAD_COMPUTE_HI;
				else
					z << VOL_GRAD_COMPUTE_LO;

				z << VOL_COMPUTED_GM_LOOKUP;
			}
			else
			{
				z << VOL_TEXTURE_GM_LOOKUP;
			}

			if (mip_ && colormap_proj_)
			{
				z << VOL_TRANSFER_FUNCTION_MIP_COLOR_PROJ;
				z << get_colormap_proj();
				z << VOL_TRANSFER_FUNCTION_MIP_COLOR_PROJ_RESULT;
				z << VOL_RASTER_BLEND_SOLID;
			}
			else
			{
				switch (color_mode_)
				{
				case 0://normal
					if (solid_)
						z << VOL_TRANSFER_FUNCTION_SIN_COLOR_SOLID;
					else
						z << VOL_TRANSFER_FUNCTION_SIN_COLOR;
					break;
				case 1://colormap
					if (solid_)
					{
						z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID;
						z << get_colormap_proj();
						z << get_colormap_code();
						z << VOL_COMMON_TRANSFER_FUNCTION_CALC;
						z << VOL_TRANSFER_FUNCTION_COLORMAP_SOLID_RESULT;
					}
					else
					{
						z << VOL_TRANSFER_FUNCTION_COLORMAP;
						z << get_colormap_proj();
						z << get_colormap_code();
						z << VOL_COMMON_TRANSFER_FUNCTION_CALC;
						z << VOL_TRANSFER_FUNCTION_COLORMAP_RESULT;
					}
					break;
				case 2://depth map
					z << VOL_TRANSFER_FUNCTION_DEPTHMAP;
					break;
				}
			}
		}

		if (!(mip_ && colormap_proj_))
		{
			// fog
			if (fog_)
			{
				z << VOL_FOG_BODY;
			}

			//final blend
			switch (mask_)
			{
			case 0:
				if (color_mode_ == 2)
					z << VOL_RASTER_BLEND_DMAP;
				else
				{
					if (solid_)
						z << VOL_RASTER_BLEND_SOLID;
					else
						z << VOL_RASTER_BLEND;
				}
				break;
			case 1:
				if (color_mode_ == 2)
					z << VOL_RASTER_BLEND_MASK_DMAP;
				else
				{
					if (solid_)
						z << VOL_RASTER_BLEND_MASK_SOLID;
					else
						z << VOL_RASTER_BLEND_MASK;
				}
				break;
			case 2:
				if (color_mode_ == 2)
					z << VOL_RASTER_BLEND_NOMASK_DMAP;
				else
				{
					if (solid_)
						z << VOL_RASTER_BLEND_NOMASK_SOLID;
					else
						z << VOL_RASTER_BLEND_NOMASK;
				}
				break;
			case 3:
				z << VOL_RASTER_BLEND_LABEL;
				break;
			case 4:
				z << VOL_RASTER_BLEND_LABEL_MASK;
				break;
			}
		}

		//the common tail
		z << VOL_TAIL;

		//output
		s = z.str();
		return false;
	}
示例#2
0
	bool ImgShader::emit_f(string& s)
	{
		ostringstream z;

		z << ShaderProgram::glsl_version_;
		switch (type_)
		{
		case IMG_SHDR_DRAW_GEOMETRY:
			z << IMG_FRG_CODE_DRAW_GEOMETRY;
			break;
		case IMG_SHDR_DRAW_GEOMETRY_COLOR3:
			z << IMG_FRG_CODE_DRAW_GEOMETRY_COLOR3;
			break;
		case IMG_SHDR_DRAW_GEOMETRY_COLOR4:
			z << IMG_FRG_CODE_DRAW_GEOMETRY_COLOR4;
			break;
		case IMG_SHADER_TEXTURE_LOOKUP:
			z << IMG_SHADER_CODE_TEXTURE_LOOKUP;
			break;
		case IMG_SHDR_BRIGHTNESS_CONTRAST:
			z << IMG_SHADER_CODE_BRIGHTNESS_CONTRAST;
			break;
		case IMG_SHDR_BRIGHTNESS_CONTRAST_HDR:
			z << IMG_SHADER_CODE_BRIGHTNESS_CONTRAST_HDR;
			break;
		case IMG_SHDR_GRADIENT_MAP:
			z << IMG_SHADER_CODE_GRADIENT_MAP;
			z << get_colormap_code();
			z << IMG_SHADER_CODE_GRADIENT_MAP_RESULT;
			break;
		case IMG_SHDR_FILTER_BLUR:
			z << IMG_SHADER_CODE_FILTER_BLUR;
			break;
		case IMG_SHDR_FILTER_MAX:
			z << IMG_SHADER_CODE_FILTER_MAX;
			break;
		case IMG_SHDR_FILTER_SHARPEN:
			z << IMG_SHADER_CODE_FILTER_SHARPEN;
			break;
		case IMG_SHDR_DEPTH_TO_OUTLINES:
			z << IMG_SHADER_CODE_DEPTH_TO_OUTLINES;
			break;
		case IMG_SHDR_DEPTH_TO_GRADIENT:
			z << IMG_SHADER_CODE_DEPTH_TO_GRADIENT;
			break;
		case IMG_SHDR_GRADIENT_TO_SHADOW:
			z << IMG_SHADER_CODE_GRADIENT_TO_SHADOW;
			break;
		case IMG_SHDR_GRADIENT_TO_SHADOW_MESH:
			z << IMG_SHADER_CODE_GRADIENT_TO_SHADOW_MESH;
			break;
		case IMG_SHDR_BLEND_BRIGHT_BACKGROUND:
			z << IMG_SHADER_CODE_BLEND_BRIGHT_BACKGROUND;
			break;
		case IMG_SHDR_BLEND_BRIGHT_BACKGROUND_HDR:
			z << IMG_SHADER_CODE_BLEND_BRIGHT_BACKGROUND_HDR;
			break;
		case IMG_SHDR_PAINT:
			z << PAINT_SHADER_CODE;
			break;
		default:
			z << IMG_SHADER_CODE_TEXTURE_LOOKUP;
		}

		s = z.str();
		//std::cerr << s << std::endl;
		return false;
	}