real time rendering 学习笔记(一)

2024-03-12 09:48

本文主要是介绍real time rendering 学习笔记(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Real time rendering 学习笔记(一)

第二章 图形渲染管线

图形渲染管线的作用是在给定视角、三维物体、光源、着色方程、纹理等条件时,产生或者渲染出一幅二维图像。

实时渲染可以被粗略地分为三个连续的阶段,分别是application阶段、geometry阶段和rasterizer阶段。

管线系统中的最慢的一个阶段决定了渲染的速度。

application阶段通常在运行在CPU的软件上实施,geometry阶段通常在GPU上实施,而rasterizer阶段也在GPU中实施。

Application阶段

这个阶段的最重要的任务是为geometry阶段提供要被渲染的基元,例如点、线和三角形。

冲突检测常常在此阶段进行。来自键盘和鼠标的输入也需要在此阶段进行处理,另外,一些运算过程如纹理映射也在此阶段进行。

Geometry阶段

此阶段是进行顶点和多边形操作的关键阶段。它可以被更加详细的分为五个function部分:
1.model&view transform

2.vertex shading

3.projection

4.clipping

5.screen mapping

model&view transform

在被呈现在屏幕上之前,物体的模型需要经历几次变形。首先,每个模型都有自己的局部坐标系。为了对场景(scene)进行处理,需要先将这个场景中的所有模型都用同一个坐标系进行表示,这一坐标系就叫做世界坐标系。
为了减少渲染量,只有处于摄像机视角范围内的物体模型才需要被送往下一管线。为了便于进行投影和剔除,需要对摄像机和场景内的所有物体进行从世界坐标到相机坐标的变幻。

vertex shading

为了使场景更加真实,除了形状和位置以外,物体的外观比如颜色和材质也需要进行渲染。
决定光照在某种材料上的效果的过程被称为着色。这些计算有可能发生在geometry阶段,也有可能发生在rasterization阶段。
着色过程通常被认为发生在世界坐标系中,然而在实际中,将它在其他坐标系中进行计算可能更加方便。因为只要在着色过程中涉及到的物体都被变换到同一坐标系中,它们位置的相对关系就会得到保留。

projection

投影分为平行投影和透视投影两种。
透视投影的原理和人眼观察世界的方法类似。远处的物体看起来较小,而近处的物体看起来则较大。

clipping

只有完全处于或者部分处于视锥内的基元才需要被送入rasterizer阶段进行绘制。前一种基元将原封不动的被送入下一阶段,完全处于视锥之外的基元由于不需要渲染,所以不需要被送入下一阶段,而部分处于视锥内的基元则需要进行剔除处理。例如,一条线的一个顶点位于视锥体内部,而它的另一个顶点位于视锥体外部,那么在进行剔除的时候,位于视锥体外部的那个顶点就被线段和视锥体边界的那个交点所取代。

剔除阶段通常是由固定操作的硬件所处理的,因此程序员无法直接进行控制。

screen mapping

只有视锥中经过剔除的基元才会被传递到这个阶段,此时坐标系仍然是三维的。基元的x和y坐标被转化形成了屏幕坐标系。它和z坐标合起来被称为窗口坐标系。

Rasterizer stage

本阶段的目的是计算和设置像素点的颜色。此过程就是实现从带有z值的屏幕上的二维顶点和每个顶点的着色信息到屏幕上像素的转化。

这个阶段可以分为以下几个子步骤:
1. triangle setup
2. triangle traversal
3. pixel shading
4. merging

triangle setup

在此阶段,三角形表面的微分和其他数据被计算出来,这些计算结果被用来进行扫描转化和对几何阶段产生的着色数据进行插值。专门的硬件会负责处理此过程。

triangle traversal

此阶段需要检测每个像素的中心是否被三角形所覆盖,如果覆盖的话,每一个三角形和像素点重叠的部分都要产生一个碎片。triangle traversal或者scan conversion都是指寻找到在三角形内部的采样点和像素的过程。每个三角形碎片的属性都是通过对三角形的三个顶点的数据插值产生的,这些属性包括了碎片的深度和着色数据。

pixel shading

所有的像素着色的计算都在这里,通过使用输入的已插值的着色数据而进行。结果是一种或者更多的颜色被送往下一个阶段进行处理。前两个阶段都需要专门的硬件进行处理,而此阶段可以通过可编程的GPU实现。在这个过程中所可能使用到的技术中,texturing可能是最重要的一种.

merging

每个像素的信息都被存储在color buffer中。此阶段的主要功能就是将着色阶段产生的碎片颜色和在缓存区中存储的颜色进行混合。

另外一个职责,则是解决可见性的问题。也就是说,当整个场景都已经渲染完成的时候,颜色缓冲中应该包含着从摄像机视角能看到的场景中的基元的颜色信息。对于大部分硬件来说,这都是通过z-buffer算法完成的。z-buffer和color buffer的大小与形状相同,对于每个像素,z-buffer存储着从摄像机到最靠近的基元的z值。这意味着,当一个基元被渲染到某个像素上时,在那个像素点处的基元的z值会和z-buffer中存储的同一个基元的z值相比较。如果新的z值小于z-buffer中的z值,那么正在被渲染的那个基元就比原来最靠近摄像机的基元还要靠近摄像机,因此,z值和那个像素的颜色信息就被更新为正在被渲染的那个基元的相应值。如果z值大于z-buffer中的z值,那么color buffer和z-buffer都保持不变。

除了存储颜色信息的color buffer和存储z值的z-buffer之外,还有其他用来存储和捕捉碎片信息的通道或者缓冲。

∝缓冲通常和颜色缓冲有关,用来存储每个像素的不透明度值。当有一个新碎片时,在深度测试之前,可以进行一个可选的∝测试。这个测试就是将碎片的∝值与某些参考值进行比较。如果测试不通过的话,那么这些碎片就被移除。

stencil buffer是用来记录已渲染的基元位置的缓冲区,每个像素使用8bit来记录信息。

这篇关于real time rendering 学习笔记(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800876

相关文章

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不