第九章 细分着色器

2023-11-20

第九章 细分着色器

细分面片

细分着色器只能处理面片(patch)类型的图元,如果启用细分着色器,将其他类型图元传递给它会产生GL_INVALID_OPERATION错误,如果没有启用细分着色器,那么渲染面片数据也会得到GL_INVALID_OPERATION错误。

面片就是传递给OpenGL的顶点列表,处理过程要保证顺序正确。

指定面片顶点数量

void glPatchParameteri(GLenum pname, GLint value);

pname必须设置为GL_PATCH_VERTICES,value为面片顶点个数,范围需要限制在[0, GL_MAX_PATCH_VERTICES]中。面片顶点个数默认为3个,如果顶点个数小于3那么将忽略该面片,并且不会产生几何体。

细分控制着色器

生成输出面片的顶点

细分控制着色器的输入保存在gl_in当中,它的大小与glPatchParameteri()中设置的面片大小是相通的,可以通过gl_PatchVerticesIn来获取它的大小,相当于gl_in.length()。

生成的顶点列表保存在gl_out当中,其大小可以通过布局限定符(layout)来设置:

layout (vertices = 16) out;

该声明实现两个目的:设置gl_out的数量,以及细分控制着色器执行的次数:每个输出面片顶点执行一次。

可以使用gl_InvocationID来判断当前处理的是哪个输出顶点,也就是gl_out中的索引位置,同一个patch中的顶点可以互相访问数据。

细分控制着色器的变量

gl_in的每个元素的结构为:

in gl_PerVertex{
    vec4 gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[gl_PatchVerticesIn];

细分控制着色器的其他输入变量

变量声明 描述
gl_InvocationID 当前TCS请求的输出顶点索引
gl_PrimitiveID 当前输入patch的图元索引
gl_PatchVerticesIn 输入patch顶点数量
gl_PatchVerticesOut 输出patch顶点数量

细分控制

外侧细分层级:gl_TessLevelOuter[4]
内侧细分层级:gl_TessLevelInner[2]

如果没有绑定TCS指定细分层级:

void glPatchParameterfv(GLenum pname, const GLfloat* values);

pname使用GL_PATCH_DEFAULT_OUTER_LEVEL或GL_PATCH_DEFAULT_INNER_LEVEL。前者需要values中包含4个浮点值,后者values需要包含2个浮点值。

细分计算着色器

每一个通过图元生成得到的细分坐标都需要执行一次细分计算着色器,用以判断从细分坐标而来的顶点位置。

配置图元生成器

通过layout布局限定符来控制

设置图元生成域

图元类型 描述 域坐标
quads 单位块上的一个四边形域 (u, v)对的形式,范围从0~1
triangles 使用重心坐标的三角形 (a, b, c)坐标形式,取值范围是0~1且a+b+c=1
isolines 一系列穿过单位块的线段集合 (u, v)对形式, u的范围从0~1, v的范围从0到接近于1的值

设置生成图元的面朝向

cw表示顶点按照顺时针排列
ccw表示顶点按照逆时针排列

设置细分坐标的间隔

选项 描述
equal_space 细分层级被截断在[1, max]内,然后取整到下一个整数值
fractional_even_spacing 数值将被阶段在[2, max]内,然后取整到下一个偶整数值n。然后将边界划分为n-2个等长的部分,以及2个位与两端的部分(可能比其他部分的长度更短)
fractional_odd_spacing 数值将被阶段在[1, max]内,然后取整到下一个奇整数值n。然后将边界划分为n-2个等长的部分,以及2个位与两端的部分(可能比其他部分的长度更短)

设置输出点集

使用point_mode选项来指定输出点集,而不是等值线或者填充区域。

layout(triangles, equal_spacing, ccw, points) out;

设置顶点位置

着色器中的细分坐标是通过gl_TessCoord变量给出的。

细分着色器的输入变量

gl_in的结构

in gl_PerVertex{
    vec4 gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
} gl_in[gl_PatchVerticesIn];

其他输入变量

变量声明 描述
gl_PrimitiveID 当前输入面片的图元索引
gl_PatchVerticesIn 输入面片的顶点数,也就是gl_in的大小
gl_TessLevelOuter[4] 外侧细分层级的值
gl_TessLevelInner[2] 内侧细分层级的值
gl_TessCoord 还未进入细分计算着色器中面片域空间的顶点坐标值

输出顶点数据结构

out gl_PerVertex{
    vec4 gl_Position;
    float gl_PointSize;
    float gl_ClipDistance[];
};

细分的共享边域裂缝

OpenGL中的细分可以确保面片中生成的几何体不会有任何的裂缝存在,但是它无法保证共享一条边的面片也不存在裂缝。
一种常见的解决方法是,找到所有对周长边的顶点有贡献的输出面片顶点,按照预设的方式进行排序,也就是沿着边长向量增加大小的方式。
另一种避免裂缝的方法就是在着色器计算的时候,如果存在两个着色器请求的顶点顺序不一致的情况,就是用precise限定符。

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

第九章 细分着色器 的相关文章

  • 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 80040154没有注册类.(注册组件的方法)

    执行程序报错如下 原因 没有注册rmReport组件 解决办法 注册组件 注册组件方法如下 首先你要知道你要注册哪个文件 并且找到它 上图报错位置那个变量是我要注册的文件 并且我在自己的项目中找到了它 之后打开C Windows Syste
  • 仅需一个样本即可定制个性化的SAM

    Personalize Segment Anything Model with One Shot https arxiv org pdf 2305 03048 pdf https github com ZrrSkywalker Person
  • shell脚本之循环语句

    for循环 语法1 for i in 集合 do 程序 done 语法2 for i 0 i lt 100 i do 程序 done eg 批量压缩文件 bin bash 批量压缩文件 cd root ls tar gz gt ls log
  • Flutter屏幕适配之二:Image资源assets的使用,实现不同分辨率图片的适配

    这两天在研究Flutter的屏幕适配方案 关于尺寸大小已经有点眉目了 初步定了利用等比例缩放 感兴趣的朋友可移步Flutter屏幕大小适配 但是还是不清楚怎么进行图片分辨率适配的 在百度了之后 仍然有点云里雾里 罢了 直接上官网看吧 果然
  • 【机器学习】入门:为什么梯度下降算法这么有效?

    译者 张雨佳 人们很难真正通过数学理解东西 你只需要去习惯并使用它 约翰 冯 诺伊曼 在机器学习中 我们已经习惯了使用梯度下降法解决问题 以至于没人去质疑它为什么有效 大家经常将梯度下降法模拟为爬山 要想找到崎岖地形中的顶峰 或低谷 就必须
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • 使用SVD求最小二乘刚性转置

    参见文章 Least Squares Rigid Motion Using SVD 一 问题描述 假设P p1 p2 pn 和Q q1 q2 qn 是两组Rd空间中的对应点集 现在想要根据这个两个点集的数据来计算出它们之间的刚性转置信息 可
  • LINUX下安装软件命令详解

    一 解析Linux应用软件安装包 通常Linux应用软件的安装包有三种 1 tar包 如software 1 2 3 1 tar gz 它是使用UNIX系统的打包工具tar打包的 2 rpm包 如software 1 2 3 1 i386
  • QT遍历文件夹下的所有文件

    文章目录 方法一 代码 方法二 需要注意的地方 代码 技巧 代码 方法一 使用类QDirIterator来进行遍历 简介 大概是说 适合于大目录遍历 支持递归但是不支持排序 QDirIterator NoIteratorFlags默认值 没
  • SpringBoot整合ELK教程

    SpringBoot整合ELK教程 1 基础概念 ELK 即 Elasticsearch Logstash Kibana 组合起来可以搭建线上日志系统 本文主要讲解使用 ELK 来收集测试框架产生的日志 Elasticsearch 用于存储
  • Nim 游戏

    你和你的朋友 两个人一起玩 Nim 游戏 桌子上有一堆石头 你们轮流进行自己的回合 你作为先手 每一回合 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你们每一步都是最优解 请编写一个函数 来判断你是否可以在给定石头数量
  • Linux_centos7_文件与目录管理_目录操作(1)_(Bird_Bro)

    关键词 路径 相对 绝对 目录操作 特殊目录 目录处理 环境变量 文件与目录验视 ls https blog csdn net weixin 38872771 title directory operating command 切换至roo
  • 程序员教你如何用Python爬取付费小说

    小说相信大家都爱看吧一章接一章具有极大的吸引力 看了还想看 当然付费小说价格也不便宜 看到一半突然收费 猝不及防 在我们程序员这里 收费是不存在的 万物皆可爬 什么是网络爬虫 网络爬虫 又被称为网页蜘蛛 网络机器人 在FOAF社区中间 更经
  • 【Colab】【使用外部数据的7种方法】

    文章目录 方法1 通过Files explorer上传 方法2 使用Colab files上传 方法3 读取Github链接 方法4 克隆Github项目 方法5 使用wget axel下载文件 方法6 读取谷歌硬盘数据 方法7 Kaggl
  • 天干年月算法java

    上班空闲时间 看见朋友圈发了张毛笔画 上面写了丙申 好奇查了查 下面说说java实现 很简单 简单到爆 哈啊哈 String tianGanTZ 庚 辛 壬 癸 甲 乙 丙 丁 戊 己 申 酉 戌 亥 子 丑 寅 卯 辰 巳 午 未 int
  • Java+SSM+Vue 毕业设计 电影院在线售票管理系统系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 开发环境 3 3 系统流程 3 3 1 系统开发流程 3 3 2 用户登录流程 3 3 3 系统操作流程 3 4 系统结构设计 4 项目获取 1 项
  • JVM中的对象和引用详解

    1 对象的创建过程 其中的步骤是 当虚拟机碰到一条new指令时 先检查对象是否被加载 如果未被加载 就先将class加载到运行时数据区 然后虚拟机为对象分配内存 分配内存有两种方式 内存空间如果不是碎片化的 内存中已经使用的和未使用的内存空
  • 2023·基于Node.js的快递查询项目

    随着电商的发展 如今网上购物的人越来越多 频率越来越高 不用出门就能买到自己想要的东西 商品下了单之后商品怎么到自己的手上呢 这就离不开快递和物流了 商家把商品给到快递和物流服务商 快递和物流服务商则把商品运输并配送到我们的手上 除了电商行
  • Sublime Text 3 插件安装及Vim 模式设置

    Sublime Text 3 1 安装Sublime Text 3 下载安装 http www sublimetext com 3 Package Control安装 https sublime wbond net installation

随机推荐

  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java数组细节

    注意细节 1 数组的元素可以是任意类型 包括基本类型和引用类型 但是不能混用 2 数组中的元素满足自动转型原则 比如double类型的数组中可以存储int整数 这是因为整数已经自动转成double 但是int类型的数组中不能存放string
  • 第二十四节:动态加载JS和动态加载CSS

    1 动态加载JS 一般需要用到js 需要将js放到
  • R基础(一)- R版本升级、现有版本查看

    R版本升级 系统 WINDOWS 方式 推荐打开RGui界面进行升级 而不要再RStudio中直接输入命令 包 installr 代码 安装包 如果已经有此包可跳过此步骤 install packages installr 加载包 升级 l
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • 0227:zotero文献管理/小绿鲸英文/CSDN做笔记

    搜索 下载 白嫖 翻译 文章 如何精准找到和方向相关的文献 谷歌学术 国内无法正常进入 两个镜像网站 https xueshu dailyheadlines cc https scholar lanfanshu cn 搜索技巧 关键词套双引
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • 【排错】error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14:的解决方式

    在部署k8s的时候 编写k8s的dashboard文件 遇到以下错误 error error parsing recommended yaml error converting YAML to JSON yaml line 14 could
  • PLINQ并行查询效率的简单分析

    PLINQ并行查询效率的简单分析 假设执行一次查询需要花费的时间比较大 那我们可以采用PLINQ并行查询来进行提速 并行查询 就是利用多核计算机并行执行查询语句来进行提速 这很好理解 一个工人工作慢 那就多叫几个工人同时进行工作 这样工作的
  • php 实现微信消息时间,在微信小程序中如何实现时间功能

    这篇文章主要介绍了微信小程序使用picker实现时间和日期选择框功能 结合实例形式分析了微信小程序picker组件进行日期与时间选择的相关操作技巧 并附带源码供读者下载参考 需要的朋友可以参考下 本文实例讲述了微信小程序使用picker实现
  • 选择结构程序设计和循环控制(if语句,switch语句,条件运算符,for循环,while及do while语句,break,continue,goto语句)折半查找法及猜数字游戏带你巩固理解

    本章我们来迅速学习一下选择语句和循环语句 首先我们来了解何为语句 C语言中语句可以分为以下五类 1 表达式语句 2 函数调用语句 3 控制语句 4 复合语句 5 空语句 这篇文章我们主要讲的是控制语句 控制语句 控制语句主要用于控制程序的运
  • IDEA 三种注释生成方式

    三种注释方式 行注释 块注释 方法或类说明注释 一 快捷键 Ctrl 使用Ctrl 添加行注释 再次使用 去掉行注释 二 演示代码 if hallSites null hallSites size gt 0 行注释 最大行号 int max
  • 【Python】基于Python利用熵权法计算数据权重——一个简单的图形用户界面编程

    目录 1 简介 2 技术流程 3 数据 4 代码 4 1 代码 极差标准化 4 2 代码 熵权法赋权 5 实验操作与流程 6 关于数据获取 1 简介 师弟又催我给他公众号写文了 这次还点名要这个题目 所以我就先到自己的博客里写写练练手 下面
  • ​Java 输入一个字符串,统计其中字符 A 的数量并输出。

    题目描述 输入一个字符串 统计其中字符 AA 的数量并输出 输入 输入一个不带空格的字符串 字符串长度不超过 100 输出 输出字符串中字符 A 的数量 样例输入 AabdkeaoektA 样例输出 2 import java util S
  • sublime text 3上使用Git连接Github

    首先下载的sublime text 3我是在PHP中文网下载的 是汉化版 一进去就有git插件 之前很久下过的好像不能使用插件 所以我就下了最新的汉化版 进去就有git插件 再者就是git要自己下载一下安装 配置好path环境变量 也就是c
  • 点击按钮复制链接

    做点击按钮复制链接 网上找的方法是用原生js document execCommand Copy window clipboardData setData Text url value 发现微信上存在不兼容 在安卓和PC段都可以 但是在苹果
  • 2023问题汇总

    问题汇总 Linux相关 1 vim 修改挂载文件时 报错 read only filesystem 2 root 用户密码无法更改 3 linux 用户被锁定 4 linux 查看登录日志 其他小问题 1 linux 的dns 修改配置
  • 企微报错60020

    errcode 60020 errmsg not allow to access from your ip hint 1655882753557010848204971 from ip more info at https open wor
  • wazuh安装手册

    一 wazhu部署架构 1 服务器上运行的Agent端会将采集到的各种信息通过加密信道传输到管理端 2 管理端负责分析从代理接收的数据 并在事件与告警规则匹配时触发警报 3 LogStash会将告警日志或者监控日志发送到Elasticsea
  • 第九章 细分着色器

    第九章 细分着色器 细分面片 细分着色器只能处理面片 patch 类型的图元 如果启用细分着色器 将其他类型图元传递给它会产生GL INVALID OPERATION错误 如果没有启用细分着色器 那么渲染面片数据也会得到GL INVALID