Here is my attempt at using the Geometry Shader to subdivide the input triangle into 9 triangles.

Although I think it works, it did not give me the desired result.

Caution, it may not handle the normals correctly (at first glance)

On my GPU, it runs very slow. Maybe because there are no optimisations and maybe because my GPU does not support hardware geometry shaders.


Code:
#version 120
#extension GL_ARB_geometry_shader4 : enable

varying out vec4 ObjPos;
varying out vec3 WorldSpacePosition; 
varying in vec3 Vertex_WorldSpaceNormal[3]; 
varying out vec3 WorldSpaceNormal; 
varying in vec2 Vertex_TexCoord0[3];
varying out vec2 TexCoord0;
uniform sampler2D Texture0;

void set_vertex(in vec4 in_vertex, in vec3 in_normal, in vec2 in_texcoord)
{
	gl_Position = gl_ModelViewProjectionMatrix * in_vertex;
	WorldSpacePosition = in_vertex.xyz;
	ObjPos = gl_ModelViewMatrix * in_vertex;
	WorldSpaceNormal = in_normal;
	TexCoord0 = in_texcoord;
	EmitVertex();
}

void split_triangle(in vec4 vertex_a, in vec4 vertex_b, in vec4 vertex_c, out vec4 vertex_m, in vec3 normal_a, in vec3 normal_b, in vec3 normal_c, out vec3 normal_m, in vec2 texcoord_a, in vec2 texcoord_b, in vec2 texcoord_c, out vec2 texcoord_m)
{
	vertex_m = (vertex_a + vertex_b + vertex_c) / 3.0;
	normal_m = (normal_a + normal_b + normal_c) / 3.0;
	texcoord_m = (texcoord_a + texcoord_b + texcoord_c) / 3.0;
}

void set_triangle(in vec4 vertex_a, in vec4 vertex_b, in vec4 vertex_c, in vec4 vertex_m, in vec3 normal_a, in vec3 normal_b, in vec3 normal_c, in vec3 normal_m, in vec2 texcoord_a, in vec2 texcoord_b, in vec2 texcoord_c, in vec2 texcoord_m)
{
		set_vertex(vertex_a, normal_a, texcoord_a);
		set_vertex(vertex_m, normal_m, texcoord_m);
		set_vertex(vertex_c, normal_c, texcoord_c);
   		EndPrimitive();

		set_vertex(vertex_a, normal_a, texcoord_a);
		set_vertex(vertex_b, normal_b, texcoord_b);
		set_vertex(vertex_m, normal_m, texcoord_m);
   		EndPrimitive();

		set_vertex(vertex_b, normal_b, texcoord_b);
		set_vertex(vertex_c, normal_c, texcoord_c);
		set_vertex(vertex_m, normal_m, texcoord_m);
   		EndPrimitive();
}

void main()
{
	vec4 vertex[16];
	vec3 normal[16];
	vec2 texcoord[16];
	vertex[0] = gl_PositionIn[0];
	vertex[1] = gl_PositionIn[1];
	vertex[2] = gl_PositionIn[2];
	normal[0] = Vertex_WorldSpaceNormal[0];
	normal[1] = Vertex_WorldSpaceNormal[1];
	normal[2] = Vertex_WorldSpaceNormal[2];
	texcoord[0] = Vertex_TexCoord0[0];
	texcoord[1] = Vertex_TexCoord0[1];
	texcoord[2] = Vertex_TexCoord0[2];

	vec4 actual_a = gl_ModelViewMatrix * vertex[0];
	if ((actual_a.x > -100.0) && (actual_a.x < 100.0) &&(actual_a.y > -100.0) && (actual_a.y < 100.0) && (actual_a.z < 0.0) && (actual_a.z > -300.0))
	{
		// Calculate triangle centers

		split_triangle(vertex[0], vertex[1], vertex[2], vertex[3], normal[0], normal[1], normal[2], normal[3], texcoord[0], texcoord[1], texcoord[2], texcoord[3]);
	
		split_triangle(vertex[0], vertex[1], vertex[3], vertex[4], normal[0], normal[1], normal[3], normal[4], texcoord[0], texcoord[1], texcoord[3], texcoord[4]);
		split_triangle(vertex[1], vertex[2], vertex[3], vertex[5], normal[1], normal[2], normal[3], normal[5], texcoord[1], texcoord[2], texcoord[3], texcoord[5]);
		split_triangle(vertex[0], vertex[3], vertex[2], vertex[6], normal[0], normal[3], normal[2], normal[6], texcoord[0], texcoord[3], texcoord[2], texcoord[6]);

		split_triangle(vertex[0], vertex[1], vertex[4], vertex[7], normal[0], normal[1], normal[4], normal[7], texcoord[0], texcoord[1], texcoord[4], texcoord[7]);
		split_triangle(vertex[4], vertex[1], vertex[3], vertex[8], normal[4], normal[1], normal[3], normal[8], texcoord[4], texcoord[1], texcoord[3], texcoord[8]);
		split_triangle(vertex[3], vertex[1], vertex[5], vertex[9], normal[3], normal[1], normal[5], normal[9], texcoord[3], texcoord[1], texcoord[5], texcoord[9]);
		split_triangle(vertex[5], vertex[1], vertex[2], vertex[10], normal[5], normal[1], normal[2], normal[10], texcoord[5], texcoord[1], texcoord[2], texcoord[10]);
		split_triangle(vertex[2], vertex[3], vertex[5], vertex[11], normal[2], normal[3], normal[5], normal[11], texcoord[2], texcoord[3], texcoord[5], texcoord[11]);
		split_triangle(vertex[2], vertex[6], vertex[3], vertex[12], normal[2], normal[6], normal[3], normal[12], texcoord[2], texcoord[6], texcoord[3], texcoord[12]);
		split_triangle(vertex[0], vertex[6], vertex[2], vertex[13], normal[0], normal[6], normal[2], normal[13], texcoord[0], texcoord[6], texcoord[2], texcoord[13]);
		split_triangle(vertex[0], vertex[3], vertex[6], vertex[14], normal[0], normal[3], normal[6], normal[14], texcoord[0], texcoord[3], texcoord[6], texcoord[14]);
		split_triangle(vertex[0], vertex[4], vertex[3], vertex[15], normal[0], normal[4], normal[3], normal[15], texcoord[0], texcoord[4], texcoord[3], texcoord[15]);

		// Move the vertices a bit
		for (int i = 3; i < 16; i ++) vertex[i].y += (2.0 * texture2D(Texture0, texcoord[i]).r) - 1.0;

		// Set the triangles
		set_triangle(vertex[0], vertex[1], vertex[4], vertex[7], normal[0], normal[1], normal[4], normal[7], texcoord[0], texcoord[1], texcoord[4], texcoord[7]);
		set_triangle(vertex[4], vertex[1], vertex[3], vertex[8], normal[4], normal[1], normal[3], normal[8], texcoord[4], texcoord[1], texcoord[3], texcoord[8]);
		set_triangle(vertex[3], vertex[1], vertex[5], vertex[9], normal[3], normal[1], normal[5], normal[9], texcoord[3], texcoord[1], texcoord[5], texcoord[9]);
		set_triangle(vertex[5], vertex[1], vertex[2], vertex[10], normal[5], normal[1], normal[2], normal[10], texcoord[5], texcoord[1], texcoord[2], texcoord[10]);
		set_triangle(vertex[2], vertex[3], vertex[5], vertex[11], normal[2], normal[3], normal[5], normal[11], texcoord[2], texcoord[3], texcoord[5], texcoord[11]);
		set_triangle(vertex[2], vertex[6], vertex[3], vertex[12], normal[2], normal[6], normal[3], normal[12], texcoord[2], texcoord[6], texcoord[3], texcoord[12]);
		set_triangle(vertex[0], vertex[6], vertex[2], vertex[13], normal[0], normal[6], normal[2], normal[13], texcoord[0], texcoord[6], texcoord[2], texcoord[13]);
		set_triangle(vertex[0], vertex[3], vertex[6], vertex[14], normal[0], normal[3], normal[6], normal[14], texcoord[0], texcoord[3], texcoord[6], texcoord[14]);
		set_triangle(vertex[0], vertex[4], vertex[3], vertex[15], normal[0], normal[4], normal[3], normal[15], texcoord[0], texcoord[4], texcoord[3], texcoord[15]);

	}
	else
	{ 
		set_vertex(vertex[0], normal[0], texcoord[0]);
		set_vertex(vertex[1], normal[1], texcoord[1]);
		set_vertex(vertex[2], normal[2], texcoord[2]);
   		EndPrimitive();
	}
}