在几何着色器的顶部,我们需要声明从顶点着色器输入的图元类型。这需要在in关键字前声明一个布局修饰符(Layout Qualifier)。这个输入布局修饰符可以从顶点着色器接收下列任何一个图元值:
points
:绘制GL_POINTS图元时(1)。lines
:绘制GL_LINES或GL_LINE_STRIP时(2)lines_adjacency
:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY(4)triangles
:GL_TRIANGLES、GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(3)triangles_adjacency
:GL_TRIANGLES_ADJACENCY或GL_TRIANGLE_STRIP_ADJACENCY(6)
以上是能提供给glDrawArrays渲染函数的几乎所有图元了。如果我们想要将顶点绘制为GL_TRIANGLES,我们就要将输入修饰符设置为triangles
。括号内的数字表示的是一个图元所包含的最小顶点数。
接下来,我们还需要指定几何着色器输出的图元类型,这需要在out关键字前面加一个布局修饰符。和输入布局修饰符一样,输出布局修饰符也可以接受几个图元值:
points
line_strip
triangle_strip
有了这3个输出修饰符,我们就可以使用输入图元创建几乎任意的形状了。要生成一个三角形的话,我们将输出定义为triangle_strip
,并输出3个顶点。
下面示例代码展示了如何使用几何着色器渲染两个球体
#version 150
// A triangle with three points come in
layout(triangles) in;
// Out of three triangle points, we create a triangle strip with two triangles
layout(triangle_strip, max_vertices = 6) out;
//layout(line_strip, max_vertices = 6) out;
uniform mat4 u_projectionMatrix;
uniform mat4 u_viewMatrix;
uniform vec4 u_lightPosition;
in vec3 g_normal[3];
out vec3 v_normal;
out vec3 v_eye;
out vec4 v_color;
out vec3 v_lightDirection;
void main(void)
{
int i;
mat4 translateMatrix = mat4(1.0);
vec4 position;
translateMatrix[3][0] = -1.5;
for (i=0; i < gl_in.length(); i++)
{
position = u_viewMatrix*translateMatrix*gl_in[i].gl_Position;
gl_Position = u_projectionMatrix*position;
// Normal is already in camera space
v_normal = g_normal[i];
v_eye = -vec3(position);
v_color = vec4(1.0, 0.0, 0.0, 1.0);
// Light position is in camera space
v_lightDirection = vec3(u_lightPosition - position);
EmitVertex();
}
EndPrimitive();
translateMatrix[3][0] = +1.5;
for (i=0; i < gl_in.length(); i++)
{
position = u_viewMatrix*translateMatrix*gl_in[i].gl_Position;
gl_Position = u_projectionMatrix*position ;//+ vec4(g_normal[0], 0.0) * 1.5;
v_normal = g_normal[i];
v_eye = -vec3(position);
v_color = vec4(0.0, 0.0, 1.0, 1.0);
v_lightDirection = vec3(u_lightPosition - position);
EmitVertex();
}
EndPrimitive();
}