幾何著色器(一) 基本概念
阿新 • • 發佈:2019-02-03
最近想做一些渲染的東西,接觸到了幾何著色器,發現了幾何著色器的強大之處,幾何著色器位於頂點和片元著色器之間,幾何著色器能夠產生0個以上的基礎圖元,它能起到一定的裁剪作用、同時也能產生比頂點著色器輸入更多的基礎圖元。
它可以做的事情非常的酷炫,例如:表面法線的視覺化和實現三維物體的爆炸效果。
基本知識:
輸入可以有如下:
points
:繪製GL_POINTS圖元時。lines
:繪製GL_LINES或GL_LINE_STRIP時lines_adjacency
:GL_LINES_ADJACENCY或GL_LINE_STRIP_ADJACENCYtriangles
:GL_TRIANGLES、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();
}
這裡我們輸出了兩個點,把一個點擴充成一個直線圖元。如下圖:
我們可以實現更多的拓展,從而實現一些酷炫的效果。