文章编号:11819时间:2024-10-01人气:
渲染管线的主要任务是在给定三维物体、光源、材质等条件下,生成二维图像。 物体在图像中的位置、形状和外观取决于它们的几何、环境特征以及相机的位置。 物体的材质属性、光源、纹理和着色方程决定了物体的外表。 实时渲染管线大致分为四个主要步骤,每个步骤包含若干子步骤。 步骤间有逻辑分割,但在实际实现中部分步骤可能会合并执行。 应用阶段在CPU上运行,开发者全权控制。 此阶段的关键是将几何信息传递给几何处理阶段。 应用阶段基于软件实现,可以利用CPU多核提升性能。 碰撞检测、接收外部输入(如键盘、鼠标)和实现加速算法通常在此阶段完成。 几何处理阶段在GPU上执行,主要负责顶点着色、投影、裁剪和屏幕映射。 顶点着色分为顶点着色器、模型变换、视图变换和投影变换。 细分着色、几何着色和流输出是可选步骤,取决于GPU硬件能力和需求。 曲面细分产生适当数量的三角形表示曲面,几何着色处理图元产生新顶点,流输出使GPU成为几何引擎。 这些步骤按照细分、几何着色和流输出的顺序执行。 裁剪阶段筛选出视图体内的图元,将图元传递至光栅化步骤。 裁剪使用4维齐次坐标,第四值在透视投影中确保正确的三角形插值和裁剪。 屏幕映射将坐标系转换为屏幕坐标,与深度值和其他着色信息结合,准备进入光栅化阶段。 光栅化阶段将屏幕空间的顶点及其对应的深度值转换为屏幕像素。 判断像素是否位于三角形内部是此阶段关键部分。 图元装配计算三角形的差分、边界方程及其他数据,用于三角形遍历和数据插值。 三角形遍历查找像素是否在三角形内。 像素处理分为像素着色和合成两步。 像素着色阶段由可编程的GPU核执行,开发者提供像素着色器程序计算颜色值。 合成阶段融合像素着色产生的颜色数据,并解决可见性问题,包括深度测试和半透明物体的绘制顺序。 模版缓冲用于控制渲染数据写入。 合成操作统称为混合操作。 帧缓冲包含所有缓冲。
计算机图形学是利用计算机合成和操作视觉信息的学科。 它的应用领域广泛,包括游戏、电影、虚拟现实(VR)、增强现实(AR)、用户界面(GUI)、数字照片、地图绘制、3D打印、建筑设计等。 在计算机图形学中,涉及到的知识多而复杂。 首先,要解决的是如何建模,例如绘制一个立方体。 假设立方体长宽高为2*2*2,中心在三维坐标轴中心(0,0,0)。 立方体的八个顶点坐标分别为:A(1,1,1),B(-1,1,1),C(1,-1,1),D(-1,-1,1),E(1,1,-1),F(-1,1,-1),G(1,-1,-1),H(-1,-1,-1)。 接下来,需要解决的是如何将三维空间中的立方体投影到二维平面上,即用数字描述在屏幕上显示立方体的过程。 投影的基本策略包括将三维顶点投影成二维平面上的点,然后将这些点连接起来。 透视投影是基于“近大远小”的原理,通过小孔成像原理,将三维物体显示在二维平面上。 具体公式为:v = y/z, u = x/z,其中x, y, z指的是顶点到相机小孔C的水平、竖直和横向距离,而不是顶点在三维空间中的坐标。 接着,我们需要了解像素(Pixel)的概念。 一个像素由红绿蓝三原色和色彩空间(透明度)信息组成,以32位(相当于一个浮点数)存储,每个值范围为0-255。 显示屏由许多像素组成,1920*1080分辨率表示横向1080个点,纵向1920个点,共约200万个点。 显示像素的方法有LCD和DMD等。 光栅化是指将连续的物体(如线、多边形)用像素网格表示。 对于线段的光栅化,可以采用Diamond Rule,即只在直线穿过正方形中间的菱形区域时点亮整个正方形像素。 通过求解线段的斜率,可以简化光栅化过程。 通过建模和光栅化,我们可以在屏幕上显示3D物体。 下一节将学习如何绘制更复杂的平面图形,以及处理锯齿问题。 理解3D物体的建模和光栅化过程是计算机图形学的基础,为后续学习更复杂的表面描绘、光照模拟、材质属性和物体运动做好准备。 学习计算机图形学是一个循序渐进的过程,从简单的二维绘图到复杂的三维渲染,涵盖了数学、几何、计算机视觉等多个领域。 通过不断实践和学习,可以逐步掌握这一领域的知识和技能。
渲染管线与GPU(Shader前置知识)渲染管线是实时渲染的核心组件,其目的通过虚拟相机、三维物体、光源等生成二维画面。 它一般分为四个大阶段——应用阶段、几何运算、光栅化、像素运算。 应用阶段由应用程序驱动,主要任务包括用户输入处理、碰撞检测、动画、物理模拟、全局加速算法等,通常在CPU端执行。 这个阶段决定了渲染的效率,因此许多渲染优化,如各种剔除算法,都在此阶段进行。 部分应用阶段的工作可以通过Compute Shader交给GPU处理,实现GPU的高并行计算能力。 几何运算阶段负责处理形体变换、投影和其他逐顶点或逐三角面的几何操作,决定绘制对象是什么、如何绘制和绘制位置。 此阶段可以细分为顶点Shading阶段、投影阶段、剪裁阶段、屏幕映射阶段。 顶点Shading阶段负责顶点位置计算、输出法线、纹理坐标等信息。 几何运算阶段包含细分曲面、几何Shading和流输出等可选过程,这些过程在GPU中可以独立实现。 光栅化阶段将屏幕空间的二维顶点及其深度等数据转化到屏幕像素内,分为三角面设置(图素集合)阶段与三角形遍历阶段。 最后是像素运算阶段,通过前面所有阶段后,图素内的像素被传递到此阶段,进行深度测试和颜色确定。 此阶段分为像素Shading阶段与合并阶段,像素Shading阶段使用插值Shading数据作为输入,输出颜色传入合并阶段,而合并阶段负责将像素shading算出的颜色与当前颜色缓存的颜色进行混合。 渲染管线中,GPU的高并行计算能力通过流水线实现,将大量简单任务同时处理,从而大幅度提高了渲染效率。 通过细分曲面、几何Shading等可选过程,GPU能对模型进行优化,增加细节表现力。 同时,GPU在像素运算阶段提供高度可编程性,允许用户实现各种复杂的渲染效果,如纹理贴图、Alpha测试等。 综上所述,渲染管线与GPU紧密合作,通过高效的数据处理和并行计算,实现实时、高质量的三维图像渲染。 了解渲染管线的工作原理和GPU在其中的作用,对于掌握Shader技术、提高渲染效率至关重要。
深入探讨多重采样(MSAA)的神秘世界,让我们从Khronos和微软的官方文档出发,理解这个抗锯齿技术的运作原理。 OpenGL和DX中的MSAA,其核心是每个像素的覆盖掩码(4-bit)和样本(4个深度值),它们的协同工作确保了图像的平滑性。
光栅化、片段着色与裁剪在渲染流程中,先经历光栅化,将几何形状转换为像素。 接着,片段着色器单独处理每个像素,但它并未考虑覆盖情况,只计算单个样本的颜色。 裁剪阶段则是关键,因为我们需要考虑scissor区域,以确定哪些样本是有效的。 在此之后,MSAA的合成过程在片段着色器之后进行,以便利用裁剪信息。
4x MSAA的执行策略关于4x MSAA的执行,有两种可能的解释:一种是逐个样本执行,即一次处理四个样本;另一种是整体一次性处理。 样本颜色的来源可能各异,可以是每个位置独立采样或所有样本共享中心颜色,这取决于具体实现的技术细节。
默认情况下,每个像素仅进行一次采样,中心颜色会被复制到四个样本中。 这可能源于像素中心或内部样本,以避免Outerpolate现象。 提升Pixel Frequency虽能提高效率,但可能影响视觉效果,这时Sample Frequency提供了选择,让每个像素的样本独立由片段着色器处理。
MSAA的深度与透明度处理MSAA(如4x)的默认操作是对样本颜色进行加权平均,深度和模板值通常是四个独立值。 如果深度测试失败,相应的样本会被忽略。 Alpha to Coverage通过改变覆盖掩码,实现了顺序无关的透明度处理。 尽管Alpha Test在某些情况下效果不佳,Alpha Blend则提供了更佳的边缘融合,但需要遵循特定顺序。 Alpha to Coverage类似于基于样本的Alpha Test,提供了更灵活的解决方案。
在处理方式上,MSAA与Supersampling的主要区别在于,MSAA对所有位置进行处理,而不仅仅是边缘。 最终,MSAA输出的图像以100x100分辨率的像素为单位,每个像素包含四个样本的均值,这个过程通常通过双线性插值(Bilinear resolve)来实现。 值得注意的是,样本颜色可能来自不同的三角形,取Z测试通过的三角形颜色作为最终结果。
通过深入了解MSAA的这些细节,我们能够更好地欣赏到它在消除锯齿、提升图像质量方面的独特贡献,以及在实际应用中的灵活调整选项。
经过变换之后,不管是正交投影还是透视投影,都被变换成[-1,1]的立方体,接下来就是要绘制在屏幕上,叫做光栅化 1.相机的可视面,宽高,可以得到长宽比 (field of view视场角),根据垂直可视角度fovY和长宽比可以得到水平可视角度fovX 1.右边是视椎的近平面,点(1,t,n)与z轴的夹角是fovY/2 2.t是z的值,b是-t,近平面的高就是2t,r就是x的值,l是-r,近平面的宽就是2r 3.于是可以得到右边两个等式 1.左下角是原点,每个像素用(x,y)整数表示,图中蓝色像素是(2,1) 2.像素的宽高是1,像素的中心是(x+0.5,y+0.5) 3.屏幕的范围是从(0,0)到(width,height) 1.忽略z,实质还是一次平移加一次缩放 2.因为MVP得到的是中心在原点,所以要先平移,让左下角位于原点,然后把x和y拉伸到屏幕的大小 不管是二维还是三维,图形都可以分解成一定数量的三角形 1.实质就是判断点否在三角形内 2.定义一个函数inside(tri,x,y)来输出是否在三角形内,然后遍历整个屏幕中的像素 1.利用向量的叉乘,p2p0 x p2q,p0p1 x p0q,p1p2 x p1q三个结果如果是同号的,则在三角形内,否则在三角形外 在边缘上的点再不同情况下可以算也可以不算. 1.将三角形包围在内的矩形叫做bounding box 2.p1,p2,p3中取maxX和maxY,就得到一个优化后的bounding box,可以提高效率,除此之外还有很多优化方案 三角形光栅化之后,由于像素点本事有大小,因此就会产生锯齿(Aliasing) 锯齿产生的原因是采样率的问题,采样的概念在图片,视频.音频中通用,低采样率可以降低质量,加快处理速度,但是会产生走样(Artifacts),锯齿便是其中一种情况. 显示器会在刷新的时候隔行刷新,例如第一帧刷新奇数行第二帧刷新偶数行,以此提高效率,但是会在一定程度上造成走样,或者叫做瑕疵. 上图中叫做摩尔纹,是采样的时候,为了降低质量去除奇数行或者偶数行像素产生的. 信号变换的太快以至于采样的速度很不上,就造成了Artifacts 先对场景,或者说信号进行模糊(滤波)处理,然后再采样,可以在一定程度上反走样 注意如果先采样,再做模糊是达不到效果的 图二中: 同样的采样频率,信号频率越快,就越会走样,上面的根据采样可以大概的还原出信号函数,但是下面的已经完全不能还原了 图三中: 在蓝色函数中进行采样,采样之后还原,还原出来的是显然只能是黑色函数,和原本的蓝色已经差的太远;也可以理解成,用同样的采样频率去采样两种频率的信号,结果却完全相同 傅里叶变换可以把时域变成频域: 1.左边的图像,叫做时域,右边的图叫做频域,是左边的图经过傅里叶变换生成的 2.右边图像的信息由亮度在不同的位置表示出来,外围的是高频,中心的是低频 3.水平和数值的十字高亮,是因为图片不是重复信号,没有时间信息,因此处理的时候会把图片进行平铺,一张接一张,当图像切换边界的时候,会产生剧烈的变化,从高频到低频全部都产生了变化,就出现了十字高亮 去除低频信息: 1.将右边的中心低频信息抹去,逆傅里叶变换,从右向左重新生成图片,叫做高通滤波,也就是只有高频信息可以通过 2.由此可见,只剩下边缘,或者说边界,就是颜色和纹理等等细节发生剧烈变化的时候,就对应着高频的信息. 去除高频信息: 1.低通滤波,图像的边界已经看不到了,只剩下色块表示的低频信息 选择性的去除不同的频率区域: 1.产生不同的效果,图一去除了最低频的色块和高频的边缘,图二去除了大量低频的色块,和高频的信息,通过这种控制,可以得到不同程度的细节信息 卷积Convolution: 1.首先是一个一维的信号,方便理解 2.然后是一个过滤器,过滤器从左向右移动,每次移动一个单位,移动之后计算过滤器中心对应的信号值,计算加权平均值,然后写入采样,最终得到一个采样结果 3.卷积就是模糊操作 1.把信号(图)用滤波器做卷积(图变成另一张) 2.上一步等效于,把图通过傅里叶变换,生成频域,再把滤波器也傅里叶变换,两者相乘,最后再逆傅里叶变换,就得到了和1相同的另一张图 低通滤波器: 1.每个像素周围八个像素都乘1,再加起来,然后除上9 2.这个box越大,图像越模糊,如果是最小的box,则相当于没做滤波,图像就没变化 3.上图两个盒子,是时域图像,也就是黑白色块,右边频域图MSAA抗锯齿: 把一个像素点细分成4个,甚至16个,通过三角形覆盖的点个数,取一个百分比,占三个就是75%,占一个就是25% FXAA:采样生成图片之后,通过图像处理,把锯齿给替换掉,效率很高 TAA:把MSAA的样本分布在时间上,复用前面帧的处理 DLSS:深度学习超采样(超分辨率),50x50的图片放到200x200需要补充像素,因此功能就是放大图片 后画的东西会覆盖先画的东西,计算机绘制沿用画家算法的时候也是这么做的,远近或者说遮挡关系,叫做深度关系 一种互相遮挡的情况,画家算法无法解决这种场景. 深度缓存算法: 1.前面说到三个互相遮挡的三角形,无法确定深度关系,所以换个角度,去确定每个像素的深度,生成渲染后的图片的同时,也生成一张用于保存每个像素深度信息的图 1.左边是渲染后图 2.右边是深度图,离相机越近的点,颜色越黑 3.假设首先只有地板,地板的深度图是近黑远白,现在添加一个图中的镂空立方体进去,像素点a原本显示的地板有一个深度x,现在点a也同时处在立方体上,立方体给了a另一个深度y,根据x和y就可以决定地板和立方体的遮挡关系 1.首先将场景分解成一定数量的三角形 2.将三角形全部光栅化 3.一开始所有的像素深度缓存值是无限大,也就是最远,遍历所有三角形的所有像素,然后和深度图的所有像素点对比,如果深度比像素存储的深度要小,说明应该要覆盖原来的像素,就把深度重新写到这个像素中. 4.这个算法与顺序无关,也没有做排序,只是在记录一个最小值,大的值不做任何处理,因此复杂度仅为O(n) 1.R代表无限大 2.5比R小,则重新写入 3.加入第二个三角形,跟R和5相比,比5大要被原来的三角形遮挡,比5小的会遮挡原来的三角形 4.这两个三角形插入到了一起,互相遮挡一部分
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/d617f51d0979ee9665c2.html,复制请保留版权链接!
简介在当今的互联网时代,我们经常发现自己被网络审查和限制所束缚,网站被封锁,应用程序被禁用,我们的在线自由受到限制,但是,有一个解决方案可以帮助我们打破这些障碍,恢复我们的互联网自由,GoAgent,什么是GoAgent,GoAgent是一个开源的代理服务器,可以绕过互联网审查和限制,它可以通过在本地计算机上设置代理服务器来工作,该服...。
本站公告 2024-10-01 04:04:20
简介MaterialMotion是Google为Android开发人员提供的动画和过渡工具集,旨在帮助开发者创建流畅、一致且引人入胜的用户体验,它建立在MaterialDesign原则之上,提供了一组预定义的动画和过渡效果,可轻松应用于各种UI元素,主要功能预定义的动画,MaterialMotion提供了一系列预定义的动画,用于常见交...。
互联网资讯 2024-09-30 13:43:48
什么是OverlayIcon64.dll,OverlayIcon64.dll是一个动态链接库,DLL,,是Windows操作系统的重要组成部分,它用于在文件和文件夹上叠加图标,以提供有关其状态的视觉指示,OverlayIcon64.dll问题的原因OverlayIcon64.dll问题通常是由以下原因引起的,文件损坏,病毒或恶意软件感...。
最新资讯 2024-09-29 14:53:04
HTML和CSS是Web开发中使用的两种基本技术,HTML用于创建网页的结构,而CSS用于控制网页的外观,当您开发Web应用程序时,可能会遇到各种HTML和CSS问题,本文档是一个故障排除指南,将帮助您解决一些最常见的问题,HTML常见问题元素未显示,确保元素的开始和结束标签已正确关闭,检查元素的父元素是否具有足够的宽高以容纳元素,元...。
技术教程 2024-09-24 12:10:40
SQLDISTINCT语句用于从表中返回唯一值,对于从大型数据集移除重复数据非常有用,但是,在使用DISTINCT语句时,可能会遇到各种问题和错误,本文提供了针对这些问题的故障排除指南,帮助您识别并解决这些问题,常见问题1.重复值仍然显示原因,在DISTINCT子句中使用了错误的列,数据表中存在隐式重复的值,例如,空值,解决方案,检...。
本站公告 2024-09-23 03:06:17
简介图层列表是动画软件中一个强大的工具,它允许您组织和管理您的图层,通过使用图层列表,您可以轻松地创建复杂的动画效果,这些效果在过去很难或不可能实现,在本文中,我们将讨论如何使用图层列表来创建高级动画效果,我们将介绍各种技术,包括图层蒙版、跟踪蒙版和父级动画,我们还将提供一些提示和技巧,以帮助您充分利用图层列表,使用图层蒙版创建高级动...。
技术教程 2024-09-15 15:46:04
tools,qt,creator,>,QtCreator,Qt公司开发的跨平台C,C,IDE,选择编译器或IDE时要考虑的因素在选择C语言编译器或IDE时,需要考虑以下因素,平台支持,确保编译器或IDE支持您开发应用程序所需的平台,语言特性支持,确保编译器或IDE支持您要使用的C语言特性,性能,对编译速度、代码生成质量和其他性...。
技术教程 2024-09-13 11:31:43
引言随着应用程序变得越来越复杂,开发人员需要更强大的工具来构建和部署它们,Java虚拟机,JVM,已成为构建高性能、可移植应用程序的关键组件,随着时间的推移,JVM不断发展,新功能和创新不断涌现,重塑应用程序开发的格局,新功能和创新GraalVMNativeImage,这项技术允许将Java应用程序编译为本机可执行文件,从而提高启动时...。
本站公告 2024-09-12 19:45:18
body,font,family,Arial,Helvetica,sans,serif,font,size,16px,margin,0,padding,0,.container,width,100%,max,width,960px,margin,0auto,padding,30px,.header,text,align,cente...。
互联网资讯 2024-09-11 23:40:10
引言随着嵌入式设备的日益复杂化,对熟练的嵌入式Linux驱动程序开发人员的需求也在不断增长,嵌入模式是一种专门为嵌入式系统设计的Linux内核,它提供了开发高效、可靠且可维护的驱动程序所需的特性和功能,在本教程中,我们将深入探讨嵌入模式,并了解如何利用其独特功能来设计和开发出色的嵌入式Linux驱动程序,我们将涵盖以下主题,嵌入模式简...。
本站公告 2024-09-09 13:08:03
在学习编程时,动手实践是最重要的部分之一,通过在真实项目中动手实践,你可以将所学知识应用到实际场景中,深入理解编程概念,并培养解决实际问题的技能,寻找真实项目寻找真实项目可以从以下几个途径开始,开源项目,在GitHub等平台上搜索开源项目,你可以找到各种规模和复杂程度的项目,从简单的工具到复杂的应用程序,个人项目,如果你有自己的想法,...。
最新资讯 2024-09-08 22:13:29
织梦CMS是一个强大的内容管理系统,CMS,,可让您轻松创建和管理网站,有许多不同的织梦CMS模板可用,每个模板都提供了一组不同的功能和设计,选择最适合您需求的模板非常重要,这将帮助您创建一个成功且有效的网站,选择织梦CMS模板时要考虑的因素在选择织梦CMS模板时,需要考虑以下几个因素,您网站的目的,您将使用您的网站做什么,您是博客、...。
本站公告 2024-09-06 12:55:33