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?
And the two shaders:
terrainP.hlsl
terrainV.hlsl
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;
}
Torque 3D Owner Sean H.
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.