1. 程式人生 > >幾何著色器(一) 基本概念

幾何著色器(一) 基本概念

最近想做一些渲染的東西,接觸到了幾何著色器,發現了幾何著色器的強大之處,幾何著色器位於頂點和片元著色器之間,幾何著色器能夠產生0個以上的基礎圖元,它能起到一定的裁剪作用、同時也能產生比頂點著色器輸入更多的基礎圖元。

它可以做的事情非常的酷炫,例如:表面法線的視覺化和實現三維物體的爆炸效果

基本知識:

輸入可以有如下:

  • points:繪製GL_POINTS圖元時。
  • lines:繪製GL_LINES或GL_LINE_STRIP時
  • lines_adjacency:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCY
  • trianglesGL_TRIANGLES
    GL_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,  該幾何著色器輸出的結果是一個點圖元。

繪製兩個點:

修改輸出圖元型別:


#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();
}

這裡我們輸出了兩個點,把一個點擴充成一個直線圖元。如下圖:

       

我們可以實現更多的拓展,從而實現一些酷炫的效果。