Skip to main content
GameDev.net gamedev.net
🔒 Locked 🎮 Unity

Newbie HLSL Help

Started by Ratman Dec 16, 2004 at 3:39 PM 3 replies 1.3k views
Original Post
Ratman
Ratman
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();
    }        
}


Ratman
Ratman
Thanks for the reply, I'll try that out.
noVum
noVum
The Quadro FX 1000 is based on NV3x, that is known for its bad pixel shading units...

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.