计算共形几何 pdf_几何着色器

2023-11-04

c425f879a73c968f77df42c73c630375.png

几何着色器概述 (Introduction)

PDF下载地址传送positiveczp.github.io

(positiveczp.github.io/%25E5%2587%25A0%25E4%25BD%2595%25E7%259D%2580%25E8%2589%25B2%25E5%2599%25A8.pdf) 564da2fe22e73d00f2573a6d43b0aee4.png
渲染管线

几何着色器(Geometry Shader)是由第四代显卡着色器架构 Shader Model 4 正式引入的第三个着色器,属于渲染管线的一个可选阶段,位于曲面细分(Tessellation)和光栅化(Rasterization)之间。顶点着色器以顶点数据作为输入数据,而几何着色器则以完整的图元(Primitive)作为输入数据。例如,以三角形的三个顶点作为输入,然后输出对应的图元。与顶点着色器不能销毁或创建顶点不同,几何着色器的主要亮点就是可以创建或销毁几何图元,此功能让GPU可以实现一些有趣的效果。例如,根据输入图元类型扩展为一个或更多其他类型的图元,或者不输出任何图元。需要注意的是,几何着色器的输出图元不一定和输入图元相同。几何着色器的一个拿手好戏就是将一个点扩展为一个四边形(即两个三角形)。

几何着色器输出的图元由顶点列表定义而成,而且顶点必须变换到裁剪空间。也就是说,经过几何着色器处理后,得到的是一系列位于齐次裁剪空间的顶点所组成的图元。这些顶点会在后面的裁剪、透视除法和光栅化阶段得到进一步处理。

为了理解几何着色器是如何工作的,我们首先来看一个例子:

b2f3e3709d3e7d8577eef7e8234c914e.png
几何着色器的GLSL
  • 输入类型 (Input Types)

layout(points) in;

我们知道几何着色器的输入是图元,那么到底可以处理那些图元呢?可用的图元类型如下所示(括号里面的数字表示所需要的顶点数目):

  • points-GL_POINTS (1)

  • lines-GL_LINES, GL_LINE_STRIP, GL_LINE_LIST (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)

如果我们使用glDrawArrays(GL_POINTS, 0, 4)命令来绘制点图元,那么我们需要传入points参数。

  • 输出类型 (Output Types)

layout(line_strip, max_vertices = 2) out;

下一行代码展示的是几何着色器的输出。几何着色器最有意思的地方在于:输出图元类型跟输入图元类型完全不同,而且输出图元的数量跟输入图元数量也没有关系。括号里面的参数分别表示:输出图元类型和图元最大顶点数。输出图元的类型可以是下面几种:

  • points

  • line_strip

  • triangle_strip

我们可以发现这三种类型的输出图元可以覆盖所有可能的图元类型,比如,我们可以用3个顶点的triangle_strip来输出一个普通的triangle。

几何着色器的输出要求我们最大输出顶点数目,当EmitVertex()的数量超出该值时,OpenGL将不会绘制更多的顶点。

  • 顶点输入 (Vertex Input)

我们在顶点着色器使用的gl_Position变量其实位于gl_in数组中,该数组的数据成员如下所示:

70b15ac1c91cfabaf0b35c24ffd20f94.png
gl_in数组

需要注意的是,由于几何着色器的输入是图元的所有顶点,所以这里将gl_in定义为数组。

  • 顶点输出 (Vertex Output)

我们使用EmitVertex()EndPrimitive()两个函数来产生图元。每当我们调用一次EmitVertex()函数时,会将顶点加入到当前的图元;当所有顶点都加入到图元后,我们可以通过EndPrimitive()函数来产生图元。我们需要注意,当我们重复调用EndPrimitive()时,可以生成多个同样的图元。

0c0137847ca8a379741f7eafb97e8a3c.png

通过执行该几何着色器,我们得到下面的输出,我们发现GPU的输出是一条线段,而不是顶点。

e8c1010f765a70d7b93f342705732d37.png
利用几何着色器得到的输出

我们可以在顶点着色器中输入颜色分量来控制几何着色器中每个顶点的颜色。我们发现其实几何着色器对颜色的处理和片段着色器差不多,只不多这里的输入是颜色数组,因为输入图元的每个顶点都对应一个自己的颜色属性。

96dee06b04905779011e05551f993776.png
顶点属性包括了颜色信息
2f82f23326f771f102f8bc9c6cabedfa.png
顶点着色器
4d84a94d9be1690aded6e70b6a3ec51c.png
几何着色器

最终我们得到如下的结果,每个线段都有自己的颜色,而且与输入顶点的颜色相同。

00785da22d26ef472f3efb45c06b9268.png
几何着色器输出的图元带有颜色信息

几何着色器应用 (Application)

法线可视化

几何着色器的第一个应用是显示物体的法线,这对于光照效果的调试非常有帮助。我们首先在不使用几何着色器的情况下正常渲染一次场景;然后开启几何着色器第二次渲染场景,送到几何着色器的是三角形图元,我们为其每个顶点生成一个法线向量。

这里需要注意的是,几何着色器中使用的顶点坐标是经过顶点着色器变换后的裁剪空间坐标,所以传入到几何着色器的法线也需要变换到裁剪空间。我们这里需要知道法线向量的变换矩阵与顶点坐标的变换矩阵是不同的,需要使用矩阵的逆阵的转置来变换法向量,关于该矩阵的具体推导可以参考这个教程。顶点着色器如下所示,将法向量变换到裁剪空间。

fa14314fb3f479c68e935459257f8cb9.png

在几何着色器中,我们接受的输入图元是triangle,输出的图元是line_strip,我们这里输出的顶点数量max_vertices为6,因为我们需要为triangle的每个顶点输出法线,三个法线向量与三角形的法线相互平行。从下面的几何着色器中我们看到,这里为triangle每个顶点输出了两个顶点,分别是法线的起点和终点,用来表示法线。

467fe2a6f5754d016d08af4a1a47c802.png

最终我们可以得到如下的效果图,我们通过几何着色器来可视化茶壶和机器人的法线,我们注意到,这样的效果类似于给物体增加了毛发(Fur),所以几何着色器也经常用来实现毛发渲染。

e33efadc9433653902becb660ec422c8.png
茶壶法线可视化
4c63d3b402fde5597619ed4c08643359.png
机器人法线可视化

动态几何体形成 (Dynamically generating geometry)

接下来我们看下几何着色器的另一个应用:动态几何体形成。我们利用几何着色器可以实现物体的LOD技术 (Level of Detail)。比如,我们需要在游戏中绘制一个圆圈,那么我们可以根据距离摄像机的远近来调整圆圈的顶点数目,充分利用显卡的性能。我们首先来绘制一个十多边形 (10-sided polygon),这里需要使用到三角学的一些知识,如下图所示。

21741039c3abd3a1e64e0c289e776b43.png
1e69913a5d91a8df5b85666928b5da54.png

十多边形有十个顶点,这里我们绘制了十一个顶点,因为我们需要将多边形封闭起来,所以第一个顶点需要绘制两次。我们可到下面的结果:

4ba795017ea09d24f229d4126cb851b7.png
具有不同顶点的多边形

接下来我们通过顶点数据来控制多边形的边数,也就是将边数变成顶点的一个属性值:

4b2057429763abdb60562efcd5998950.png

利用顶点的Sides数值来控制多边形的边数而不是原来的定值10,我们可以得到下面的效果图。四个多边形分别具有4、8、16和32条边。我们在游戏中可以根据玩家距离摄像机的远近来动态调整多边形边数这个属性值,实现LOD的效果。

bd45b8bf66f6502694472764c5393480.png
利用Sides变量控制多边形的显示

公告牌 (BillBoards)

f1740bf19f0320314f53d509d9b754b1.png

公告牌技术就是以3D树木图片的四边形来代替3D树的渲染的技术。我们可以使公告牌总是面向摄像机,这样从远处看过去,公告牌不容易露出破绽,如上图所示。

假设y轴指向正上方,平面xz表示地面,则树木的公告牌立于xz平面切与y轴平行面向摄像机。下图是从y轴俯视看到的公告牌的坐标系。我们给定公告牌的中心位置C (我们可以根据几何着色器将该顶点扩展成四边形来展示公告牌),摄像机的位置E,通过叉乘我们可以得到公告牌局部坐标系和世界坐标系的对应关系:

7237c869c30eb2c8bd9eec4671984844.png
XZ平面的投影,摄像机和公告牌之间的位置信息
c03256aa00985e6f86ea505fe569357c.png
描述公告牌相对于世界坐标的坐标轴

通过公告牌的局部坐标系和世界坐标系之间的关系以及公告牌本身的大小,我们可以得到公告牌扩展后的四边形的四个顶点坐标如下:

bcc035e2636d1211b86e379c12833a4a.png
四边形四个顶点坐标计算
f70ba42609ad1d379bceb40184308d53.png
如何利用输入顶点得到四边形的四个顶点坐标示意图

我们输入几何着色器的正是公告牌的中心点Center,通过几何着色器来扩展为四边形进行展示。

Alpha-to-Coverage技术

0b05b88f2b70203ec06c531f9902b4e7.png

我们在BillBoards技术中会根据树木的alpha值进行alpha测试,当我们靠近观察公告牌时,会发现裁剪树木留下的硬边缘问题,也就是俗称的锯齿问题。这个问题主要是由于discard()clip()函数带来的,它们用来裁剪掉不需要树木纹理的像素,导致树木的边缘过渡不自然。

解决该问题的第一种方法是使用alpha-blending技术来代替alpha test。通过线性纹理过滤,我们可以使得公告牌边缘过渡更加自然。由不透明像素逐渐过渡到半透明像素,带来一种渐变的效果。但是,运用alpha-blending技术需要将场景中的物体按照从后往前的顺序进行排序和渲染。对于渲染一大片的森林或草原,排序带来的消耗将非常大。而且alpha-blending技术会在排序后带来大量的OverDraw问题,会很大影响程序的性能。

69a63b30b3e56ed0f114f3461c885ffa.png
858fb52ba49029490cf4195406a11c23.png

第二种方法是使用多重采样抗锯齿技术 (Multisampling Antialiasing,MSAA)。可以用来缓解多边形边缘的锯齿问题,使之更加平滑。该技术确实有效,不过也带来一些问题。开启MSAA技术后,硬件会生成多个样本 (Samples),根据样本的可见性和覆盖率来决定样本的颜色信息。关键在于,覆盖率是在多边形层次 (Polygon Level) 上确定下来的,所以MSAA技术并不会检查alpha通道,所以边缘过渡不会有不透明到半透明的过渡效果。如果想要在覆盖率计算过程中考虑alpha通道的情况,那就必须使用 Alpha-to-Coverage 的技术。Alpha-to-Coverage会使用纹理的alpha值来决定采样的覆盖率。

在开启了MSAA和alpha-to-coverage后,硬件会检测像素着色器返回的alpha值,并用于确定覆盖情况。比如本来利用MSAA得到的coverage是1,但是像素着色器返回的alpha为0.5,那么coverage变成了0.5,这样最后在resolve阶段,这个像素的颜色也被变淡了。正是通过这种技巧,将其颜色弱化,达到了柔软硬边的效果。关于alpha-to-coverage可以参考这篇文章。

5ac0bfcf373fd4e50de6743272581937.png

当我们使用alpha测试来裁剪树叶或者围栏这类纹理时,建议使用MSAA和alpha-to-coverage技术来进行边缘过渡处理,所以我们发现其实alpha-to-coverage也属于抗锯齿技术的一种。

References

  • medium.com/@bgolus/anti

  • LearnOpenGL - Introduction

  • Geometry shaders

声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

作者:学无止境

来源:https://zhuanlan.zhihu.com/p/76775024

More:【微信公众号】 u3dnotes

a400f385ad428e463096d609d15f47c2.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算共形几何 pdf_几何着色器 的相关文章

  • RSA进阶之维纳攻击(wiener-attack )

    维纳攻击 场景 e很大 例题 第七届山东网络安全技能大赛 链接 https pan baidu com s 1IRInw3pB7SQfp3MxRJW17A 提取码 lcn3 e很大 妥了 维纳攻击 脚本在github上 https gith
  • 【完全开源】小安派-DSL 屏幕驱动开发板

    文章目录 概述 系统框图 2 8 3 5寸 屏电路 2 4寸触摸屏电路 1 28 寸圆形触摸屏电路 背光控制 关于Demo 1 28寸圆形屏智能手表Demo 2 4寸屏音乐播放器Demo 3 5寸屏天气站Demo 完全开源 概述 小安派 D
  • Altium Designer导入元器件3D封装

    一 前言 AD用了也有几年了 一开始只是单独用于制版 没有别的用途 随着工龄的增长 需求的内容也是越来越多 逐渐接触了3D模型建立 结构设计 有时需要导入PCB 3D效果 发现PCB导出的大多数只有芯片和电阻电容 很多开关 端子等特殊封装的
  • 前端开发利器: Bootstrap + AngularJS

    概述 在HTML5盛行的互联网时代 涌现诸多的前端html css js框架 基于其 适用范围 licence 发展前景等因素 本人对比总结出其中的两个佼佼者 分别是侧重页面美化展现的 Bootstrap 和侧重页面逻辑控制的 Angula
  • LeetCode题目笔记--2.两数相加

    这个博客系列记录我刷LeetCode过程中的一些循序渐进的思路和想法 希望能坚持下去 如果读者老爷觉得有帮助 就点个赞吧 题目描述 给出两个 非空 的链表用来表示两个非负的整数 其中 它们各自的位数是按照 逆序 的方式存储的 并且它们的每个
  • 数据导入hudi报错,错将字段写到hdfs路径上

    报错信息 Error trying to save partition metadata this is okay as long as atleast 1 of these succced file qiche hudi table 冬天
  • 2020无人用的邮箱和密码大全_Amazon后台登录密码错误!如何辨别账号是否被冻结?...

    啊你绝对不知道 这里每天都会更新一些跨境电商实时动态 卖家经验交流 跨境平台动态研究 曝光销售技巧 转化技巧 站外引流的方法 亚马逊后台登录密码错误 如何辨别账号是否被冻结 很多人一看到自己账号登录不进去就开始心慌 因为2018年就因为亚马
  • [QT编程系列-6]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义菜单栏

    目录 3 QT窗体设计 3 1 自定义菜单 3 1 1 设计目标 编辑 3 1 2 创建过程 编辑 3 QT窗体设计 3 1 自定义菜单 3 1 1 设计目标 3 1 2 创建过程 在Qt中 Windows窗口和Widget窗口是两种不同的
  • 如何用python加NLP打造自己的智能问答机器人

    一 基本流程 我们可以参照以下流程进行智能机器人的程序设计工作 1 利用已有的数据对 TfidfVectorizer 模型进行训练 2 利用训练好的TF IDF模型进行训练数据data0和真实数据data1的TFIDF值求解 3 通过余弦相
  • Spring Boot 3.x 构建系统&Starters

    系列文章目录 系列文章 Spring Boot 3 x 系列教程 文章目录 系列文章目录 前言 一 依赖管理 二 Maven 三 Spring Boot Maven Plugin 四 Starters 前言 Spring Boot 建议选择
  • c语言double类型的输入

    c语言double类型的输入 double输入用 lf 而不能用 f 今天在使用double类型输入时先用了 scanf lf a 结果以 f输出的时候都是0 以 g e输出似乎是最小的double值 12 3456789 0 000000
  • 软件产品设计

    figma软件介绍 Figma是一款在线协作式设计工具 用于 UI UX 设计和原型开发 它提供了一整套设计工具 包括向量绘图 页面布局和共享协作 支持多人协作 让用户可以在任何设备上创建 共享和讨论设计 知识点和技能 设计理论 理解UI设
  • Linux下xargs工具的使用

    xargs命令是给其他命令传递参数的一个过滤器 也是组合多个命令的一个工具 它能够将标准输入或管道中的数据转换为特定命令的命令行参数 也可以将单行或多行文本输入转换为其他格式的数据 比如单行变多行或者多行变单行 xargs的默认命令是ech
  • VS中的快捷键快速格式化代码,使好看,整齐

    在VC2005中 快捷键是Ctrl K Ctrl F 这是一个组合键 即先按Ctrl K 这时候编辑器会等待下一个按键动作 此时再按Ctrl F 即可以格式化代码了 当然 也可以在选项里面设置成使用VC6的快捷键 就可以继续使用Alt F8
  • 简述:面向对象的程序设计思想是什么?

    本博文源于C 基础 学到了类与对象这一章节 看见了课后有一个问题叫做 面向对象的程序设计思想是什么 我翻阅书籍 写下了这样一段话 就是警惕自己 如果未来被面试题面到 也能当做背诵个资料来看 下面开始简述那段话 文章目录 1 简述 面向对象的
  • PDM信号与PCM信号

    总结一下PDM信号与PCM信号 PDM PDM 脉冲密度调制 模拟信号的幅值使用输出脉冲对应区域的密度表示 PWM波是PDM波转换频率固定的一种特例 在实际输出的一位数据流中 只存在 1 和 0 1的密度越大 代表该区域对应的模拟信号幅值越
  • sql 2000 分页

    create PROCEDURE dbo Proc GetPageList Tables varchar 1000 表名 PK varchar 100 主键 Fields varchar 1000 查询的字段 SortField varch
  • 一阶RC滤波器

    一阶RC滤波器 作者 AirCity 2020 2 6 Aircity007 sina com 本文所有权归作者Aircity所有 RC低通滤波器 频响曲线 幅度下降到Ui 2 即是3dB带宽 此时 CR 1 2 f 1 CR f 1 2

随机推荐

  • SLF4J: Class path contains multiple SLF4J bindings.

    springboot启动出现如下警告 SLF4J Class path contains multiple SLF4J bindings SLF4J Found binding in jar file C Users wangfei m2
  • Python做数据分析需要学什么?

    下面分别从这四个方面来带大家学习数据分析 第一 做数据分析要精通Python吗 第二 数据分析流程是什么 学什么 第三 如何培养数据分析思维 第四 数据分析书籍推荐 一 数据分析要精通Python吗 做数据分析不必精通Python 但至少要
  • C++11类型转换总结

    一 强制类型转换 用C 中的四个强制类型转换的关键字 static cast const cast reinterpret cast dynamic cast static cast lt 类型说明符 gt 表达式 dynamic cast
  • docker进入容器出现bash-4.2#解决办法

    docker进入容器显示bash 4 2 如下 root VM 4 15 centos shopmall docker exec it u root 1f654abf60ac bash bash 4 2 出现上述问题是因为在 root 目录
  • go语言标准库

    在Go语言的安装文件里包含了一些可以直接使用的包 即标准库 Go语言的标准库 通常被称为语言自带的电池 提供了清晰的构建模块和公共接口 包含 I O 操作 文本处理 图像 密码学 网络和分布式应用程序等 并支持许多标准化的文件格式和编解码协
  • Linux 系统常用命令

    Linux 系统常用命令格式 command option argument1 argument2 其中option以 开始 多个option可用一个 连起来 如 ls l a 与 ls la 的效果是一样的 根据命令的不同 参数分为可选的
  • Centos设置屏幕不休眠

    前言 前段时间因工作需要 安装了一个centos7虚拟机体验了一把linux编程 感觉有些情况下比在windows中开发方便许多 囧 期间遇到一小问题 就是虚拟机每隔几分钟不操作 则会自动进入屏幕保护 需要重新输入密码才能进入 为此查了一下
  • 删除卷与分页文件(虚拟内存文件)

    无法删除卷可能是由于这个磁盘中存在分页文件 虚拟内存文件 引起的
  • Tomcat优化大全,进来看了,真就会了

    前言 Tomcat 服务器是一个开源的轻量级Web应用服务器 在中小型系统和并发量小的场合下被普遍使用 是开发和调试Servlet JSP 程序的首选 相信大家对于 Tomcat 已经是非常熟悉了 本篇将介绍tomcat的常见优化 那么为什
  • 网络设备网卡、中继器、集线器、网桥、交换机、路由器工作原理

    b 网络设备网卡 中继器 集线器 网桥 交换机 路由器工作原理 b b 网卡 b 1 工作在物理层 进行数据接收和发送 b 中继器 b 1 工作在物理层 用来复原网络中的信号并重新发送到其他网段上 进行数据接收再发送 b 集线器 b 1 工
  • echarts tooltip文字太长换行

    tooltip文字太长换行 设置了宽度也没有换行 加上一句 extraCssText max width 300px white space pre wrap 没加之前是这样 加上之后 extraCssText max width 300p
  • Tomcat8安装及配置详解

    Tomcat8安装及配置详解 1 下载安装包 2 安装Tomcat8 下载的zip包为免安装版 解压后可直接使用 3 配置环境变量 4 运行命令 5 测试是否成功 1 下载安装包 访问Tomcat官网https tomcat apache
  • Unity中协程(IEnumerator)的使用方法介绍

    在Unity中 一般的方法都是顺序执行的 一般的方法也都是在一帧中执行完毕的 当我们所写的方法需要耗费一定时间时 便会出现帧率下降 画面卡顿的现象 当我们调用一个方法想要让一个物体缓慢消失时 除了在Update中执行相关操作外 Unity还
  • MacOS Excel 科研作图示例

    系统版本 MacOS Catalina Excel版本 Excel for Mac 2019 效果图如下 介绍一下源数据 共有2种电极 分别用方法1与方法2处理而得 将这些电极分别用3种biomarker进行特异性实验 获得数据如下图 首先
  • RFID技术在机场行李自动分拣系统中的应用—铨顺宏

    RFID技术在机场行李自动分拣系统中的应用 1 社会背景 科技改变世界的工作方式 随着全球经济的迅猛发展 全世界范围内的贸易量不断加大 对整个的物流行业提出了更高的要求 机场行李自动分拣系统作为现代物流中的一个重要组成部分 同样面临着严峻的
  • 那些年,我们一起误解过的REST

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由sammyshen 发表于云 社区专栏 最近几年REST API越来越流行 特别是随着微服务的概念被广泛接受和应用 很多Web Service都使用了REST API REST
  • Python 入門語法和類型

    Python 入門語法和類型
  • MYSQL实现Oracle函数 over (partition by ...order by ...)

    mysql是没有oracle的这个分析函数 故只能自然根据原有语法写 先创建一个测试数据库 如图 要实现根据组别gid按num排序后重新获取列表 理论上就是自联表 把num比自己大的或者比自己小的作为临时表 代码如下 SELECT t CO
  • SAP MM ME2M ME2L ME28 增强自定义字段

    本人诚心接ABAP远程开发任务 价格公道 有需要的联系我 欢迎个人 甲方爸爸 乙方私信联系 目前项目需要增强ME2L 去增加客制化的字段 一开始顾问要求是copy标准程序 然后增加字段 查阅资料之后发现 SAP 预留了标准的增强出口去做增强
  • 计算共形几何 pdf_几何着色器

    几何着色器概述 Introduction PDF下载地址传送positiveczp github io positiveczp github io 25E5 2587 25A0 25E4 25BD 2595 25E7 259D 2580 2