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:
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:
Any help is greatly appreciated. Thanks!
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!
Torque Owner Jason Viterna