Der Camera einen Shader zuordnen

Posted By: grinseengel

Der Camera einen Shader zuordnen - 06/01/15 17:31

Hallo Community,

im User-WIKI befindet sich ein Blur-Shader. Wie kann ich der vorgegebenen Camera diesen Shader zuordnen? Das geht ja in diesem Fall nicht über eine Actions-Zuordnung. Kann mir jemand bei meinem Problem behilflich sein?

Gruß, Andreas
Posted By: rayp

Re: Der Camera einen Shader zuordnen - 06/01/15 17:47

Mittels
Code:
pp_add (shader);

oder
Code:
pp_set (camera, shader);

Vorher die mtlView.c per include einbinden ( natürlich nur wenn Du die Std - PP Shader nutzen willst ).

Wenn ich nicht irre, taucht PP_ADD nicht im Handbuch auf, btw. ^^

LG
Posted By: grinseengel

Re: Der Camera einen Shader zuordnen - 06/02/15 16:13

Vielen dank für deine Hilfe. Hat prima funktioniert.

Quote:
Wenn ich nicht irre, taucht PP_ADD nicht im Handbuch auf, btw. ^^


Das stimmt, ich habe auch nochmal nachgesehen.

Jetzt habe ich noch eine Frage. Ich benötige nur im Hintergrund eine gewisse Unschärfe. Mit welchem Shader ict dies möglich. Jedenfalls nicht mit den mitgelieferten Shadern aus der mtlView.c.

Gruß, Andreas
Posted By: rayp

Re: Der Camera einen Shader zuordnen - 06/02/15 16:59

Was Du willst nennt sich DoF ( depth of field ). Gibt es nicht in den Std. Shadern, aber in ShadeC ( dem Tor zur modernen Welt grin ).

Vorsicht: Ein schlechter DoF PP killt Dir die Framerate, aber so was von! ^^

MfG
Posted By: grinseengel

Re: Der Camera einen Shader zuordnen - 06/03/15 14:22

Ok, die ShadeC habe ich mir jetzt geladen. Ein weiteres Problem habe ich. Das Einbinden der Shader bereitet mir große Probleme. Ich ahbe jetzt den DoF Shader.

Das ist die Dof.h

Code:
void sc_dof_init(SC_SCREEN* screen);
void sc_dof_destroy(SC_SCREEN* screen);
void sc_dof_frm(SC_SCREEN* screen);

STRING* sc_dof_sMaterial = "sc_dof.fx";
STRING* sc_dof_sMaterialDownsample = "sc_dof_downsample.fx";
STRING* sc_dof_sMaterialBlurX = "sc_dof_blurX.fx";
STRING* sc_dof_sMaterialBlurY = "sc_dof_blurY.fx";



Das ist die Dof.c:

Code:
void sc_dof_MaterialEvent()
{
	SC_SCREEN* screen = (SC_SCREEN*)(mtl.SC_SKILL);
	/*
	if(screen)
	{
		if(screen.views.gBuffer == NULL)
		{
			//free(screen);
			return(1);
		}
	}
	else
	{
		//free(screen);
		return(1);
	}
	*/
	switch(render_view)
	{
		case screen.views.dof:
			screen.views.preDOF.bmap = screen.renderTargets.full0;
			break;
			
		case screen.views.dofDownsample:
			screen.views.preDOF.bmap = screen.renderTargets.full0;
			screen.views.dofDownsample.bmap = screen.renderTargets.quarter0;
			break;
			
		case screen.views.dofBlurX:
			screen.views.dofBlurX.bmap = screen.renderTargets.quarter1;
			screen.views.dofBlurX.target1 = screen.renderTargets.quarter2;
			break;
		
		case screen.views.dofBlurY:
			screen.views.dofBlurY.bmap = screen.renderTargets.quarter0;
			break;
		
		default:
			break;
	}
	//if(render_view == screen.views.dofDownsample) screen.views.deferred.bmap = screen.renderTargets.full0;
	//else screen.views.deferred.bmap = NULL;
}

void sc_dof_init(SC_SCREEN* screen)
{
	//create materials
	
		//dof
		screen.materials.dof = mtl_create();
		effect_load(screen.materials.dof, sc_dof_sMaterial);
		screen.materials.dof.skin1 = screen.renderTargets.full0;// this contains the current scene without dof
		screen.materials.dof.skin2 = screen.renderTargets.quarter0;// this contains the blurred scene
		screen.materials.dof.skin3 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH];
		screen.materials.dof.skill1 = floatv(0.25); // inverted downsample factor
		screen.materials.dof.event = sc_dof_MaterialEvent;
		screen.materials.dof.SC_SKILL = screen;
		set(screen.materials.dof, ENABLE_VIEW);
	
		//blur y
		screen.materials.dofBlurY = mtl_create();
		effect_load(screen.materials.dofBlurY, sc_dof_sMaterialBlurY);
		screen.materials.dofBlurY.skin1 = screen.renderTargets.quarter1;// this contains the x blurred scene, with unblurred focus
		screen.materials.dofBlurY.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH];
		screen.materials.dofBlurY.skin3 = screen.renderTargets.quarter2;// this contains the downsampled scene, with blurred focus
		screen.materials.dofBlurY.skill1 = floatv(screen.settings.dof.blurY); //blur strength
		screen.materials.dofBlurY.event = sc_dof_MaterialEvent;
		screen.materials.dofBlurY.SC_SKILL = screen;
		set(screen.materials.dofBlurY, ENABLE_VIEW);
			
		//blur x
		screen.materials.dofBlurX = mtl_create();
		effect_load(screen.materials.dofBlurX, sc_dof_sMaterialBlurX);
		screen.materials.dofBlurX.skin1 = screen.renderTargets.quarter0;// this contains the downsampled scene
		screen.materials.dofBlurX.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH];
		screen.materials.dofBlurX.skill1 = floatv(screen.settings.dof.blurX); //blur strength
		screen.materials.dofBlurX.event = sc_dof_MaterialEvent;
		screen.materials.dofBlurX.SC_SKILL = screen;
		set(screen.materials.dofBlurX, ENABLE_VIEW);
		
		//downsample
		screen.materials.dofDownsample = mtl_create();
		effect_load(screen.materials.dofDownsample, sc_dof_sMaterialDownsample);
		screen.materials.dofDownsample.skin1 = screen.renderTargets.full0;// this contains the current scene without dof
		screen.materials.dofDownsample.skin2 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH];
		screen.materials.dofDownsample.skill1 = floatv(4); //downsample factor
		screen.materials.dofDownsample.event = sc_dof_MaterialEvent;
		screen.materials.dofDownsample.SC_SKILL = screen;
		set(screen.materials.dofDownsample, ENABLE_VIEW);
	
	
	//setup views
	
		//dof
		screen.views.dof = view_create(2);
		set(screen.views.dof, PROCESS_TARGET);
		set(screen.views.dof, UNTOUCHABLE);
		set(screen.views.dof, NOSHADOW);
		reset(screen.views.dof, AUDIBLE);
		set(screen.views.dof, CHILD);
		screen.views.dof.size_x = screen.views.main.size_x;
		screen.views.dof.size_y = screen.views.main.size_y;
		screen.views.dof.material = screen.materials.dof;
		//screen.views.dof.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one
	
		//blur y
		screen.views.dofBlurY = view_create(2);
		set(screen.views.dofBlurY, PROCESS_TARGET);
		set(screen.views.dofBlurY, UNTOUCHABLE);
		set(screen.views.dofBlurY, NOSHADOW);
		reset(screen.views.dofBlurY, AUDIBLE);
		set(screen.views.dofBlurY, CHILD);
		screen.views.dofBlurY.size_x = screen.views.main.size_x/4;
		screen.views.dofBlurY.size_y = screen.views.main.size_y/4;
		screen.views.dofBlurY.material = screen.materials.dofBlurY;
		screen.views.dofBlurY.stage = screen.views.dof;
		screen.views.dofBlurY.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one
		
		//blur x
		screen.views.dofBlurX = view_create(2);
		set(screen.views.dofBlurX, PROCESS_TARGET);
		set(screen.views.dofBlurX, UNTOUCHABLE);
		set(screen.views.dofBlurX, NOSHADOW);
		reset(screen.views.dofBlurX, AUDIBLE);
		set(screen.views.dofBlurX, CHILD);
		screen.views.dofBlurX.size_x = screen.views.main.size_x/4;
		screen.views.dofBlurX.size_y = screen.views.main.size_y/4;
		screen.views.dofBlurX.material = screen.materials.dofBlurX;
		screen.views.dofBlurX.stage = screen.views.dofBlurY;
		screen.views.dofBlurX.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one
		screen.views.dofBlurX.target1 = screen.renderTargets.quarter2; //assign temp render target so Acknex does not automatically create a new one
		
		//downsample
		screen.views.dofDownsample = view_create(2);
		set(screen.views.dofDownsample, PROCESS_TARGET);
		set(screen.views.dofDownsample, UNTOUCHABLE);
		set(screen.views.dofDownsample, NOSHADOW);
		reset(screen.views.dofDownsample, AUDIBLE);
		set(screen.views.dofDownsample, CHILD);
		screen.views.dofDownsample.size_x = screen.views.main.size_x/4;
		screen.views.dofDownsample.size_y = screen.views.main.size_y/4;
		screen.views.dofDownsample.material = screen.materials.dofDownsample;
		screen.views.dofDownsample.stage = screen.views.dofBlurX;
		screen.views.dofDownsample.bmap = screen.renderTargets.quarter0; //assign temp render target so Acknex does not automatically create a new one
		
		
		
	//apply to camera
	VIEW* view_last;
	view_last = screen.views.main;
	while(view_last.stage != NULL)
	{
		view_last = view_last.stage;
	}
	view_last.stage = screen.views.dofDownsample;
	screen.views.preDOF = view_last;
}

void sc_dof_destroy(SC_SCREEN* screen)
{
	if(!screen) return 0;
	if(screen.views.dof != NULL)
	{
		if(is(screen.views.dof,NOSHADOW))
		{
			
			reset(screen.views.dof,NOSHADOW);
			//purge render targets
			//bmap_purge(screen.views.deferred.bmap);
			//screen.views.deferred.bmap = NULL;
						
			//remove from view chain
			VIEW* view_last;
			view_last = screen.views.main;
			while(view_last.stage != screen.views.dofDownsample && view_last.stage != NULL)
			{
				view_last = view_last.stage;
			}
				
			if(screen.views.dof.stage) view_last.stage = screen.views.dof.stage;
			else view_last.stage = NULL;
			
			//if(screen.sc_dof_view.bmap) view_last.bmap = screen.sc_dof_mapOrgScene;
			//else view_last.bmap = NULL;
		}
	}
	return 1;
}

void sc_dof_frm(SC_SCREEN* screen)
{
	if(screen.views.dof != NULL)
	{
		screen.materials.dofDownsample.skill2 = floatv(screen.views.main.clip_far);
		screen.materials.dofDownsample.skill3 = floatv(screen.settings.dof.focalPos); //focal plane pos
		screen.materials.dofDownsample.skill4 = floatv(screen.settings.dof.focalWidth); //focal plane width
		
		screen.materials.dof.skill2 = floatv(screen.views.main.clip_far);
		screen.materials.dof.skill3 = floatv(screen.settings.dof.focalPos); //focal plane pos
		screen.materials.dof.skill4 = floatv(screen.settings.dof.focalWidth); //focal plane width
		
		screen.materials.dofBlurX.skill1 = floatv(screen.settings.dof.blurX); //blur strength
		screen.materials.dofBlurY.skill1 = floatv(screen.settings.dof.blurY); //blur strength
	}
}



Wie rufe ich das jetzt von meinem Projekt aus auf?
Posted By: rayp

Re: Der Camera einen Shader zuordnen - 06/04/15 17:09

So weit ich weiss darf man einzelne Teile nicht aus ShadeC entfernen. Ich dürfte / will Dir also nur helfen, so fern Du ShadeC komplett einbindest. Sry. ^^

edit: Wie man ihn dann nutzt, steht in den Dokus, ist ruck zuck eingestellt.

edit2: Grad fällt mir ein, Du könntest auch den DoF von "Slin" hier im Forum suchen, der war stand - alone. mfg

© 2024 lite-C Forums