Started using texture atlas instead of many small meshes.

This commit is contained in:
David Williams
2007-12-03 22:24:48 +00:00
parent ee060d85d3
commit 31656cb68b
11 changed files with 317 additions and 43 deletions

View File

@ -0,0 +1,44 @@
struct v2f
{
float4 Position : POSITION; //in projection space
float4 Color : COLOR;
float4 TexCoords : TEXCOORD0;
float4 Normal : TEXCOORD1;
float Alpha : TEXCOORD2;
};
float4 main(v2f IN, uniform sampler2D colourMap : TEXUNIT0) : COLOR
{
/*OUT.TexCoordsXY.xy = OUT.Position.xy;
OUT.TexCoordsYZ.xy = OUT.Position.yz;
OUT.TexCoordsXZ.xy = OUT.Position.xz;*/
/*OUT.TexCoordsXY.xy /= textureScale;
OUT.TexCoordsYZ.xy /= textureScale;
OUT.TexCoordsXZ.xy /= textureScale;*/
IN.TexCoords /= 16;
IN.TexCoords.x = frac(IN.TexCoords.x);
IN.TexCoords.y = frac(IN.TexCoords.y);
IN.TexCoords.z = frac(IN.TexCoords.z);
IN.TexCoords /= 4.0;
float material = floor(IN.Alpha);
float y = floor(material / 4.0);
//float x = material - y;
float x = fmod(material,4.0);
//x = 1.0 - x;
float2 offset = float2(x,y);
offset /= 4.0;
float3 colourMapValueXY = tex2D(colourMap, IN.TexCoords.xy + offset).rgb * abs(IN.Normal.z);
float3 colourMapValueYZ = tex2D(colourMap, IN.TexCoords.yz + offset).rgb * abs(IN.Normal.x);
float3 colourMapValueXZ = tex2D(colourMap, IN.TexCoords.xz + offset).rgb * abs(IN.Normal.y);
float3 colourMapValue = colourMapValueXY + colourMapValueYZ + colourMapValueXZ;
//colourMapValue /= 3.0;
return float4(colourMapValue*IN.Color.rgb,1.0);
//return float4(1.0,0.0,0.0,1.0);
}

View File

@ -0,0 +1,138 @@
struct a2v
{
float4 Position : POSITION; //in object space
float3 Normal : NORMAL;
float Alpha : TEXCOORD0;
};
struct v2f
{
float4 Position : POSITION; //in projection space
float4 Color : COLOR;
float4 TexCoords : TEXCOORD0;
float4 Normal : TEXCOORD1;
float Alpha : TEXCOORD2;
};
struct light
{
float4 position;
float4 diffuseColour;
float4 attenuation;
};
v2f doWork(a2v IN, float4x4 world, float4x4 viewProj, float4 ambient, int iNoOfLights, light lights[4])
{
v2f OUT;
OUT.Position = mul(world, IN.Position);
float3 uVec;
float3 vVec;
IN.Normal = normalize(IN.Normal);
/*float absX = abs(IN.Normal.x);
float absY = abs(IN.Normal.y);
float absZ = abs(IN.Normal.z);
if((absZ <= absX) && (absZ <= absY))
{
//OUT.TexCoords.xy = OUT.Position.xy /textureScale;
uVec = float3(-IN.Normal.y, IN.Normal.x,0);
}
else if((absY <= absX) && (absY <= absZ))
{
//OUT.TexCoords.xy = OUT.Position.xz /textureScale;
uVec = float3(-IN.Normal.z, 0, IN.Normal.x);
}
else if((absX <= absZ) && (absX <= absY))
{
// OUT.TexCoords.xy = OUT.Position.yz /textureScale;
uVec = float3(0, -IN.Normal.z, IN.Normal.y);
}
vVec = cross(IN.Normal, uVec);
OUT.TexCoords.x = dot(OUT.Position.xyz, uVec);
OUT.TexCoords.y = dot(OUT.Position.xyz, vVec); */
//OUT.TexCoords.xy = OUT.Position.xy * IN.Normal.z * IN.Normal.z + OUT.Position.xz * IN.Normal.y * IN.Normal.y + OUT.Position.yz * IN.Normal.x * IN.Normal.x;
//OUT.TexCoords.xy /= textureScale;
/*OUT.TexCoordsXY.xy = OUT.Position.xy;
OUT.TexCoordsYZ.xy = OUT.Position.yz;
OUT.TexCoordsXZ.xy = OUT.Position.xz;
OUT.TexCoordsXY.xy /= textureScale;
OUT.TexCoordsYZ.xy /= textureScale;
OUT.TexCoordsXZ.xy /= textureScale;*/
OUT.Normal = float4(IN.Normal,0.0);
OUT.TexCoords = OUT.Position;
//OUT.TexCoords.xy = OUT.Position.yz /textureScale;
/*OUT.TexCoordsXY.w = 1;
OUT.TexCoordsYZ.w = 1;
OUT.TexCoordsXZ.w = 1;*/
OUT.Color.rgba = float4(0.0,0.0,0.0,1.0);
for(int lightCt = 0; lightCt < iNoOfLights; lightCt++)
{
float3 L = normalize(lights[lightCt].position.xyz - OUT.Position.xyz);
//Calculate attenuation factor.
float d = distance(lights[lightCt].position.xyz, OUT.Position.xyz);
float attenuationFactor = 1.0 / (lights[lightCt].attenuation.y + lights[lightCt].attenuation.z * d + lights[lightCt].attenuation.w * d * d);
// Calculate diffuse component
float LdotN = max(dot(L, IN.Normal) , 0);
OUT.Color.rgb += lights[lightCt].diffuseColour.rgb * LdotN * attenuationFactor;
}
OUT.Color.rgb += ambient.rgb;
OUT.Position = mul(viewProj, OUT.Position);
OUT.Alpha = IN.Alpha;
return OUT;
}
v2f OneLight(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0)
{
light lights[4];
lights[0] = light0;
return doWork(IN, world, viewProj, ambient, 1, lights);
}
v2f TwoLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1)
{
light lights[4];
lights[0] = light0;
lights[1] = light1;
return doWork(IN, world, viewProj, ambient, 2, lights);
}
v2f ThreeLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1, uniform light light2)
{
light lights[4];
lights[0] = light0;
lights[1] = light1;
lights[2] = light2;
return doWork(IN, world, viewProj, ambient, 3, lights);
}
v2f FourLights(a2v IN,uniform float4x4 world, uniform float4x4 viewProj, uniform float4 ambient, uniform light light0, uniform light light1, uniform light light2, uniform light light3)
{
light lights[4];
lights[0] = light0;
lights[1] = light1;
lights[2] = light2;
lights[3] = light3;
return doWork(IN, world, viewProj, ambient, 4, lights);
}

View File

@ -73,4 +73,18 @@ fragment_program ColourMap2DFragmentProgram cg
source ColourMap2DFragmentProgram.cg
entry_point main
profiles ps_1_1 arbfp1
}
vertex_program TextureAtlasOneLightVertexProgram cg
{
source TextureAtlasVertexProgram.cg
entry_point OneLight
profiles vs_1_1 arbvp1
}
fragment_program TextureAtlasFragmentProgram cg
{
source TextureAtlasFragmentProgram.cg
entry_point main
profiles ps_1_1 arbfp1
}

View File

@ -0,0 +1,28 @@
material TextureAtlasMaterial
{
technique
{
pass
{
vertex_program_ref TextureAtlasOneLightVertexProgram
{
param_named_auto world world_matrix
param_named_auto viewProj viewproj_matrix
param_named_auto ambient ambient_light_colour
param_named_auto light0.position light_position 0
param_named_auto light0.diffuseColour light_diffuse_colour 0
param_named_auto light0.attenuation light_attenuation 0
}
fragment_program_ref TextureAtlasFragmentProgram
{
}
texture_unit
{
texture texture_atlas.png
filtering none
}
}
}
}