几何着色器(一) 基本概念

最近想做一些渲染的东西,接触到了几何着色器,发现了几何着色器的强大之处,几何着色器位于顶点和片元着色器之间,几何着色器能够产生0个以上的基础图元,它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。

它可以做的事情非常的酷炫,例如:表面法线的可视化和实现三维物体的爆炸效果

 

基本知识:

 

输入可以有如下:

  • points:绘制GL_POINTS图元时。
  • lines:绘制GL_LINES或GL_LINE_STRIP时
  • lines_adjacency:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY
  • trianglesGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN 即绘制三角面片时使用
  • triangles_adjacency:GL_TRIANGLES_ADJACENCY或GL_TRIANGLE_STRIP_ADJACENCY

输出如下:

  • points  输出的图元是点
  • line_strip 输出的图元是线
  • triangle_strip 输出的图元是三角形

max_vertices 代表输出的最大顶点数量,超过这个数量,opengl将不再绘制多出的顶点。

 

几何着色器中EmitVertex表示输出一个顶点,而EndPrimitive表示结束一个图元的输出,这是一对命令。gl_in是内置输入变量,定义为,这个是我们可以直接使用的:

in gl_PerVertex
{
    vec4  gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[];

具体实例:


layout(points) in ;
layout(points, max_vertices = 1) out;
void main()
{
    gl_Position = gl_in[0].gl_Position;
    EmitVertex();
    EndPrimitive();
}

上面的例子表示,每次的输入只有一个点,对应的绘图模式是GL_POINTS,  该几何着色器输出的结果是一个点图元。

绘制两个点:

几何着色器(一) 基本概念_第1张图片

修改输出图元类型:


#version 330 core
layout(points) in ;
layout(line_strip, max_vertices = 2) out;
void main()
{
    
         gl_Position = gl_in[0].gl_Position + vec4(-1,0,0,1);
         EmitVertex();
         gl_Position = gl_in[0].gl_Position+  vec4(1,0,0,1);
         EmitVertex();

    EndPrimitive();
}

这里我们输出了两个点,把一个点扩充成一个直线图元。如下图:

       几何着色器(一) 基本概念_第2张图片

我们可以实现更多的拓展,从而实现一些酷炫的效果。

你可能感兴趣的:(#,OpenGL,#,GLSL,图形学)