Sign in to follow this  

Newbie HLSL Help

This topic is 4745 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

So I just hacked together a my first shader in HLSL. It ran perfect on my Geforce 6800, then I ran on a lab computer w/ a Quadro FX1000 and it is brought to a halt. I tried elimanting the # of the light sources and there are noticable performance hits on every setting except 1 light. Im trying to do simple per-pixel diffuse lighting. Im only trying to apply this shader to my terrain, which is pretty small (50x50 vertices) Im totally new to shaders so Im sure Im doing something terribly wrong. I know the distance(...) call in there is pretty bad but even when I replace it with a constant it still runs slow (and doesnt render properly obviously) I just want to get per-pixel diffuse lighting for as many light sources as possible. Im sure there are better ways to do it. Can anyone please help? Thank you Ratman
// -------------------------------------------------------------
// variables that are provided by the application
// -------------------------------------------------------------
float4x4 matWorldViewProj;	
float4x4 matWorld;	

float4  vSpecIC;

float4  vDIC1;
float4  vLightPos1;
float   vLightRange1;

float4  vDIC2;
float4  vLightPos2;
float   vLightRange2;

float4  vDIC3;
float4  vSpecIC3;
float4  vLightPos3;
float   vLightRange3;

float4  vDIC4;
float4  vSpecIC4;
float4  vLightPos4;
float   vLightRange4;

float4  vDIC5;
float4  vLightPos5;
float   vLightRange5;


float4  vecEye;
texture ColorMap;

sampler ColorMapSampler = sampler_state
{
   Texture = <ColorMap>;
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;      
};
// -------------------------------------------------------------
// Output channels
// -------------------------------------------------------------
struct VS_OUTPUT
{
    float4 Pos  : POSITION;     
    float2 TextUV: TEXCOORD0;   
    float4 Light: TEXCOORD1;
    float3 Norm : TEXCOORD2;  
    float4 Light2: TEXCOORD3;               
    float4 Light3: TEXCOORD4;
    float4 Light4: TEXCOORD5;
    float4 Light5: TEXCOORD6;
};

// -------------------------------------------------------------
// vertex shader function (input channels)
// -------------------------------------------------------------
VS_OUTPUT VS(float4 Pos : POSITION, float2 Tex: TEXCOORD0, float3 Normal : NORMAL, float3 Tangent : TANGENT)
{
    VS_OUTPUT Out = (VS_OUTPUT)0;              
    Out.TextUV = Tex;
    
     // compute the 3x3 tranform matrix 
    // to transform from world space to tangent space       
        
    // transform Position
    Out.Pos = mul(Pos, matWorldViewProj);	
    
    // transform Normal
    Out.Norm =  mul(Normal, matWorld);				
    
    float3 PosWorld = mul(Pos, matWorld);    
    
    float  range			= vLightRange1;
    float3 light		    = vLightPos1 - (PosWorld);	    
    
    //Light 1 Stuff
    
    float d = distance(vLightPos1.xyz, Pos.xyz);
    if(d > range) d = range;
    
    Out.Light = vLightPos1 - Pos;
    Out.Light.w = 1 - d/range;        
    if(range == 0) Out.Light.w = 0;       
    
    
    //Lgith 2 stuff    
    d     = distance(vLightPos2.xyz, Pos.xyz);
    range = vLightRange2;
    if(d > range) d = range;
    Out.Light2  = vLightPos2 - Pos;
    Out.Light2.w = 1 - d/range;
    if(range == 0) Out.Light2.w = 0;   
    
    //Light 3
    d     = distance(vLightPos3, Pos);
    range = vLightRange3;
    if(d > range) d = range;
    Out.Light3  = vLightPos3 - Pos;
    Out.Light3.w = 1 - d/range;
    if(range == 0) Out.Light3.w = 0;
    
    
     //Light 4
    d     = distance(vLightPos4, Pos);
    range = vLightRange4;
    if(d > range) d = range;
    Out.Light4  = vLightPos4 - Pos;
    Out.Light4.w = 1 - d/range;
    if(range == 0) Out.Light4.w = 0;        
    
    //Light 5
    d     = distance(vLightPos5, Pos);
    range = vLightRange5;
    if(d > range) d = range;
    Out.Light5  = vLightPos5 - Pos;
    Out.Light5.w = 1 - d/range;
    if(range == 0) Out.Light5.w = 0;         
    
    
    return Out;
}

// -------------------------------------------------------------
// Pixel Shader (input channels):output channel
// -------------------------------------------------------------
float4 PS(float2 TextUV: TEXCOORD0, float4 Light:TEXCOORD1, float3 Norm : TEXCOORD2, float4 Light2:TEXCOORD3, float4 Light3: TEXCOORD4, float4 Light4:TEXCOORD5,
           float4 Light5:TEXCOORD6) : COLOR
{
    float4 Acolor = tex2D(ColorMapSampler, TextUV);
    
    float3 Normal	= normalize(Norm);
    
    //Light1
    float3 LightDir = normalize(Light);        
    float  Diff = saturate(dot(Normal, LightDir));  
    
    //Light2    
    float3 LightDir2 = normalize(Light2);        
    float  Diff2 = saturate(dot(Normal, LightDir2));         
    
    //Light3    
    float3 LightDir3 = normalize(Light3);        
    float  Diff3 = saturate(dot(Normal, LightDir3));     
    
    //Light4
    float3 LightDir4 = normalize(Light4);        
    float  Diff4 = saturate(dot(Normal, LightDir4)); 
    
    //Light5
    float3 LightDir5 = normalize(Light5);        
    float  Diff5 = saturate(dot(Normal, LightDir5));        
    
    return  Acolor * ((.75) + (vDIC1 * Diff * Light.w) + (vDIC2 * Diff2 * Light2.w) + (vDIC3 * Diff3 * Light3.w) + (vDIC4 * Diff4 * Light4.w) + (vDIC5 * Diff5 * Light5.w)); 
}


// -------------------------------------------------------------
// 
// -------------------------------------------------------------
technique TShader
{
    pass P0
    {
		Sampler[0] = (ColorMapSampler);		
        // compile shaders
        VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
    }        
}


Share this post


Link to post
Share on other sites
Guest Anonymous Poster
dont quote me on this, but maybe doing multiple passes, each pass calculating only 2 lights?

i think it may be the sheer volume of pixel and vertex shader instructions that maybe causing the slow down.

also, 6800 has branch prediction for the if statements, AFAIK, no other cards have this, so remove all if statements that arnt absolutely necessary.

another thing, you have 1/range, what if range is zero? the hardware will have to deal with a division by zero exception wont it (you might not see it, but it mite be internal or something) ?

Cheers,
-Danu

Share this post


Link to post
Share on other sites

This topic is 4745 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this