Qt+OpenGL入门教程(二)——OpenGL渲染管线

渲染管线是图形学不可或缺的,在学习它之前,我们先了解一下什么是管线?

管线/流水线

当我们谈到管线时,我们指的是一个由多个阶段组成的过程,每个阶段都完成任务的一部分。在现实世界中,流水线的概念在许多不同领域中都有应用,比如汽汽车工厂的生产线等。

在1913年前福特开发出汽车流水线前,汽车组装只能让一位位工人逐工序完成,年产不过12台,效率极低;而引入了流水线概念后,每位工人只需要不停地做同一道工序,所有工序并行进行,极大地提高了工厂的生产效率。

OpenGL渲染管线

OpenGL采用的就是工厂流水线的方式,这也是为什么大家喜欢把这个绘制过程叫做图形渲染管线。

处理流程

整个处理流程可以被划分为几个阶段,上一个阶段的输出数据作为下一个阶段的输入数据,是一个串行的。每一个阶段分别在GPU上运行各自的数据处理程序,这个程序就是着色器(shader)。部分着色器允许我们使用着色器语言(OpenGL Shading Language)编写自定义的着色器,这样就可以更为细致的控制图像渲染流程中的特定处理过程了,下面是一个图形渲染管线每一个阶段的抽象表示,蓝色部分代表允许自定义着色器。

在这里插入图片描述

下面我们对渲染管线的每个流程进行详细说明!!!

  • 顶点数据(Vertex Data)

这里的顶点数据并不只是顶点坐标,它可以是顶点的颜色,法向量,纹理坐标等一系列用来绘制顶点的数据的统称,并且这里并不一定要求有顶点坐标(例如绘制圆,可以传入一个顶点坐标和一个半径,顶点着色器、几何着色器可以ui数据进行处理,生成更多的顶点数据)。

这些顶点数据是从CPU传到GPU中,传输是一个开销非常大的过程,因此传输的数据越少越好。

在这里插入图片描述

  • 顶点着色器(Vertex Shader)

负责处理输入的顶点数据并进行变换,这一阶段是用来处理一个单独的顶点数据,并且只有一个输出,所以是并行操作,可能有很多顶点数据同时使用这个顶点着色器。

着色器一词的来源主要是因为它们最初的作用是对图形物体的颜色进行计算和处理。但随着图形学的发展,着色器已经成为描述图形渲染管线中任何一种可编程阶段的通用术语,不仅仅局限于颜色计算,也可以执行各种图形相关的计算和处理。所以大家不要被这个名词所迷惑,可以叫处理器

在这里插入图片描述

  • 形状(图元)装配(Shape Assembly)

根据渲染方式(如点、线、三角形)以及顶点数据,将顶点数据组装成相应的图元。例如,如果渲染方式是三角形,那么就会根据顶点数据组装成三角形。

在这里插入图片描述

图元类型应用
GL_POINTS画离散的点
GL_LINES画线(每两个点连成一条线)
GL_LINE_STRIP画线(所有点相互连接,首尾不相连)
GL_LINE_LOOP画线(所有点相互连接,首尾相连)
GL_TRIANGLES填充三角形(每三个点围成一个,相邻的点之间不填充)
GL_TRIANGLE_STRIP填充三角形(每三个点围成一个,相邻的点之间填充)
GL_TRIANGLE_FAN填充三角形(填充三角形(以第一个点为顶点,之后每两个点合起来围成的三角形进行填充,相邻的点之间填充))
GL_QUADS填充面(每四个点围成的面进行填充,相邻点之间不填充)
GL_QUAD_STRIP填充面(每两个点构成一条线,每两条线构成一个四边形,相邻点之间填充)
GL_POLYGON填充面(将所有点围成的面进行填充)

在这里插入图片描述

  • 几何着色器(Geometry Shader)

创建新的几何图元:例如,从一个输入三角形创建多个输出三角形,从而实现几何细分。
修改几何图元:例如,平移、旋转、缩放或扭曲图元。
丢弃图元:根据特定的条件,可以选择丢弃某些输入图元,以控制输出的图元数量。

它能起到一定的裁剪作用、同时也能产生比顶点着色器输入更多的基础图元。

在这里插入图片描述

  • 光栅化(Rasterization)

它会把图元映射为最终屏幕上相应的像素。

在这里插入图片描述

  • 片段着色器(Fragment Shader)

它主要作用是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方,通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可被用来计算最终像素的颜色。

在这里插入图片描述

  • 测试(Tests)和混合(Blending)

深度测试:当绘制立体物体的时候,使用深度测试可以丢弃物体背面的像素
Alpha测试:可以通过alpha值来丢弃像素。
剪裁测试:通过设置裁剪区域来丢弃像素。
模板测试:模板测试是根据一个模板来进行测试,其目的为了让开发者能够定义自己的测试方法。

混合技术常用于表现物体的透明度,透明的物体的颜色常与位于其之后的物体的颜色进行混合,来达到透明的效果。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题记录——day8

https://leetcode.cn/problems/spiral-matrix/description/?envTypestudy-plan-v2&envId2024-spring-sprint-100 注意每次改变边界都有判断一次 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int>…

【讲解下go和java的区别】

&#x1f525;博主&#xff1a;程序员不想YY啊&#x1f525; &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f4ab; &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 &#x1f308;希望本文对您有所裨益&#xff0c;如有…

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

Oracle里的统计信息

目录 一、什么是统计信息 二、oracle收集和查看统计信息的方法 1、使用analyze命令收集统计信息 2、使用dbms_stats包收集统计信息 3、analyze和dbms_stats的区别 4、查看统计信息 一、什么是统计信息 oracle数据库里的统计信息是如下的一组数据&#xff1a;他们存储在数…

关于Linux中的history命令

前言&#xff1a;本文内容为实操学习记录&#xff0c;不具有调研价值&#xff0c;仅供参考&#xff01; 正文&#xff1a; 接触过Linux操作系统的朋友一般都知道history命令&#xff0c;直接输入history命令&#xff0c;会显示当前用户的历史输入记录。这个原理是linux会记录我…

constexpr与std::is_same_v碰撞会产生什么火花?

1. 只编译会用到的if分支 示例代码一中&#xff0c;checkType_v1和checkType_v2两个函数的区别就是if的条件里一个加了constexpr一个没加&#xff0c;加与不加从结果来看都一样&#xff0c;那在编译时和运行时各有什么区别呢&#xff1f; 示例代码一&#xff0c;test_01.cpp&…

ctfshow靶场sql注入wp

目录 web171 web172 web173 web174 web175 web176 web177-179 web180-183 web184 web185 web187 web190 web191 web192 web193 web194 web195 web196 web197 web199 web201 web202 web203 web204 web205 web206 web207 web208 web209 web210 web…

【在javascript中更改日期的格式】

在JavaScript中&#xff0c;可以使用Date对象和一些内置方法来更改日期的格式。以下是一种常见的方法&#xff1a; 创建一个Date对象&#xff0c;可以使用以下方式之一&#xff1a; 使用无参数的构造函数创建当前日期和时间的Date对象&#xff1a;var date new Date();使用指…

RedissonLock-tryLock-续期

redisson版本3.16.6 1.什么是看门狗 Redisson提供的分布式锁是支持锁自动续期的&#xff0c;也就是说&#xff0c;如果线程仍旧没有执行完&#xff0c;那么redisson会自动给redis中的目标key延长超时时间&#xff0c;这在Redisson中称之为 Watch Dog 机制。默认情况下&#x…

vscode调试Unity

文章目录 vscode调试UnityC#环境需求开始调试 Lua添加Debugger环境配置联系.txt文件配置Java环境 添加调试代码断点不生效的问题 vscode调试Unity C# 现在使用vscode调试Unity的C#代码很简单&#xff0c;直接在vscode的EXTENSIONS里面搜索“Unity”&#xff0c;第一个就是&am…

VMware虚拟机更换引导顺序

前言 我用wmware装了黑群晖测试&#xff0c;将img转成vmdisk的格式之后发现系统引导盘之后1G&#xff0c;有点太小了 我准备把wmware的黑群晖系统迁移到新添加的虚拟磁盘里 1.登录黑群晖的SSH 请先在黑群晖的控制面板中的终端机和SNMP里面启用SSH功能&#xff0c;才能使用ss…

PLC_博图系列☞P=:在信号上升沿置位操作数

PLC_博图系列☞P&#xff1a;在信号上升沿置位操作数 文章目录 PLC_博图系列☞P&#xff1a;在信号上升沿置位操作数背景介绍P&#xff1a;在信号上升沿置位操作数说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 P 背景介绍 这是一篇关于PLC编程的文章…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式&#xff0c;有问题全选重试和是&#xff0c;打到这了&#xff0c;我感觉这个配置我都不用写了&#xff0c;启动靶机如下图所示即可 二.开始渗透 1.信…

蓝桥杯飞机降落dfs深度解析

蓝桥杯飞机降落dfs深度解析 蓝桥杯14届省赛[飞机降落]题目描述输入格式输出格式样例输入样例输出提示code完整代码&#xff1a; 蓝桥杯14届省赛[飞机降落] 题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到达机场上空&#xff0c;到达时它的…

Few-short Learning笔记-1

Few short learning 用很少的样本进行分类或者是回归 support set&#xff1a;小的数据集&#xff08;无法训练出深度神经网络&#xff09; few short learning的目标是让机器自己学会学习。 few shot learning是一种meta learning&#xff08;learn to learn&#xff09; 举…

Rust编程(五)终章:查漏补缺

闭包 & 迭代器 闭包&#xff08;Closure&#xff09;通常是指词法闭包&#xff0c;是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量&#xff0c;在函数式编程范式中也被称为自由变量&#xff0c;是指并不是在闭包内定义的变量。将自…

MySQL学习笔记------DCL

DCL Data Control Language&#xff08;数据控制语言&#xff09;&#xff0c;用来管理数据库用户、控制数据库的访问权限 一、管理用户 1、查询用户 USE mysql&#xff1b; select *from user&#xff1b; 2、创建用户 create user 用户名主机名 identified by 密码&a…

向机器人传授人类社会同步的艺术

在数字时代&#xff0c;社交机器人正迅速成为主流社会的一部分&#xff0c;从培训医生和教育儿童到提供谈话疗法和客户服务。现在&#xff0c;这是一个价值数十亿美元的全球产业&#xff0c;对具有类似人类社交智能的机器人的需求不断增长&#xff0c;这标志着我们技术史上的一…

Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.冯诺依曼体系 二.操作系统 2.1概念 2.2结构示意图&…

质检规则-正则

目录 需求 实现 mysql oracle pg hive 达梦 需求 在数据质量检核中&#xff0c;经常会要求检查数据数据符合某些要求&#xff0c;比较某个字段是否是数字或者是否是日期等等&#xff0c;经常这种就用到数据库正则 实现 参数说明&#xff1a; 通用规则&#xff0c;${PAR…