Spotlight vs. Dynamic light

Posted By: 3run

Spotlight vs. Dynamic light - 11/21/12 23:02

I know how to add simple dynamic point light support into the shader, but how do I add spotlight support?? Here is the Per Pixel Lighting (supporting 4 lights and the sun) from Slins collection, and spotlight doesn't work with it..
Code:
MATERIAL* OS_O_PerPixelLighting_ps20_mat =
{
	effect =
	"
		//Variables
		float4x4 matWorld;
		float4x4 matWorldViewProj;
		
		float4 vecFog;
		float4 vecTime;
		float4 vecColor;
		float4 vecViewDir;
		float4 vecViewPos;
		float4 vecSunDir;
		float4 vecSunColor;
		float4 vecLight;
		float4 vecLightPos[8];
		float4 vecLightColor[8];
		float fAlpha;
		
		
		//Textures
		texture entSkin1;
		
		
		//Sampler
		sampler colorMap = sampler_state
		{
			Texture = (entSkin1);
			AddressU = Wrap;
			AddressV = Wrap;
			
			MagFilter = Linear;
			MinFilter = Linear;
			MipFilter = Linear;
		};
		
		//Structs
		struct VS_TO_PS // Output to the pixelshader
		{
			float4 Pos	: POSITION;
			float  Fog	: FOG;
			
			float2 Tex0	: TEXCOORD0;
			float3 WPos	: TEXCOORD1;
			float3 Norm	: TEXCOORD2;
		};
		
		
		//Vertexshader
		VS_TO_PS VS_v0(	float4 inPos		: POSITION,
								float3 inNormal	: NORMAL,
								float2 inTex0		: TEXCOORD0	)
		{
			VS_TO_PS Out;
			
			//Do transformations
			Out.Pos = mul(inPos,matWorldViewProj);
			
			//Pass the Texcoords
			Out.Tex0 = inTex0;
			
			//Vertexposition in worldspace
			Out.WPos = mul(inPos,matWorld);
			
			//Vertexnormal
			Out.Norm = normalize(mul(inNormal,matWorld));
			
			//Fog
			Out.Fog = 1 - (distance(Out.WPos,vecViewPos)-vecFog.x) * vecFog.z;
			
			return Out;
		}
		
		
		//Pixelshader
		float4 PS_p0( VS_TO_PS In ) : COLOR
		{
			float3 LightDir;
			float3 Diffuse = vecLight.rgb+0.5+saturate(dot(-vecSunDir,In.Norm))*vecSunColor;
			float attenuation = 0;
			
			for(int i = 0; i < 4; i++)
			{
				LightDir = vecLightPos[i]-In.WPos;
				attenuation = saturate(1.0f - length(LightDir/vecLightPos[i].w));
				Diffuse += saturate(dot(normalize(LightDir),In.Norm))*vecLightColor[i]*attenuation;
			}
			
			float4 Color = tex2D(colorMap,In.Tex0);
			Color.rgb *= Diffuse;
			
			Color.a = step(0.5,Color.a);
			
			return Color;
		}
		
		
		//////////////////////////////////////////////////////////////////
		technique Lighting
		{
			pass one
			{
				AlphaTestEnable = True;
				zWriteEnable = true;
				
				VertexShader = compile vs_1_1 VS_v0();
				PixelShader = compile ps_2_0 PS_p0();
			}
		}
		
		technique fallback { pass one { } }
	";
}


If I assign this shader to terrain (just to see how it works) I get nothing, but if I debug via F11, I can see the spotlight.. WTF? Where can I read about spotlight stuff??
Here are the screens to show the problem:
Quote:
Without debugging:

With debugging:

And as you can see, model isn't affected by light anyway.. only terrain, what could cause this?
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/21/12 23:28

I can create an example for you but right now it's too late, sorry.
I'll have a look tomorrow wink
Posted By: 3run

Re: Spotlight vs. Dynamic light - 11/21/12 23:40

No need to hurry my friend laugh I'll wait for it, thank you for your time.
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/22/12 16:20

Okay, I added simple spotlight support to the shader wink
The only drawbacks are a static spotlight arc and that it now needs ps and vs 3.0; I hope thats ok smirk

I also changed the ambient lighting. It's now controlled by entity.ambient.

download
Posted By: 3run

Re: Spotlight vs. Dynamic light - 11/22/12 16:39

It's perfect man! laugh Thank you very much, Random also needed this for his horror project, so you got already two projects with credit of your name wink
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/22/12 16:55

Great to hear that smile

Actually it are only 5 simple lines of code, but when I was adding spotlight
support to my own object shader it took me a long time to get it working smirk

Anyway, I'm glad that you like it laugh
Posted By: Random

Re: Spotlight vs. Dynamic light - 11/22/12 21:42

Potato-man saves the day!
You defiantly have my credits ^^
Posted By: Random

Re: Spotlight vs. Dynamic light - 11/22/12 21:54

Is there a way to make everything alot darker??
Posted By: 3dgs_snake

Re: Spotlight vs. Dynamic light - 11/23/12 09:35

I think you can do it in many ways but one way (and not the best) is to multiply the diffuse term with a number bellow 1 (I'm not a shader expert tongue ).

Code:
Color.rgb *= Diffuse * 0.02;



I think it is best to have that in a variable that can be changed easily.
Posted By: Random

Re: Spotlight vs. Dynamic light - 11/23/12 13:19

Well, now the shader doesn`t support lights at all...
Posted By: 3run

Re: Spotlight vs. Dynamic light - 11/23/12 13:28

I tried to you point lights, but I got some problems.. Here are the screens:
Quote:
One:

Two:
Looks like point lights are too weak or something?? I used large lightrange, as you can see on debug screen.
Posted By: 3dgs_snake

Re: Spotlight vs. Dynamic light - 11/23/12 13:29

grin It still suports light but darker. Just 0.02 by something else (As I said, I'm not a shader expert grin ).
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/23/12 13:40

Code:
#define SpotlightArc  10.0f 			// Spotlight-Cone-Arc,  ~(180 / Angle)^2   ||   4 = 90°;  16 = 45°
#define SpotlightArc2  9.0f 			// == SpotlightArc - 1

//Variables
float4x4 matWorld;
float4x4 matWorldViewProj;

float4 vecFog;
float4 vecTime;
float4 vecColor;
float4 vecViewDir;
float4 vecViewPos;
float4 vecSunDir;
float4 vecSunColor;
float4 vecLight;
float4 vecLightPos[8];
float4 vecLightDir[8];
float4 vecLightColor[8];
float fAlpha;
float fAmbient;


//Textures
texture entSkin1;


//Sampler
sampler colorMap = sampler_state
{
	Texture = (entSkin1);
	AddressU = Wrap;
	AddressV = Wrap;
	
	MagFilter = Linear;
	MinFilter = Linear;
	MipFilter = Linear;
};

//Structs
struct VS_TO_PS // Output to the pixelshader
{
	float4 Pos	: POSITION;
	float  Fog	: FOG;
	
	float2 Tex0	: TEXCOORD0;
	float3 WPos	: TEXCOORD1;
	float3 Norm	: TEXCOORD2;
};


//Vertexshader
VS_TO_PS VS_v0(	float4 inPos		: POSITION,
float3 inNormal	: NORMAL,
float2 inTex0		: TEXCOORD0	)
{
	VS_TO_PS Out;
	
	//Do transformations
	Out.Pos = mul(inPos,matWorldViewProj);
	
	//Pass the Texcoords
	Out.Tex0 = inTex0;
	
	//Vertexposition in worldspace
	Out.WPos = mul(inPos,matWorld);
	
	//Vertexnormal
	Out.Norm = normalize(mul(inNormal,matWorld));
	
	//Fog
	Out.Fog = 1 - (distance(Out.WPos,vecViewPos)-vecFog.x) * vecFog.z;
	
	return Out;
}


//Pixelshader
float4 PS_p0( VS_TO_PS In ) : COLOR
{
	float3 LightDir;
	float3 Diffuse = fAmbient+saturate(dot(-vecSunDir,In.Norm))*vecSunColor;
	float attenuation = 0;
	
	for(int i = 0; i < 8; i++)
	{
		LightDir = normalize(vecLightPos[i] - In.WPos);
		attenuation = saturate(1.0f - length(LightDir/vecLightPos[i].w));
		
		if(vecLightDir[i].w > 0) // Spotlight?
			attenuation = saturate(attenuation * dot(-normalize(vecLightDir[i].xyz), LightDir) * SpotlightArc - SpotlightArc2);
		
		Diffuse += saturate(dot(normalize(LightDir),In.Norm))*vecLightColor[i]*attenuation;
	}
	
	float4 Color = tex2D(colorMap,In.Tex0);
	Color.rgb *= Diffuse;
	
	Color.a = step(0.5,Color.a);
	
	return Color;
}


//////////////////////////////////////////////////////////////////
technique Lighting
{
	pass one
	{
		AlphaTestEnable = True;
		zWriteEnable = true;
		
		VertexShader = compile vs_3_0 VS_v0();
		PixelShader = compile ps_3_0 PS_p0();
	}
}

technique fallback { pass one { } }


This version of the shader uses entity.ambient as ambient brightness only (and supports now 8 lights).
This should work for making things darker wink

@3run did you set the *entity.red green and blue high enough?
This controlls the light color and brightness.

EDIT: * I mean the entity which you're using as pointlight.

EDIT#2: I've tested it, the pointlight works fine, I guess you left the entity.red / green / blue at default.
Posted By: 3run

Re: Spotlight vs. Dynamic light - 11/23/12 14:49

I've created it like this:
Code:
// Point light:
you = ent_create("box.mdl", vector(0, 0, 5), NULL);
you.lightrange = 100;
vec_fill(you.blue, 250);

Problem still remains, see pictures above. I can upload a demo laugh
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/23/12 15:12

well if it isn't the light color, then the light is too near to the surface.
Posted By: 3run

Re: Spotlight vs. Dynamic light - 11/23/12 15:24

ups grin my bad, thank you again laugh
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/23/12 15:25

no problem grin
let me know if theres somthing else I can help you with.
Posted By: Kartoffel

Re: Spotlight vs. Dynamic light - 11/23/12 20:03

Originally Posted By: Random
Potato-man saves the day!

haha, I've got to use that as my new signature grin
Posted By: Random

Re: Spotlight vs. Dynamic light - 11/24/12 16:51

hahaha ^^
Posted By: Random

Re: Spotlight vs. Dynamic light - 11/25/12 17:17

Kartoffel, this is a little code pice by "grafton" from aum 71:

Code:
BMAP* projectiontex = "Spotlight1.jpg";

VECTOR temp_vec;  

function mtlProjection_event()  
{
	float pTexAdj[16] = { 0.5, 0.0, 0.0, 0.0, 0.0,-0.5,	0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 }; 
	pTexAdj[12] = 0.5 + (0.5/(float)bmap_width(projectiontex));
	pTexAdj[13] = 0.5 + (0.5/(float)bmap_height(projectiontex));
	mat_set(Levelgeometrie_bump.matrix,matViewProj);	 
	mat_multiply(Levelgeometrie_bump.matrix,pTexAdj);  
}

MATERIAL* mtlProjView =               
{
effect = " technique DepthTechnique { pass p0 {	}}";  
	event = mtlProjection_event;  
	flags = ENABLE_VIEW;		        
}

VIEW* ProjectionView =             
{
	material = mtlProjView;
	flags = VISIBLE;	
}

function initstages_startup()
{
	ProjectionView.stage = camera; 
}



I was wondering if I could attach an projection texture (from the spotlight) to your shader with this. But it didn`t work.

Do you know why it didn`t work?
© 2024 lite-C Forums