OpenGL3.3几何着色器

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

几何着色器接受一个图元作为输入,在处理过程中它可以将这个图元全部丢弃或者输出一个或更多的图元(也就是说它可以产生比它得到的更多或更少的顶点)。这个能力被叫做几何增长

三角形带 就是三个顶点构成一个三角形 以后没=每增加一个顶点 就和前两个顶点构成一个新三角形 特点是:
奇数三角形的环绕顺序是反向的。这就意味着如下的顺序:[0,1,2],[1,3,2], [2,3,4], [3,5,4] 如图
在这里插入图片描述

一个几何着色器的例子:

#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)(这里貌似只能在几何着色器里面支配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

这里说一下对输入输出图元的理解 输入图元只需要和外面的glDrawArrays(GL_POINTS, 0, 36);里面的第一个参数相符合就行
输出图元的话

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

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

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值