【openGL4.x手册10】基元程序集和面部剔除

https://www.khronos.org/opengl/wiki/Face_Culling

一、说明

   基元汇编是 OpenGL 渲染管道中的阶段,在该阶段,基元被划分为一系列单独的基本基元。经过一些小的处理后,如下所述,它们被传递到光栅器进行渲染。

二 早期原始组装

   基元组装步骤的目的是将顶点流转换为基基元序列。例如,一个包含 12 个顶点的行列表的基元需要生成 11 个行基基元。

   完整的原始组装步骤(包括下面的处理)将在 Vertex 后处理期间进行。但是,某些顶点处理步骤需要将基元分解为一系列基本基元。例如,几何着色器对基元序列中的每个输入基元进行操作。因此,在 GS 可以执行之前,必须发生一种形式的原始程序集。

   这个早期的基元程序集只执行到基本基元的转换。它不执行以下任何处理步骤。

   如果“几何着色器”或“曲面细分”处于活动状态,则必须进行此类早期处理。曲面细分的早期组装步骤已简化,因为 Patch 基元始终是 Patch 序列。

2.1 原始秩序

   处理基元的顺序是明确定义的(在大多数情况下)。顺序定义如下:

   单个 Vertex Rendering 命令中的所有基元都先于后续此类命令中的任何基元。
   如果绘图命令是多绘制命令,则一个子绘制的所有基元都排列在后续子绘制的基元之前。
   在绘制或多重绘制的子绘制中,如果绘图命令是实例化渲染命令,则一个实例中的所有基元都排在具有较大gl_InstanceID值的基元之前。
   在特定的绘制/子绘制/实例中,基元根据顶点流和该绘制的渲染参数进行排序,由渲染命令提供的基元类型解释。
   如果曲面细分评估着色器处于活动状态,则通过曲面细分单个面片生成的所有基元都先于具有较大gl_PrimitiveID值的面片生成的任何基元。
   相对于从同一补丁生成的其他基元,由特定补丁生成的任何给定基元的顺序都是不确定的。
   如果几何着色器处于活动状态,则根据上述排序规则,从特定输入基元生成的基元在由后续输入基元生成的基元之前排序。
   对于特定的输入基元,如果 GS 使用 Geometry Shader    Instancing,则实例生成的所有基元都排在具有较大 gl_InvocationID值的实例生成的基元之前。
在 GS 调用中,GS 生成的基元按发出这些基元及其组件顶点的调用顺序排序。

2.2 光栅器丢弃

   所有基元都可以通过启用GL_RASTERIZER_DISCARD来丢弃。这样可以防止栅格化任何基元。

   这对于测试先前渲染阶段的性能很有用,但对于防止渲染在转换反馈操作期间生成的基元也很有用。

三、背面剔除

   所有变换步骤之后的三角形基元都具有特定的朝向。这是由构成三角形的三个顶点的顺序以及它们在屏幕上的表观顺序定义的。三角形可以根据其表面的表面被丢弃,这一过程称为面剔除。

3.1 绕线顺序

   当用户发出绘图命令时,渲染管线处理的顶点将按照顶点规范提供的顺序进行处理。几何着色器可以更改顺序,但即便如此,每个 GS 调用创建的顶点也是相对于其他顶点排序的。“曲面细分评估着色器”可以使用特殊选项直接控制曲面细分面片中顶点的顺序。

   在基元组装过程中将顶点分解为基元时,会记录顶点相对于基元中其他顶点的顺序。三角形中顶点的顺序与它们的视觉方向相结合时,可用于确定三角形是从“正面”还是“背面”看到。

   这是由三角形的缠绕顺序决定的。给定三角形的三个顶点的顺序,三角形可以看起来具有顺时针绕组或逆时针绕组。顺时针意味着三个顶点按顺序绕三角形的中心顺时针旋转。逆时针是指三个顶点按顺序绕三角形中心逆时针旋转。
在这里插入图片描述

哪一侧被认为是“正面”,由此功能控制:

void glFrontFace(GLenum mode​);

   这是全局状态。模式可以是GL_CW或GL_CCW,这意味着顺时针或逆时针分别是正面的。在新创建的 OpenGL 上下文中,默认正面为 GL_CCW。

   非三角形基元将始终被视为显示其正面。

3.1.1 曲面细分

   主条目:曲面细分绕线顺序
   在曲面细分期间生成的抽象面块顶点的缠绕顺序由曲面细分评估着色器控制。它是 TES 指定的布局选项,而不是运行时值。绕组顺序根据方向指定:cw 和 ccw。哪个被认为是“前端”仍然由 glFrontFace 定义。

   请注意,这仅指定抽象面片空间中三角形的缠绕顺序。每个三角形的最终缠绕顺序将基于这些顶点的位置如何通过 TES(或后续的几何着色器)进行转换。所以这个设置只是一个起点,而不是终点。

3.2 面剔除

   设置三角形正面的主要用途是允许剔除正面或背面三角形。

   考虑一个立方体;它由 12 个三角形组成,但其中 6 个将与其他 6 个朝向相反的方向。除非立方体是透明的,否则其中 6 个三角形将始终被其他 6 个三角形覆盖。事实上,根据投影的不同,可以覆盖 6 个以上的三角形;想象一下,从正面看一个离相机很近的立方体。透视缩短意味着即使是侧面也背对着相机。

   面部剔除允许在昂贵的光栅化和片段着色器操作之前删除闭合表面的不可见三角形。

   要激活背面剔除,必须先使用 glEnable 启用GL_CULL_FACE。默认情况下,脸面剔除处于禁用状态。要选择要剔除的一侧,请使用以下函数:

void glCullFace(GLenum mode));

   模式可以设置为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK。后者将剔除所有三角形。这与 glEnable(GL_RASTERIZER_DISCARD) 不同,因为后者将关闭所有基元,而剔除两个面只会剔除三角形(因为只有它们有面)。

   默认情况下,GL_BACK 是要剔除的面。

3.3 片段着色器

   主条目:Fragment_Shader#System_inputs
   片段着色器能够检测基元的栅格化面。如果从正面看到基元(或者是没有正面的基元),则内置 FS 输入gl_FrontFacing将为 true,如果从背面看到,则为 false。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring实例化Bean的三种方式

参考资料: Core Technologies 核心技术 spring实例化bean的三种方式 构造器来实例化bean 静态工厂方法实例化bean 非静态工厂方法实例化bean_spring中有参构造器实例化-CSDN博客 1. 构造函数 1.1. 空参构造函数 下面这样表示调用空参构造函数,使用p…

npm ERR! cb() never called!(已解决)

从仓库拉下来的代码,用npm install时报错 试了很多种方法,结果发现有一种可能是你的node版本过低导致的,可以升级node版本试一下。 node版本升级后,把上一次npm install错误的node_modules删除,重新npm install。

压力测试面试题及答案!

压力测试是软件测试中的一种测试方式,用于评估软件系统在各种压力条件下的性能表现。以下是常见的压力测试面试题及答案: 什么是压力测试? 压力测试是一种测试方式,用于模拟实际用户在正常和峰值负载条件下对软件系统施加的压力&…

java线程池原理浅析

问题与解决: 问题: 查询大数据量的时候,例如一次返回50w数据量的包,循环去查询发现读取会超时。 解决方案: 经过思考采用多线程去分页查询。使用线程池创建多个线程去查询分页后的数据最后汇总一下,解决…

双指针算法_盛水最多的容器

题目: 题目解析: 如图所示,一个数组内部存储的是高度,求数组中,能够组成最大容量的两个元素,需要注意的是容量是 高度*宽度,这里的宽度指的是两个数字之间的距离,且需要注意高度中&…

现代c++内存管理的方式有哪些?

在现代C编程实践中,内存管理是软件开发中的核心议题之一,直接影响着程序的性能、稳定性以及资源的有效利用。C提供了一系列丰富且灵活的内存管理机制,以适应不同场景的需求和应对潜在的内存问题,如内存泄漏、野指针和堆栈溢出等。…

VUE之首次加载项目缓慢

最近公司有个大型的项目,使用vue2开发的,但是最终开发完成之后,项目发布到线上,首次加载项目特别缓慢,有时候至少三十秒才能加载完成,加载太慢了,太影响用户体验了,最近研究了一下优…

java spirng和 mybatis 常用的注解有哪些

当在Java Spring和MyBatis中进行开发时,常用的注解对于简化配置和提高开发效率非常重要。以下是更多常用的注解以及它们的详细说明和用途: 在Spring中常用的注解: Component: 用途:表明一个类会作为组件被Spring容器管…

AJAX(一):初识AJAX、http协议、配置环境、发送AJAX请求、请求时的问题

一、什么是AJAX 1.AJAX 就是异步的JS和XML。通过AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。 2.XML 可扩展标记语言。XML被设计用来传输和…

C++(13) STL 库初识

文章目录 STL 库初识1. STL 库1.1 STL 库的案例1.2 C 标准模板库的三个组件1.3 案例展示 2. 迭代器1.1 概述和分类2.2 代码案例 STL 库初识 1. STL 库 1.1 STL 库的案例 类似学习了模板的概念。CSTL (标准模板库) 是一套功能强大的 C 模板类,提供了通用的模板类和…

【Linux详解】——进程信号

📖 前言:本期介绍进程信号。 目录 🕒 1. 生活角度的信号🕒 2. 技术角度的信号🕘 2.1 Linux中的信号🕘 2.2 进程对信号的处理 🕒 3. 信号的产生方式🕘 3.1 键盘产生🕘 3.2…

svn如何合并代码以及解决合并冲突的问题(把分支代码合并到主版本)

1.选择主版本的文件夹。 ​​​​​​​ 2.选择合并一个不同的分支 3.选择主分支的路径和要合并的代码范围 4.点解next 选择这两个选项 5.然后点击Test merge,查看能否和并成功 有红色的提示,说明是有冲突的, 都是黑色说明能够合并成功 …

【无标题】如何使用 MuLogin 设置代理

如何使用 MuLogin 设置代理 使用 MuLogin 浏览器设置我们的代理,轻松管理多个社交媒体或电子商务帐户。 什么是MuLogin? MuLogin 是一款虚拟反检测浏览器,使用户能够管理多个电子商务、社交媒体和广告帐户,而无需验证码或 IP 禁…

星巴克终止Odyssey Beta NFT计划

日前,咖啡品牌星巴克宣布将于3月31日终止其NFT产品Odyssey Beta客户忠诚度计划。这意味着,曾经旨在改进会员忠诚度的Web3 产品Starbucks Odyssey将终止,构筑多年的Web2会员系统“星享俱乐部”脱去了Web3外衣,回到了本来的面貌。 至…

体验分低导致闭店!抖音小店体验分是什么?教你如何提高体验分!

哈喽~我是电商月月 相信开抖音小店的伙伴们对体验分这个东西都不陌生,但如何有效的提高体验分你们知道吗? 今天,我就来讲讲抖音小店体验分低有什么后果,同时在后面说一下体验分降低如何提高! 大家可根据情况不同自行…

羊大师羊奶靠谱么?品质保障深度解析

羊大师羊奶靠谱么?品质保障深度解析 羊大师羊奶,作为市场上的知名品牌,其靠谱性一直备受消费者关注。那么,羊大师羊奶究竟靠谱不靠谱呢?这就需要从品质保障和消费者信赖两个方面进行深入解析。 从品质保障的角度来看&…

【JAVA】数据类型与变量(主要学习与c语言不同之处)

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 1.字面常量 在上节课 Hello…

Mysql的高级语句2

目录 引言: 一、按关键字进行排序 1、语句以及用法 2、先创建一个新的数据库以及数据表,并且导入内容 二、关键字排序操作 1、单个字段排序 ①按照分数进行排序,默认不指定就是升序排列 ②按照分数降序排列 ③结合where进行条件过滤…

C# LINQ笔记

C# LINQ笔记 from子句 foreach语句命令式指定了按顺序一个个访问集合中的项。from子句只是声明式地规定集合中的每个项都要访问,并没有指定顺序。foreach在遇到代码时就执行其主体。from子句什么也不执行,只有在遇到访问查询变量的语句时才会执行。 u…

【zlm】问题记录:chrome更新引起的拉不出webrtc; 证书校验引起的放几秒中断

目录 chrome更新引起的拉不出webrtc 证书校验引起的放几秒中断 chrome更新引起的拉不出webrtc 【zlm】最新的chrome版本中的报错: 我有个问题event.js:8 [RTCPusherPlayer] DOMException: Failed to execute setRemoteDescription on RTCPeerConnection: Failed …