OpenGL渲染管线(Rendering Pipeline)介绍

news2024/9/21 23:49:20

渲染管线

        计算机图形学中,计算机图形管线(渲染管线 或简称 图形管线、流水线)是一个概念模型,它描述了t图像系统将 3D场景渲染到2D屏幕所需执行的一系列步骤。渲染管线大的可以分为三个阶段。

(一)应用阶段

        应用阶段是开发者掌握一切的阶段,包括对于各种数据的准备以及向GPU进行传输的过程,如顶点数据、摄像机坐标、视锥体数据、场景模型以及光源等。还包括数据的基本处理,比如不可见对象的剔除以及设置渲染状态,包括但不限于材质、纹理、着色器。总而言之就是向图形处理单元输送点、线、面等渲染图元。

(二)几何阶段

        集合阶段包括顶点着色、细分着色、几何着色、图元装配、剪切、屏幕映射。

顶点着色

        对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来处理定点相关的数据。顶点着色器可能非常简单,只是将数据复制并传递到下一个着色阶段,叫做传递着色器;也可能会非常复杂,比如执行大量的计算得到定点在屏幕上的位置。一个复杂的程序一般会存在多个顶点着色器,但同时只会有一个顶点着色器起作用。

细分着色

        曲面细分着色器是一个可选的阶段。曲面细分是利用镶嵌化处理技术对三角形进行细分,以此来增加物体表面的三角面数量。在这一阶段,程序员可以进行曲面细分操作,看起来就像在原有的图元内加入了更多的顶点。对于一些有大量曲面的模型,进行曲面细分可以让曲面更加圆润;如果为这些细分的顶点再准备一些位置信息,那么这些细分的顶点将有助于我们展现一个细节更加丰富的模型。这也是贴图置换(Displacement Mapping)的基本思路。 

集合着色

        几何着色器也是一个可选的阶段。顶点着色器以顶点数据作为输入,而几何着色器则以完整的图元(Primitive)作为输入数据。例如,以三角形的三个顶点作为输入,然后输出对应的图元。与顶点着色器不能销毁或创建顶点不同,几何着色器的主要亮点就是可以创建或销毁几何图元,此功能让GPU可以实现一些有趣的效果。例如,根据输入图元类型扩展为一个或更多其他类型的图元,或者不输出任何图元。需要注意的是,几何着色器的输出图元不一定和输入图元相同。几何着色器的一个拿手好戏就是将一个点扩展为一个四边形(即两个三角形)。

图元装配

        前几个步骤都是对顶点数据进行处理。本阶段是将传输进来的顶点与相关的几何图元组织起来,准备下一步的剪切和光栅化工作。

剪切

       对视窗(viewport)外的顶点进行剔除,避免不会在是窗外绘制。 该步骤是OpenGL自动完成的。

屏幕映射    

        对输入的坐标仍是范围在单位立方体内的三维坐标,本阶段任务是将每个图元的x、y值变换到屏幕坐标系(屏幕坐标系是一个2D空间)。由于输入坐标范围在[-1,1],因此这是一个拉伸到屏幕分辨率大小的过程。对于输入的坐标z值不做任何处理(实际上屏幕坐标系和z坐标一起构成窗口坐标系),这些值会被一起传递到光栅化阶段。

(三)光栅化阶段

        光栅化阶段包括光栅化、片元着色、逐片元操作。

光栅化

        光栅化的工作是判断某一部分几何体所覆盖的屏幕空间。得到屏幕空间信息以及输入的顶点数据之后,光栅化单元就可以直接对片元着色器中的每一个可变变量进行线性插值,然后将结果传递给用户的片元着色器。

片元着色    

        片元着色器是一个非常重要的可编程着色器阶段,前面的光栅化阶段实际上并不会影响每个像素的颜色值,而是会产生一系列的数据信息,用来表述一个三角网格是怎样覆盖每个像素的,而片元就负责存储这样一系列信息,真正会对产生影响的是下一个阶段逐片元操作。
片元着色器的输入是上一个阶段对顶点信息进行插值的结果(是根据从顶点着色器输出的数据插值得到的),而它的输出是像素颜色值。这一阶段可以完成很多重要的渲染技术,其中最重要的技术有纹理采样、逐片光照计算等,覆盖片元的纹理坐标是通过前述的阶段的顶点数据插值得到的。

逐片元的操作

        这个阶段会使用深度测试和模板测试来决定一个片元是否可见。如果一个片元成功的通过了所有的激活测试,那它就可以直接被会知道帧缓存中了,它对应的像素的颜色值(也可能包括深度值)会被更新,如果开启了融混模式,那么片元的颜色会与该像素当前的颜色相叠加,形成一个新的颜色值并写入帧缓存中。

总结

 

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

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

相关文章

基于SpringBoot+Vue+MySQL的手机销售管理系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着智能手机的普及和市场竞争的日益激烈,手机销售行业面临着前所未有的挑战与机遇。传统的手工记录和简单的电子表格管理方式已难以满足现代手机销售业务的需求,销售数据的混乱和管理效率低…

小程序地图展示poi帖子点击可跳转

小程序地图展示poi帖子点击可跳转 是类似于小红书地图功能的需求 缺点 一个帖子只能有一个点击事件,不适合太复杂的功能,因为一个markers只有一个回调回调中只有markerId可以使用。 需求介绍 页面有地图入口,点开可打开地图界面地图上展…

ftrace - 几种tracer的打印例子

ftrace - Function Tracer — The Linux Kernel documentation【原创】Ftrace使用及实现机制 - 沐多 - 博客园 (cnblogs.com) latency format nop tracer和function tracer下,latency format的时间戳是相对开始trace的时间,non-latency format的时间戳是…

面向对象例题之例题的特性

答案:C 解析:对象里面的方法和属性数量是不确定的,可以不断扩展写多个属性和方法 清洗的边界是对象必备的,哪些是这个类的,哪些是其他类的都有体现。 良好的定义行为一般指定义良好的属性和方法 可扩展性指的是子类…

面向对象设计原则例题

答案:B A C D D C 知识点: 面向对象设计7大原则 单一职责原则 设计目的单一的类 开放—封闭原则 对外扩展开放,对修改封闭 里氏替换原则 子类可以替换父类 依赖倒置原则 要依赖于抽象,而不是具体的实现;针对接…

万字长文——ConvNeXt(2022CVPR),卷积网络的顶峰之作,在Transformer盛行的当下,卷积网络还能再战!

ConvNext:A ConvNet for the 2020s ConvNext:2020 年代的卷积神经网络 论文地址: https://arxiv.org/pdf/2201.03545 自从Transformer成功应用在视觉领域并且取得显著成绩后,很多人开始抛弃卷积网络架构,转而使用Transformer。然而有的大佬不认为卷积过时了,于是有了这篇…

OpenGL 原生库6 坐标系统

概述 为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate)&a…

内网渗透之中间人欺骗攻击-ARP攻击

ARP攻击 ARP协议简介 ARP全称为Address Resolution Protocol,即地址解析协议,它是一个根据IP地址获取物理地址的TCP/IP协议,主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定…

proteus仿真学习(1)

一,创建工程 一般选择默认模式,不配置pcb文件 可以选用芯片型号也可以不选 不选则从零开始布局,没有初始最小系统。选用则有初始最小系统以及基础的main函数 本次学习使用从零开始,不配置固件 二,上手软件 1.在元件…

滑动窗口算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: 优选算法专题 目录 滑动窗口算法的简介 209. 长度最小的子数组 3.无重复字符的最长子串 1004. 最大连续1的个数III 1658. 将减到0的最小…

Docker基本使用(持续更新中)

docker介绍 docker是一个开源的应用容器引擎,常见的容器引擎例如:docker、podman、containerd等,但是docker应用还是相对比较多。 1 常用命令 1.1保存镜像到本地 命令如下: docker save -o nginx.tar nginx:latest 举例 结果&#xff1a…

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一:子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二:显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…

求1000以内所有恰好能分解成10组两个素数之和

要求 根据哥德巴赫猜想,任意一个大偶数都可以分解为两个素数之和。但许多偶数分解为两个素数之和并不是唯一的。 请编写函数fun,其功能是:求1000(不包括1000)以内的所有恰好能分解成10组两个素数之和(5109和1095被认为是同一组)的偶并依次存入数组a中并…

SQL_yog安装和使用演示--mysql三层结构

目录 1.什么是SQL_yog 2.下载安装 3.页面介绍 3.1链接主机 3.2创建数据库 3.3建表操作 3.4向表里面填内容 3.5使用指令查看效果 4.连接mysql的指令 4.1前提条件 4.2链接指令 ​编辑 4.3创建时的说明 4.4查看是不是连接成功 5.mysql的三层结构 1.什么是SQL_yog 我…

有什么兼容macOS 15 Sequoia系统的加密软件?

前言:近日,苹果更新了 macOS 15 Sequoia正式版,已经有用户在电脑上安装使用了。在这个信息化时代,系统一直在更新,运用一些工具时需要考虑兼容性。 刚有个客户来问迅软:你们迅软DSE客户端支持新发布的macO…

python函数三:拆包和交换变量值、引用、匿名函数

文章目录 1. 拆包和交换变量值1.1 拆包1.2 交换变量值 2. 引用2.1 了解引用2.1 把引用当作参数传递 3. 匿名函数3.1 lambda语法3.2 lambda的应用3.3 使用使用函数形式来求解某天是该年的第几天? 1. 拆包和交换变量值 1.1 拆包 拆包:把组合形成的元组形…

Linux基础---13三剑客及正则表达式

一.划水阶段 首先我们先来一个三剑客与正则表达式混合使用的简单示例,大致了解是个啥玩意儿。下面我来演示一下如何查询登录失败的ip地址及次数。 1.首先,进入到 /var/log目录下 cd /var/log效果如下 2.最后,输入如下指令即可查看&#xf…

【读书笔记-《网络是怎样连接的》- 0】全书整体结构

网络是计算机相关课程中的重要部分,更是当今的学习生活中所不可或缺的。虽然相关的经典书籍很多,但是大多数属于深入某一部分的专著,比如TCP/IP协议。像我这样对于网络一知半解的同学来说,更需要一种覆盖网络全貌,每一…

《线性代数》笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

Python学习——【4.2】数据容器:tuple元组

文章目录 【4.2】数据容器:tuple元组一、元组的定义格式二、元组的特点三、元组的操作(一)常见操作(二)循环遍历 【4.2】数据容器:tuple元组 一、元组的定义格式 为什么需要元组 列表是可以修改的。如果想…