欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGL3.3几何着色器

程序员文章站 2024-03-25 16:41:34
...

几何着色器
几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点(我自己的理解就是几何着色器可以在顶点着色器那接受顶点之后,对顶点做相应变换,比如说由顶点通过位移延伸出更多顶点,或者让顶点平移旋转,从而让模型法生变化)
一个几何着色器的例子:

#version 330 core
layout (points) in;
layout (triangle_strip, max_vertices = 5) out;

in VS_OUT {
    vec3 color;
} gs_in[];

out vec3 fColor;

void build_house(vec4 position)
{    
    fColor = gs_in[0].color; // gs_in[0] since there's only one input vertex
    gl_Position = position + vec4(-0.2, -0.2, 0.0, 0.0); // 1:bottom-left   
    EmitVertex();   
    gl_Position = position + vec4( 0.2, -0.2, 0.0, 0.0); // 2:bottom-right
    EmitVertex();
    gl_Position = position + vec4(-0.2,  0.2, 0.0, 0.0); // 3:top-left
    EmitVertex();
    gl_Position = position + vec4( 0.2,  0.2, 0.0, 0.0); // 4:top-right
    EmitVertex();
    gl_Position = position + vec4( 0.0,  0.4, 0.0, 0.0); // 5:top
    fColor = vec3(1.0, 1.0, 1.0);
    EmitVertex();
    EndPrimitive();
}

void main() {    
    build_house(gl_in[0].gl_Position);
}

layout (points) in;声明从顶点着色器输入的图元类型
图元值:
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)
括号内的数字表示的是一个图元所包含的最小顶点数
<1>按点的定义顺序依次连接:图元类型参数–GL_POLYGON
<2>从第1个点开始,每三个点一组画一个三角形,三角形之间是独立的:图元类型参数–GL_TRIANGLES
<3>从第三个点开始,每点与前面的两个点组合画一个三角形,即线性连续三角形串:图元类型参数–GL_TRIANGLE_STRIP
<4>从第三个点开始,每点与前一个点和第一个点组合画一个三角形,即扇形连续三角形:图元类型参数–GL_TRIANGLE_FAN

layout (line_strip, max_vertices = 2) out;指定几何着色器输出的图元类型 第二个参数是可生成的最大顶点数
points
line_strip
triangle_strip

EmitVertex();
gl_Position中的向量会被添加到图元中

EndPrimitive()
所有发射出的(Emitted)顶点都会合成为指定的输出渲染图元

gl_in[0]目前理解的gl_in[0]是从顶点那获取的一个个点 具体怎么用还不了解
还有layout (points) in;
layout (triangle_strip, max_vertices = 5) out;这两个的具体填法也有待探究

相关标签: opengl