几何着色器

本文深入探讨了OpenGL中的几何着色器,它位于顶点和片段着色器之间,允许开发者对图元进行变换。通过几何着色器,可以将一个图元转换为另一个,或者修改其位置。文章以一个生动的例子展示了如何实现模型的动态移动,强调了在不同坐标系间正确变换坐标的重要性,并提到了法线变换到裁剪空间的方法。对于图形编程和GPU编程的学习者,了解几何着色器的功能和使用是至关重要的。
摘要由CSDN通过智能技术生成

几何着色器

什么是几何着色器?

  • 几何着色器是顶点着色器与片段着色器之间的一种可选着色器,他的输入是一个图元的一组顶点,输出是另一个图元的一组顶点

为什么要用几何着色器?

  • 由于几何着色器可以在顶点发送到下一着色阶段之前对他们随意变换,所以他的作用就是将一个图元变换为另一个完全不同的图元,或者修改图元的位置

怎么使用几何着色器?

  • 在几何着色器的顶部,声明从顶点着色器输入的图元类型:layout (primitive) in;
  • 可以输入的图元有5类:points,lines,lines_adjacency,triangles,triangles_adjacency
  • 指定几何着色器的输出图元类型:layout (primitive, max_vertices = n) out;
  • 输出图元有三种选项:points,line_strip,triangle_strip
  • 几何着色器还要设置一个他的最大输出顶点数量,如果绘制时超过了这个值,OpenGL将不会绘制多出的顶点
  • 为了方便使用顶点着色器传入的数据,glsl提供了内置变量gl_Vertex
in gl_Vertex
{
    vec4 gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[];
  • 调用EmitVertex()后,gl_Position中的数据会被添加到输出的图元中
  • 调用EndPrimitive()后,所有发射出的顶点会合成指定输出的图元
  • 重复调用EndPrimitive()能够生成多个图元

一个栗子

银角大王的小葫芦:”收“

在这里插入图片描述

  • 这个效果很简单,在几何着色器中,将模型的三角面都按照一个固定的方向,随着时间移动即可

  • 需要注意的地方:几何着色器中使用的gl_in[i].gl_Position是顶点着色器传进来的,这个位置是裁剪空间坐标,所以在使用gl_in[i].gl_Position与其他顶点属性数据或者其他向量运算时,应该保证他们都是裁剪空间中的坐标

  • 将法线变换到裁剪空间的方法:先用法线左乘发现法线矩阵,然后再左乘视图矩阵和投影矩阵;法线矩阵还是模型矩阵的逆矩阵的转置(不要忘了去掉模型矩阵中的平移部分)

  • 所以总结一下就是:在写shader时,看shader中运算时用的是哪个空间中的坐标系,然后将用到的数据都变换到相应的坐标系下再运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值