Game Development Community

Issue with Fog in Shader using CustomMaterial

by Jason Viterna · in Torque Game Engine Advanced · 05/21/2009 (3:36 pm) · 1 replies

Hello, I'm very new to Torque and am having an issue with the fog color in my shader. I've written a shader based on the generated shader files:

redShaderV.hlsl

#define IN_HLSL
#include "../shdrConsts.h"


//---------------------------------------------------------------
// Constants
//---------------------------------------------------------------
struct Appdata
{
    float4 position        : POSITION;
    float3 normal		   : NORMAL;
	float4 texCoord        : TEXCOORD0;
	float2 lmCoord         : TEXCOORD1;
    float3 T               : TEXCOORD2;
    float3 B               : TEXCOORD3;
	

};
struct Conn
{
   float4 hPos             : POSITION;
   float2 outTexCoord      : TEXCOORD0;
   float4 shading         : COLOR;
   float2 fogCoord        : TEXCOORD1;

};
//---------------------------------------------------------------
// Main
//---------------------------------------------------------------
Conn main( Appdata IN, uniform float4x4 modelview : register(VC_WORLD_PROJ),
			     uniform float4x4 texMat          : register(VC_TEX_TRANS1),
				 uniform float3   inLightVec      : register(C21),
				 uniform float4   inLightColor    : register(C8),
				 uniform float3   eyePosWorld     : register(C10),
                  uniform float3   fogData        : register(C11),
                  uniform float4x4 objTrans       : register(C12)

 )
{
   Conn Out;

   //take vert and get coord by transforming by modelviewmatrix
   Out.hPos = mul(modelview, IN.position);
   //set base texture coord
   Out.outTexCoord = mul(texMat, IN.texCoord);
   Out.shading = saturate( dot(-inLightVec, normalize(IN.normal)) );
   Out.shading *= inLightColor;
   Out.shading.w = 1.0;
   

   // fog setup
   float3 transPos = mul( objTrans, IN.position );
   Out.fogCoord.x = 1.0 - ( distance( transPos, eyePosWorld ) / fogData.z );
   Out.fogCoord.y = (transPos.z - fogData.x) * fogData.y;
   
   return Out;
}

redShaderP.hlsl

#include "../shdrConsts.h"

struct ConnectData
{
   float4 hPos          : POSITION;
   float2 texCoord      : TEXCOORD0;
   float4 shading       : COLOR;
   float2 fogCoord      : TEXCOORD1;
};
struct Fragout
{
   float4 col : COLOR0;
};



//--------------------------------------------------------------
//Main                                                          
//--------------------------------------------------------------
Fragout main(ConnectData IN,  
uniform sampler2D baseTex      : register(S0),
uniform sampler2D SSAOMap         : register(S1),
uniform sampler2D fogMap          : register(S2),
uniform float4    ambient         : register(C0),
uniform float4 diffuseMaterialColor : register(C2),
uniform float     visibility      : register(C1)
              
)
{
   Fragout OUT;  
   
   float4 diffuseTextureColor = tex2D( baseTex, IN.texCoord );
   OUT.col = (ambient + diffuseTextureColor * IN.shading) * diffuseMaterialColor;
   
   // fog color
   float4 fogColor = tex2D(fogMap, IN.fogCoord);
   OUT.col.rgb = lerp(OUT.col.rgb, fogColor.rgb, fogColor.a);
   
   return OUT;
}

The result is the object that I apply the shader to becomes a solid gray regardless of camera position. Does anyone see any problems with the shader files? This should be the same fog color computation that was used in the generated shader files. Here is what my CustomMaterial datablock looks like:

new ShaderData(bloodRed)
{
   DXVertexShaderFile 	= "shaders/custom/redShaderV.hlsl";
   DXPixelShaderFile 	= "shaders/custom/redShaderP.hlsl";           
   pixVersion = 2.0;
};

new CustomMaterial(pork)
{
mapTo = "blood";
shader = bloodRed;
diffuse = "1.0 0.0 0.0 0.0";
texture[0] = "~/data/test/blood";
texture[1] = "$fog";
version = 2.0;
};

Any help is greatly appreciated. Thanks!