I'm having a hard time getting OpenGL Tessellation to work. I have been struggling with it for about a month now. I've looked at a lot of example code and what I am doing doesn't seem that different to what they are doing in their code. I was wondering if anyone could be a second pair of eyes and maybe point out why it isn't working.
My scene is only rendering a black screen.
My shaders are as follows:
Vertex Shader
#version 400
#extension GL_ARB_tessellation_shader: enable
#extension GL_ARB_separate_shader_objects: enable
layout(location = 0) in vec3 vertexPosition;
void main()
{
gl_Position = vec4(vertexPosition, 1.0);
}
Tessellation Control Shader
#version 400
#extension GL_ARB_separate_shader_objects: enable
layout(vertices = 3) out;
void main()
{
float inLevel = 2;
float outLevel = 2;
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
if (gl_InvocationID == 0)
{
gl_TessLevelOuter[0] = outLevel;
gl_TessLevelOuter[1] = outLevel;
gl_TessLevelOuter[2] = outLevel;
gl_TessLevelOuter[3] = outLevel;
gl_TessLevelInner[0] = inLevel;
gl_TessLevelInner[1] = inLevel;
}
}
Tessellation Eval Shader
#version 400
#extension GL_ARB_tessellation_shader: enable
#extension GL_ARB_separate_shader_objects: enable
layout(triangles, equal_spacing, ccw) in;
uniform mat4 uMVPMatrix;
void main()
{
vec4 p0 = gl_TessCoord.x * gl_in[0].gl_Position;
vec4 p1 = gl_TessCoord.y * gl_in[1].gl_Position;
vec4 p2 = gl_TessCoord.z * gl_in[2].gl_Position;
vec4 newCoord = normalize(p0 + p1 + p2);
gl_Position = newCoord;
}
Geometry Shader
#version 400
#extension GL_ARB_separate_shader_objects: enable
layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;
uniform mat4 uMVPMatrix;
uniform bool UseWaveGeometry;
uniform float GameTime;
layout(location = 3) out vec4 vColor;
float rand(vec2 n)
{
return 0.5 + 0.5 * fract(sin(dot(n.xy, vec2(12.9898, 78.233)))* 43758.5453);
}
void setUpValues(int index)
{
vec4 vertPosit = gl_in[index].gl_Position;
if(UseWaveGeometry)
{
vertPosit.y = vertPosit.y + (GameTime + ((cos(vertPosit.x)) * GameTime) - ((sin(vertPosit.x))*GameTime)*2.2);
}
float cval = int(vertPosit.x) % 2 + int(vertPosit.y)%2;
vColor = vec4(cval, cval, cval, 1.0);
gl_Position = uMVPMatrix * vertPosit;
}
void main()
{
for(int i = 0; i < 3; i++)
{
setUpValues(i);
EmitVertex();
}
EndPrimitive();
}
Fragment Shader
#version 400
#extension GL_EXT_gpu_shader4: enable
#extension GL_ARB_separate_shader_objects: enable
uniform float ColorAlpha;
layout(location = 3) in vec4 vColor;
layout(location = 0) out vec4 FragColor;
void main()
{
vec4 color = vec4(vColor.r, vColor.g, vColor.b, ColorAlpha);
FragColor = color;
}
Thank you for your time,
Marty