McNopper -OpenGL 阅读笔记 2 几何着色

在几何着色器的顶部,我们需要声明从顶点着色器输入的图元类型。这需要在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();    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值