Game Development Community

A delightfully interesting terrain error

by Matt Vitelli · in General Discussion · 08/10/2007 (11:36 pm) · 6 replies

While playing around with some shader code trying to map a detail texture to only a certain part of the map, I came across a delightfully appealing terrain error. If anyone wants the source code to this, just ask.

i63.photobucket.com/albums/h138/eternaldark112/terrainerror3.png
i63.photobucket.com/albums/h138/eternaldark112/terrainerror2.png
i63.photobucket.com/albums/h138/eternaldark112/terrainerror.png

#1
08/11/2007 (4:20 am)
Looks hot. What happened? :)
#2
08/11/2007 (10:22 am)
Well, basically I've been playing around with RGB settings, so I tried to get the detail texture to apply according to the terrain's red channel. The result, that terrain. The normal map is the only thing that keeps it from looking awful.
#3
08/11/2007 (3:52 pm)
@Matt, what are we looking at here? I'm not entirely sure :p That said, it does look interesting.
#4
08/11/2007 (7:16 pm)
Wow.. interesting shading hehehehe...

and more when it was by accident

cheers
#5
08/12/2007 (2:43 am)
Intresting, you going to share the source? :P
#6
08/12/2007 (9:46 am)
TerrainP
//Copyright 2007 Matt Vitelli
//-----------------------------------------------------------------------------
// 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)
)
{
   Fragout OUT;
   
   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) * 10.0;
   
   float4 lm = tex2D(lightMap, IN.lightMapCoord);
   
   float4 fogColor     = tex2D(fogMap,     IN.fogCoord);

   float4 detailColor = tex2D(detailMap, IN.detCoord);
   
   float3 detail;
   detail.r = tex2D(detailMap, diffuseColor.r).r;
   detail.g = tex2D(detailMap, diffuseColor.r).r;
   detail.b = tex2D(detailMap, diffuseColor.r).r;
   
   	float4 normal=tex2D(bumpMap,IN.bumpCoord);
	normal.xyz=normalize(normal.xyz-0.5); 
	normal.y=-normal.y;
	
	float diff=saturate(dot(l,normal.xyz));
	float4 color = diffuseColor * float4(detail,1) * diff;
   OUT.col = lerp( color, fogColor, fogColor.a );
   
   return OUT;
}

TerrainV
//Copyright 2007 Matt Vitelli
#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;
}

mygame/data/terrains/materials.cs
new CustomMaterial(TerrainMaterial)
{
   shader = TerrShader;
   version = 2.0;

   texture[3] = "~/data/terrains/details/detail5_hi";
   texture[4] = "~/data/terrains/details/terrainNmap1";
   
   dynamicLightingMaterial = TerrainMaterialDynamicLighting;
   dynamicLightingMaskMaterial = TerrainMaterialDynamicLightingMask;
   preload = true;
};