您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 Game艺视界 于 2022-3-28 18:23 编辑
图形管线这里我们有图形管道的图表数据从cpu开始您的3d程序 unity unreal maya 或游戏通过 directx传递顶点数据opengl到图形驱动程序,然后驱动程序将数据发送到 gpu 的 前端,这是图形芯片的一部分。
然后数据被发送到可编程顶点处理器,这是图形芯片的一部分顶点着色器运行的地方,顶点数据由对象空间中的顶点位置 uv 坐标顶点颜色和法线。
顶点处理器所做的最重要的事情是将顶点位置从对象空间转换到屏幕投影空间,以便它们可以变成三角形和绘制到屏幕上,但您创建的顶点着色器也可以动画顶点的位置、滚动uv坐标、弯曲顶点法线,甚至计算照明并将其存储在顶点颜色中,可编程图形硬件是全新的,大部分工作 gpu 是在顶点阶段完成的,但现在顶点着色器大多只进行顶点转换和大部分魔法都发生在像素着色器中,但是如果你的着色器中有一些操作,可以从像素着色器移回顶点着色器,例如滚动 uv 或计算雾,你可以通过这样做来大大提高性能,这些计算每个顶点而不是每个像素
接下来发生的是图元组装,图形芯片将所有顶点连接在一起以创建三角形,因此顶点着色器 与图元组装组合的结果是屏幕投影空间中的三角形,然后数据得到传递给光栅化和插值单元,这个硬件的工作是将三角形转换成屏幕上的像素所以我们在屏幕上有代表三角形的像素,而不是只有一组三角形。
这个过程有点像打开adobe illustrator文件中的点曲线和线在photosh中转换为photoshop文件中的像素,这就是在这里发生的光栅化步骤中发生的事情,硬件正在将我们的三角形转换为像素。在此步骤中发生的另一件事称为插值 ,存储在每个顶点中的数据被插值到像素,例如使用顶点颜色我们在左侧有一个蓝色顶点,在右侧有一个绿色顶点中间的所有像素都获得从蓝色到绿色的线性渐变混合,因为您可以看到,顶部的红色顶点发生了同样的事情这也适用于 uv 坐标和法线,数据从顶点平滑地插入到像素中
然后将插入的像素数据发送到可编程像素处理器这是您的像素着色器运行的地方,它从顶点 着色器获取传入数据和其他数据,来自cpu的输入数据以创建最终结果。传统上,像素处理器的输出是最终的彩色像素屏幕, 然后在输出到屏幕之前进行一些最终的光栅处理。
但是大多数现代游戏引擎使用延迟这意味着像素处理器正在输出颜色正常的金属蒙版和粗糙度数据,而不仅仅是要添加到的颜色将此数据写入内部g-buffer缓冲区,使用来自这些缓冲区的数据进行最终的照明计算,主要需要了解的是您的着色器在管道中运行的位置,图形芯片可以按顶点或像素进行计算,在顶点着色器中进行计算几乎总是比较便宜的。有很多不可能的事情, 但是当它发生时,您可以通过将计算移动到顶点着色器中来提高性能,
03.您的第一个着色器 我们将从头开始向您展示如何加载编辑器如何制作新材料或者从头开始一个新的着色器 下面是ue5和unity开始界面
UE5材质编辑器界面 01-材质窗口 02-该窗口显示您的着色器正在使用多少条指令这将使 您大致了解 您的着色器可能有多昂贵指令计数不一定 是了解着色器成本的最佳方法,你的着色器会有多贵但它会给您一个总体概念, 有时指令计数可能会产生误导,因此 判断着色器费用的最佳方法实际上是将它应用到您的网格并将其放入游戏中 并在您的目标平台上运行它。 03-着色器预览窗口
04-显示选项,改变视野 05-各种通道不同的照明模式 还有优化 查看模式和细节着色级别 06-背景和网格显示 07-不同形状显示,球 平面 圆柱等。 08-根节点详细信息
UE5基础颜色节点,按住数字3点击鼠标左键创建
unity创建着色器
高清管线可以创建特定的着色器贴花、眼睛、织物、
双击打开创建的shader
在你开始使用你的材料或你的着色器之前,你需要做一件事那就是我需要来这里图形检查器。并立即选择一个活动,目标列表是空的,这意味着我现在没有目标,目标是我打算使用着色器的地方,所以如果我来到这里并点击这个加号按钮,您可以看到我有两个可用的目标,一个是视觉效果和一个是hdrp,我想在高清渲染管道中使用我的着色器,所以我将选择hdrp作为目标。为我添加了一堆输入选项,而不是我的图形变灰。现在颜色很亮 并且可以开始使用了
04-基本着色器数学
今天我们在我们的第一个着色器中做一些基本的数学所以让我们开始,本周我们将讨论简单的加减乘除节点以及如何使用它们
蓝色用于单通道数据类型,绿色用于两通道数据类型黄色用于三通道数据类型紫色或粉红色用于四通道数据类型
UV节点引入了纹理坐标,两个通道,u是水平的,从左到右从0到1,然后是v数据来自它是垂直数据,所以它在这个垂直轴上从0到1然后在右上角你可以看到数据变成黄色绿色和红色都对颜色的贡献和虚幻是一样的。
add 将两个值组合在一起 并总结两个值的结果,乘法将一个值乘以另一个值,减法”将一个值从另一个值中删除,除法”将一个值分割成指定的块数
因为unity我的零点在左下角,而在虚幻中它在左上角所以这里。所以有点那里的两个引擎之间存在差异
另外例子我把我的 uv 坐标乘以一个常常数值 6 所以在我的小预览立方体中,你可以看到我的纹理现在表面上平铺了六次,而不是现在只是从 0 到 1 的uv坐标,在相同的空间量中从 0 到 6 所以我的纹理贴图在表面上平铺了六次
05-理解纹理贴图 今天我们将讨论纹理贴图让我们开始吧!纹理贴图是我们应用于3d模型表面的图像
然后再深入了解此处的细节,让我们退后一步看看创建纹理的过程的大图和在创建3d图形的过程中将它们带入引擎纹理 文件主要分为三大类或类型,首先我们从源文件开始我们在应用程序中创建纹理例如:ps sd sp 因为 directx 使用 dds 或直接绘制表面文件,我们根本不关心源文件规模有多大,我们也不关心原始文件有多大,这些都不是在游戏中使用或加载到图像内存中的内容。我们唯一关心的是游戏引擎所创造的最终图像格式的大小 所以让我在unreal 5和unity中向你展示,如何看到纹理的游戏版本的最终大小 但是,我并不关心这些文件的大小,我真正想看的是一旦我将此纹理导入到虚幻中,我就可以在详细信息面板并在此处查看此资产。其中显示资源大小为2752 KB这意味着我在引擎版本中最终压缩的纹理只有2.75 兆字节的空间,因此我从60 兆字节的源文件变为原始文件 12 和现在实际上适合我电脑上显卡或我运行游戏的其他任何平台上的纹理内存的资产只是不到 3 兆字节,所以我的来源有大量减少,文件到我实际的游戏文件中我们真正关心的唯一大小是这里的资源大小我希望要很清楚这一点。
让我们切换到unity 我会告诉你在哪里可以找到它,在我们图片右键属性就可以看到尺寸压缩格式大小。
当我们谈到压缩纹理的时候 如何控制纹理使用的内存量让我首先向你展示它是如何工作的,最明显的纹理空间,可以由纹理的尺寸或纹理的分辨率控制。其次是纹理的通道数量使用会影响大小,第三你使用的压缩类型也是纹理大小的一个重要因素,看表格我列出了最常见的纹理大小,这是两个维度的大小64表示64像素的高度和宽度,注意纹理分辨率是 2 64 128 256 的幂这些尺寸是最有效的因为它们非常适合内存。 左边的Dxt1是最压缩的,到右边的rgba它没有压缩 Dxt-1支持三个通道、dxt5支持四通道、bc7支持三或四通道,然后是RGB、rgba是支持的未压缩纹理格式分别支持一个三和四个通道的数据。 数据表以千字节表示,因为大约有一千从右边你可以得到大概的兆字节数例如 4096 纹理使用 dxt1 压缩占用了大约11兆字节
如何优化? 首先降低一个分辨率步骤,例如从 4096 降到 2048 将内存减少大约四倍,所以我们可以看到从4096 到 2048 的 dxt1 纹理它从近 11 兆字节到不到 3 兆字节我们可以看到的是使用 4k 纹理真的很昂贵我们只是添加了 8 兆字节以从中跳转 2k 到 4k 我们可以看到的另一件事,如果我们使用未压缩的纹理,这些纹理需要相对较低的分辨率如果我使用的是 87 兆字节的未压缩的 4 通道纹理我可以使用一大堆 dxt1 纹理,并将它们与一个未压缩的 4k 纹理放在相同的空间中因此我强烈建议,要使用未压缩的纹理除非它们的分辨率相对较低,所以如果你需要一个高质量的没有压缩的纹理只需确保它们不会比大约512 分辨率高太多。然后我们最后的结论是使用 alpha 通道会使内存成本加倍,所以如果我们使用1024的纹理,那是dxt1那是704千字节,但是如果我们再添加一个通道,所以它使用四个通道现在我们达到了1408所以我们已经将成本从三个通道增加了一倍到四个通道,现在第四个通道 alpha 通道。看起来非常好它没有那么多纹理压缩伪像,但它确实使成本加倍所以在可能的情况下我们应该尝试使用三个通道而不是四个。如果你有一个你没有使用的 alpha 通道你应该确保你摆脱了它,这样你就可以使用三通道dxt-1压缩与5-chan 或 4 通道 dxt5 压缩。
还有一件事游戏引擎的纹理导入器做的另一件事它使 mip maps 贴图是一系列逐渐变小的看起来像这样的纹理版本。 每个版本在两个维度上都是前一个版本的一半,并且当您的着色器要求获取纹理样本时,着色器要求一个纹理的样本图形硬件会找出哪个mip级别的采样,基于几个因素包括屏幕上的纹理有多大,以及多边形和相机之间的角度是多少来采样哪个mip 级别。例如:如果屏幕上的纹理大约有这么大它会采样最高级别的 mip map。但如果对象离得更远并且屏幕上的纹理需要更小它可能会在链的末端采样这些贴图之一,如果没有mipmap纹理采样器,必须始终对最大版本的纹理进行采样,如果纹理在屏幕上较小或比它需要的距离更远,您最终会得到比屏幕像素更多的纹理像素这导致像素闪烁。当物体远离时从较小版本的纹理采样较低的mip
另一个关于 mipmap 的重要知识,是游戏引擎可以在图形内存动态加载和卸载它们取决于何时需要,它们是否曾经加载到某个游戏级别并且游戏中一切看起来真的很模糊几秒钟。然后突然变得更加清晰这是由于游戏引擎首先加载到较低分辨率的 mipmap 中造成的,然后稍后加载更高分辨率的mipmap因为,如果对象离相机很远它们会加载得更慢,游戏引擎可以丢弃高分辨率的 mip 为其他更高的纹理腾出空间和内存,因此对于您的纹理来说具有mipmap既有助于纹理过滤,又有助于帮助引擎进行纹理内存管理幸运的是这是自动完成的理解这一点仍然很重要。
我们进入两个游戏引擎,我将向您展示控制这些纹理设置 0表示游戏版本中应用的最大数值4096 如果我输入2048显示,我导入的大小仍然是 4096 但游戏版本中的最大值是2048,这意味着我已经在此处删除了大资源,显示着使用了纹理内存量,因此如果我再次回到零您可以看到我的资源大小不到 21兆字节。但如果我其减少到2048现在您可以看到我的资源大小约为 5 兆字节半。
接下来我们可以选择我想使用的纹理压缩类型,注意这里说的是格式 dxt5 所以如果你记得我们的表格dxt5是一个四通道纹理格式 ,我并不是真的想使用那个 alpha 通道我可以来到这里压缩这个打勾禁用alpha通道。它会重新计算你可以看到格式已经从 dxt5 下降到 dxt1我的资源大小不是 5 兆半已经 变成 2.7 兆
我这还有其他压缩格式 如果我想使用未压缩,我可以使用用户界面2d rgba,让我们选择它已经变成了 b8 g8 r8 a8 这意味着我有四个通道它们都是每个通道使用 8 位和一个 2048纹理,我使用了大约 21几乎 22 兆字节的纹理内存,所以这是一个未压缩的四通道纹理,可能不推荐使用近 22 兆字节因为它太大了。 但如果你想把这个纹理保存为未压缩的Rgba像这样,将最大纹理大小降低到512您可能可以摆脱它,因为现在您的资源大小不到一兆半字节。
在游戏研发中你所使用的内存数量和质量水平与分辨率的平衡性,如果你只有一个通道纹理的话,您可以选择灰度您会注意到这是灰度r8这也是未压缩的。看到它仅使用 5.5 MB 未压缩因为我只存储一个通道,因此如果您有一种适合一个通道的数据类型,您可以使用此灰度选项来减少内存。如果是的话你使用的是未压缩的数据,但是如果你只使用一个通道那么在这里使用 dxt1 可能会更好,你可以使用纹理压缩因为它再次下降到 2.7兆字节而不是 5 兆字节
看看我们的颜色纹理有时也称为反照率或漫反射或基色,在这种情况下我们几乎可以将压缩设置保留为默认值,因此这里我将压缩设置设为默认值,并使用 2.7 MB 内存以 dxt1 格式存储它。我们有这个框在这里称为srgb对于颜色纹理这需要是真彩色纹理,并应用伽马校正存储这也称为srgb因此对于颜色纹理这需要打开,如果您正在存储其他任何内容请将其关闭。
让我们看看另一种类型的数据这里我们正在存储粗糙度纹理,粗糙度仅使用一个通道它是灰度。它没有不需要红色绿色和蓝色它只需要灰度或黑色和白色,所以我们的压缩设置我们选择了将它设置为没有srgb。你可以看到正在使用的纹理格式是 dxt1 现在我可以为此使用未压缩的纹理格式。 你也可以看到我的大小跃至 5.1 或 5.5 兆字节,但如果我将其存储为蒙版它会降到2.7因此这非常适合像用于高光、环境遮挡的粗糙度这样的纹理可以存储为蒙版的单通道纹理
这是一个有趣的例子,这是一个纹理我使用了几个蒙版并将它们打包在一起。所以在红色通道中在绿色通道中有我的环境光遮蔽有我的镜面反射,蓝色通道我有我的金属度或金属面具,所以我实际上有四个通道每个通道包含不同类型的数据。你可以再次看到我的压缩设置被设置为默认的dxt15 或bc1 在这种情况下引擎自动为我的纹理选择了dxt5因为它有四个通道而不是三个,你可以再次看到我有srgb未选中,因为这些数据不是颜色数据。
好吧!让我们看看另一个例子这是我的高度图,相对模糊因此我能够保存原始版本纹理的大小仅为 256x256 您可以看到对于这个纹理我已将压缩设置设置为灰度,高度图不需要很多细节。
好吧!让我们看最后一个例子这是我的法线贴图你可以看到在压缩,设置下有一个非常具体的设置,专门用于法线贴图虚幻引擎为我的压缩方案选择了bc5,因为我告诉它它是一个法线贴图,所以它使用经过专门调整以使法线看起来不错的压缩,所以只要你有法线贴图你需要确保你选择了特定的法线映射纹理设置
看看相同类型的设置,但在Unity引擎中
设置好后我们要点击apply应用。
原帖地址:如何设置使用优化引擎内的贴图资源/图形管线的流程概述【Ben图形/01】 (qq.com)
|