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

news2024/11/26 8:34:29

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

管线/流水线

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

在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.coloradmin.cn/o/1554368.html

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

相关文章

vue实现文字一个字一个字的显示(开箱即用)

图示&#xff1a; 核心代码 Vue.prototype.$showHtml function (str, haveCallback null) {let timeFlag let abcStr for (let i 0; i < str.length; i) {(function (i) {timeFlag setTimeout(function () {abcStr str[i]haveCallback(abcStr)if ((i 1) str.length…

C# NumericUpDown 控件正整数输入控制

用到了控件的 KeyPress 和 KeyUp事件。 KeyPress 中控制输入“点、空格&#xff0c;负号”&#xff1b; KeyUp 中防止删空&#xff0c;以及防止输入超过最大值或最小值 。 private void nudStart_KeyPress(object sender, KeyPressEventArgs e){numericUpDownKeyPress(sender…

把组合损失中的权重设置为可学习参数

目前的需求是&#xff1a;有一个模型&#xff0c;准备使用组合损失&#xff0c;其中有2个或者多个损失函数。准备对其进行加权并线性叠加。但想让这些权重进行自我学习&#xff0c;更新迭代成最优加权组合。 目录 1、构建组合损失类 2、调用组合损失类 3、为其构建优化器 …

HiRoPE、MoDiTalker、RecDiffusion、DreamSalon、InterDreamer、BAMM

本文首发于公众号&#xff1a;机器感知 HiRoPE、MoDiTalker、RecDiffusion、DreamSalon、InterDreamer、BAMM Lift3D: Zero-Shot Lifting of Any 2D Vision Model to 3D In recent years, there has been an explosion of 2D vision models for numerous tasks such as seman…

利用lidar生成深度图

前言 目前&#xff0c;深度图像的获取方法有&#xff1a;激光雷达深度成像法、计算机立体视觉成像、坐标测量机法、莫尔条纹法、结构光法等。针对深度图像的研究重点主要集中在以下几个方面&#xff1a;深度图像的分割技术&#xff0c;深度图像的边缘检测技术&#xff0c;基于…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗&#xff0c;第一种直接使用公共组件&#xff0c;后两种使用CustomDialogController实现自定义弹窗&#xff0c;效果如图所示 相关概念 AlertDialog&#xff1a;警告弹窗&#xff0c;可设置文本内容和响应回调…

网络七层模型:理解网络通信的架构(〇)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解-CSDN博客 【QT入门】 QListWidget各种常见用法详解之列表模式 QListWidget有列表和图标两种显示模式&a…

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面&#xff1a;**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境&#xff08;IDE&#xff09;和Object Pascal语言进行软件开发时&#xff0c;采用…

vivado 器件编程

生成器件镜像后 &#xff0c; 下一步是将其下载到目标器件。 Vivado IDE 具有内置原生的系统内器件编程功能用于执行此操作。 Vivado Design Suite 和 Vivado Lab Edition 都包含相应的功能 &#xff0c; 支持您连接到包含 1 个或多个 FPGA 或 ACAP 的硬 件&#xff0c; 以…

9、鸿蒙学习-开发及引用静态共享包(API 9)

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。…

使用Docker Compose一键部署前后端分离项目(图文保姆级教程)

一、安装Docker和docker Compose 1.Docker安装 //下载containerd.io包 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm //安装依赖项 yum install -y yum-utils device-mapper-persistent-data l…

VTK 9.2.6 源码和VTK Examples 编译 Visual Studio 2022

对于编译 VTK 源码和编译详细的说明&#xff1a; VTK 源码编译&#xff1a; 下载源码&#xff1a; 从 VTK 官方网站或者 GitHub 获取源代码。官网目前最近的9.3.0有问题&#xff0c;见VTK 9.3.0 编译问题 Visual Studio 2022去gitlab上选择9.2.6分支进行clone CMake 配置&…

探索数据结构:链式队与循环队列的模拟、实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 队列的定义 队列&#xff08;queue&#xff09;是一种只允许在一端进…

系统分析师-参考模型

前言 网络术语中的参考模型指的是OSI参考模型&#xff0c;由ISO&#xff08;国际标准化组织&#xff09;制定的一套普遍适用的规范集合&#xff0c;以使得全球范围的计算机平台可进行开放式通信。 ISO创建了一个有助于开发和理解计算机的通信模型&#xff0c;即开放系统互联OS…

openwrt 编译mysql数据库固件,并调用

前言 openwrt 编译源码mysql数据库&#xff0c;并编写demo调用 一、整体架构设计 作者要做一个项目&#xff0c;没有后端服务&#xff0c;只有一个电脑&#xff0c;需要在电脑上安装mysql服务端。然后在设备上安装mysql客户端。 二、PC安装mysql 1.官网链接 自行百度安装&a…

一文彻底搞懂spring循环依赖

文章目录 1. 什么是循环依赖2. Spring怎么解决循环依赖3. 无法处理的循环依赖 1. 什么是循环依赖 Spring 中的循环依赖是指两个或多个 Bean 之间相互依赖&#xff0c;形成一个循环引用的情况。在 Spring 容器中&#xff0c;循环依赖通常指的是单例&#xff08;Singleton&#…

使用 Idea 快速搭建 SpringMVC 项目的详细步骤

一、开篇 SpringMVC 是一款当下流行的优秀的 MVC 框架&#xff0c;关于 MVC 的概念、作用、优点等内容介绍&#xff0c;在作者之前的一篇 Chat 《深入理解 MVC 框架原理&#xff1a;自定义 Struts2 框架》中有详细的描述。描述了关于另一款主流 MVC 框架的原理介绍&#xff0c;…

Docker-Container

Docker ①什么是容器②为什么需要容器③容器的生命周期容器 OOM容器异常退出容器暂停 ④容器命令清单总览docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker restartdocker killdocker topdocker statsdocker container insp…