Game Development Community

Normalmapping on Legacy Terrain

by Thomas Bang · in Torque Game Engine Advanced · 03/24/2011 (10:31 am) · 1 replies

Hi

I want to get Normalmapping on Legacy Terrain in TGEA 1.8.2. Where is the mistake?

new ShaderData( TerrShader )
{
   DXVertexShaderFile   = "shaders/legacyTerrain/terrainV.hlsl";
   DXPixelShaderFile    = "shaders/legacyTerrain/terrainP.hlsl";
   pixVersion = 2.0;
};

new CustomMaterial(TerrainMaterial)
{
   shader = TerrShader;
   version = 2.0;
   
   texture[3] = "scriptsAndAssets/data/terrains/details/detail_demo"; // Flat image
   texture[4] = "scriptsAndAssets/data/terrains/bricks9_normal"; // Actual normal map
   specular = "0.75 0.75 0.75";
   specularPower = 570.0;
   
   dynamicLightingMaterial = TerrainMaterialDynamicLighting;
   dynamicLightingMaskMaterial = TerrainMaterialDynamicLightingMask;
};

And the two shaders:

terrainP.hlsl

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

struct ConnectData
{
   float2 texCoord        : TEXCOORD0;
   float2 fogCoord        : TEXCOORD1;
   float2 lightMapCoord   : TEXCOORD2;
   float2 detCoord        : TEXCOORD3;
   float2 bumpCoord		  : TEXCOORD4;
   float3 eye			  : TEXCOORD5;
   float3 light			  : TEXCOORD6;
};


struct Fragout
{
   float4 col : COLOR0;
};


//-----------------------------------------------------------------------------
// Main                                                                        
//-----------------------------------------------------------------------------
Fragout main( ConnectData IN,
              uniform sampler2D diffuseMap      : register(S0),
              uniform sampler2D fogMap          : register(S1),
              uniform sampler2D lightMap        : register(S2),
              uniform sampler2D detailMap       : register(S3),
              uniform sampler2D bumpMap         : register(S4),
              uniform float4    ambient			: register(PC_AMBIENT_COLOR),
			  uniform float4    specular		: register(PC_MAT_SPECCOLOR),
			  uniform float     shine			: register(PC_MAT_SPECPOWER)
              )
{
   Fragout OUT;
   
   const float3 diffuse  = {1,1,1};
   
   float2 uv = IN.bumpCoord;
   	// view and light directions
	float3 v = normalize(IN.eye);
	float3 l = normalize(IN.light);
   
   float4 diffuseColor = tex2D(diffuseMap, IN.texCoord);
   diffuseColor *= tex2D(lightMap, IN.lightMapCoord) * 4.0;
   
   float4 lm = tex2D(lightMap, IN.lightMapCoord);
   
   float4 fogColor     = tex2D(fogMap,     IN.fogCoord);

   float4 detailColor = tex2D(detailMap, IN.detCoord);
   
   	float4 normal=tex2D(bumpMap,uv);
	normal.xyz=normalize(normal.xyz-0.5); 
	normal.y=-normal.y;
	
    float height = tex2D(bumpMap,uv).w * 0.06 - 0.03;
	uv += height * v.xy;
	
	float diff=saturate(dot(l,normal.xyz));
	float spec=saturate(dot(normalize(l-v),normal.xyz));


   OUT.col = lerp( diffuseColor * (detailColor) * (diff), fogColor, fogColor.a );
   
   return OUT;
}

terrainV.hlsl

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

//-----------------------------------------------------------------------------
// Structures                                                                  
//-----------------------------------------------------------------------------
struct VertData
{
   float2 texCoord        : TEXCOORD0;
   float4 position        : POSITION;
	float3 tangent         : TEXCOORD2;
	float3 binormal        : TEXCOORD3;
	float3 N               : TEXCOORD4;
	float3 normal          : NORMAL;
};


struct ConnectData
{
   float4 hpos            : POSITION;
   float2 texCoord        : TEXCOORD0;
   float2 fogCoord        : TEXCOORD1;
   float2 lightMapCoord   : TEXCOORD2;
   float2 detCoords       : TEXCOORD3;
   float2 bumpCoord		  : TEXCOORD4;
   float3 light			  : TEXCOORD6;
   float3 eye             : TEXCOORD5;
};

//-----------------------------------------------------------------------------
// Main                                                                        
//-----------------------------------------------------------------------------
ConnectData main( VertData IN,
                  uniform float4x4 modelview       : register(C0),
                  uniform float3   eyePos          : register(VC_EYE_POS),
                  uniform float3   fogData         : register(VC_FOGDATA),
                  uniform float1   terrainsize     : register(C54),
                  uniform float4x4 texMat          : register(VC_TEX_TRANS1),
                  uniform float3   lightpos        : register(VC_LIGHT_DIR1),
                  uniform float4x4 objTrans        : register(VC_OBJ_TRANS)
                  )
{
   ConnectData OUT;


   float4 pos=float4(IN.position.x,IN.position.y,IN.position.z,1.0);
   OUT.hpos=mul(modelview, pos);
   OUT.texCoord   = IN.texCoord;
   OUT.lightMapCoord = IN.position * terrainsize.x;
   OUT.fogCoord.x = 1.0 - ( distance( IN.position, eyePos ) / fogData.z );
   OUT.fogCoord.y = (IN.position.z - fogData.x) * fogData.y;
   OUT.detCoords = IN.position.xy / 2;
   OUT.bumpCoord = IN.position.xy / 2;
   
   float3x3 tangentspace=float3x3(IN.tangent,IN.binormal,IN.normal);

   	// vertex position in view space (with model transformations)
	float3 vpos=mul(modelview, pos).xyz;

	// view in tangent space
	float3 objectspace_view_vector = mul( IN.texCoord, eyePos ) - IN.position;
    OUT.eye = mul( tangentspace, objectspace_view_vector );
    OUT.eye = - OUT.eye;
	
	OUT.light.xyz = -lightpos;
	OUT.light.xyz = mul(tangentspace, OUT.light);
	OUT.light = OUT.light / 2.0 + 0.5;

   return OUT;
}

#1
03/26/2011 (12:59 pm)
you need to indicate what happened. Did you get an error? Did you get a shader error? or did you get no errors but incorrect terrain? if the terrain is incorrect, then you should indicate whats wrong with it.

your code looks correct to me. the only problem I see is that I dont think the terrain vertex structure defines tangent, binormal, and N, in TGEA. this means you would have to define those in the source which won't be a trivial task.