GPU渲染管线之旅

2023-11-11

在这一部分中,我们来谈谈像素处理的前半部分:dispatch和实际的像素着色。事实上,这部分是大多数图形开发者在谈到PS stage时所关心的内容。有关alpha blendLate-Z的内容则会下一篇文章中去探讨。后面我们会看到,在硬件的设计上PS stage相对是比较复杂的。这也是像素处理分成两篇来写的原因。在进入这个阶段的时候,从raster或者early-z传入的信息包括:shader的像素坐标(实际上是小的四方块)和相关的覆盖遮罩。三角形的顺序与上层软件应用程序提交的完全相同,和我们在上次中看到的那样。我们在这里需要做的是将线性的,连续的工作流同时分配到数百个着色器单元中,然后等待这些着色器单元返回结果,一旦他们返回结果,我们就将它们再合并到一条线的内存流中。

从上面的描述中可以看到,这是典型的fork/join-parallelism示例。这篇文章我们要探讨的fork这半部分内容,也就是将工作流分配给大量的着色器单元。下一篇在去看join合并阶段(将数百个流合并为一个流)。在进入到PS stage之前对于光栅化还有点内容需要补充一下,因为我刚才说的只有一个四轴流进入的情况并不完全正确。

1. 光栅化:开始即分开

在我看来,我告诉你的在很长一段时间内都是正确的,但是这是一个管道的串行部分,一旦你在一个问题上抛出超过300个着色器单位,管道的串行部分就有成为瓶颈的趋势。

所以GPU的架构们开始使用多光栅的方式;截至到2010年,NVidia使用的是四个光栅化引擎。下图就是Fermi GF100的架构。
nv
AMD则是使用两个光栅化引擎,对于下图中的Tera Scala2,它有两个通用的Shader Engine,而每个Shader Engine都包含有一个光栅化引擎。
amd
从NV的演示文稿中可以看到一些关于保持API顺序要求的注释。特别是,在光栅化/early-Z之前,你需要对Primitive进行排序,就像我上次提到的:在alpha blend之前这样做是行不通的。

光栅化器之间的工作分配是基于我们在early-Z和粗光栅化中看到的tile。帧缓冲区被划分为瓦片大小的区域,每个区域被分配给一个光栅化器。设置完成后,参考三角形的边界框,确定哪些三角形交给哪个光栅化器;大三角形总是会被发送给所有的光栅化器,但是小三角形只会被发送到一个小块,并且只会被发送给拥有它的光栅化器。

这个方案的美妙之处在于,它只需要改变工作分布和粗光栅(遍历瓦片);只看到单个块或四边形(即从层次化Z向下的管道)的所有东西都不需要修改。问题是你现在是根据屏幕位置来划分作业;这可能会导致光栅器之间严重的负载不平衡(想象一下在一个平铺中有几百个小三角形),你真的不能做任何事情。但是好的方面是,所有添加到管道的顺序约束(Z-test/write顺序,blend顺序)都会附加到特定的帧缓冲区位置,所以屏幕空间的细分工作不会破坏API的顺序——如果不是这样,平铺渲染器就不会工作。

2. 再一次分散开

好的,我们得到的不是一个线性的四坐标流加上遮罩,而是在2到4之间。我们仍然需要将它们分配给数百个着色器单位。该是另一个派遣单位的时候了!这首先意味着另一个缓冲。但是我们发送到着色器的批次有多大?这里我再一次用英伟达的数字,仅仅因为他们在公共白皮书中提到了这个数字;AMD可能也在某处声明了这些信息,但我不熟悉他们的术语,所以我不能做一个直接搜索它。无论如何,对于NVidia,分配到着色单元的单位是32个线程,他们称之为“扭曲”。每个四4像素(每个反过来可以作为一个线程处理),所以对于每个阴影批处理我们的问题,我们需要抓住8传入四胞胎的光栅化程序之前我们可以寄出一批着色器单元(我们可以发送更少,以防有一个着色器开关或管道冲洗)。

同时,这也是解释为什么我们处理的是2×2像素的四块而不是单个像素的一个好点。主要原因是衍生品。纹理采样器依赖于纹理坐标的屏幕空间导数来进行mip-map选择和过滤(正如我们在第4部分中看到的);并且,在shader model 3.0及以后版本中,同样的机制以派生指令的形式直接用于像素着色器。在一个四边形中,每个像素在同一四边形中具有一个水平和垂直邻居;这可以用来估计参数在x和y方向上的导数,使用有限差分(它可以归结为几个减法)。这给了你一个非常便宜的方法来得到衍生物,代价是总是不得不在一次阴影组2×2像素。这在大三角形的内部没有问题,但这意味着25-75%的四边形的阴影工作被浪费了。这是因为四边形中的所有像素,甚至是遮罩的像素,都被着色了。这对于为可见的四边形像素生成正确的导数是必要的。不可见但仍然有阴影的像素被称为“辅助像素”。下面是一个小三角形的例子:

在这里插入图片描述

三角形与4个四边形相交,但只在其中3个四边形中产生可见像素。此外,在这3个四边形中,只有一个像素被实际覆盖(每个像素区域的采样点被描绘成黑色的圆圈)——被填充的像素被描绘成红色的。在每个部分覆盖的四边形中剩余的像素是辅助像素,用较浅的颜色绘制。这张图应该清楚地说明,对于小三角形,阴影的像素总数中很大一部分是辅助像素,这引起了一些关于如何合并邻近三角形的四块的研究。然而,尽管这样的优化很聪明,但当前的API规则不允许这样的优化,当前的硬件也不允许这样做。当然,如果HW供应商在某种程度上认为浪费在四轴上的阴影工作是一个严重的问题,这很可能会改变。

3. 属性插值

像素着色器的另一个特色是属性插值——所有其他材质类型,都到目前为止我们看到的(VS)和那些我们还谈论(GS、HS DS, CS)输入之前直接从材质阶段或内存,但是像素着色器有一个额外的插值一步在他们面前。在前面讨论Z时,我已经讨论过一点,它是我们看到的第一个内插属性。

其他插值属性的工作方式大致相同;平面方程是计算在三角形设置(gpu可以选择推迟这个计算,例如,直到知道至少有一个三角形的瓷砖层次z检验通过,但不得关注我们这里),然后在像素阴影,有一个独立的单元,执行属性插值使用像素位置的四胞胎和飞机方程计算。

更新:Marco Salvi指出(在下面的评论中),虽然曾经有专门的插值器,但现在的趋势是让它们返回质心坐标,代入平面方程。实际的计算(每个属性两次乘法)可以在着色器单元中完成。

所有这些都不足为奇,但是还有一些额外的插值类型需要讨论。首先,有“常量”插值器,它在整个原语中都是常量,并从“主要顶点”(在原语设置过程中确定的顶点)获取每个顶点属性的值。硬件要么有一个快速路径,要么只是建立一个相应的平面方程;两种方式都很好。

然后是无透视插值。这通常会建立不同的平面方程;对于基于X的插值,通过将每个顶点的属性值除以相应的w来建立透视校正插值的平面方程,对于质心插值,通过构建三角形边向量来建立平面方程。然而,对于基于X的插值,在不将每个顶点的值除以相应的w的情况下,当建立平面方程时,非透视插值属性的值是最便宜的。

4. “质心”插值是棘手的

接下来,我们有“质心”插值。这是一个标志,不是一个单独的模式;它可以与透视和无透视模式相结合(但不能与恒定插值,因为它将毫无意义)。它的命名也很糟糕,而且除非启用了多重采样,否则它是不操作的。对于多重采样的ob来说,这是一个解决实际问题的有点粗糙的解决方案。问题是,在多采样中,我们在光栅化器的多个采样点上评估三角形的覆盖率,但我们只对每个像素做一次实际的着色。纹理坐标等属性将被插值到像素的中心位置,就好像整个像素都被原语覆盖了一样。这可能会在以下情况下导致问题:
在这里插入图片描述
这里,我们有一个被原语部分覆盖的像素;四个小圆描述了4个采样点(这是默认的4x MSAA模式),而中间的大圆描述了像素中心。注意,大圆在原语之外,任何“插值”的值实际上都是线性外推;例如,如果应用程序使用纹理地图集,这就是一个问题。根据三角形的大小,像素中心的值可能会非常远。质心采样解决了这个问题。最初的解释是,GPU获取原语覆盖的所有样本,计算它们的质心,并在那个位置采样(因此名字)。通常,这只是一个概念模型,gpu可以自由地做不同的事情,只要他们为采样选择的点在原语之内。

如果您认为硬件不太可能真正计数所覆盖的样本,那么将它们相加,然后除以计数,然后加入俱乐部。下面是实际发生的情况:

如果所有的采样点都覆盖了原语,那么就像往常一样在像素中心(即所有合理的采样模式的所有采样位置的质心)进行插值。
如果不是所有的样例点都覆盖这个三角形,硬件会选择其中的一个样例点,并在那里进行计算。所有被覆盖的样本点(根据定义)都在原语内,因此可以工作。

这种选择过去是任意的(即留给硬件);我相信DX11现在已经确切地规定了它是如何完成的,但这更多的是在不同的硬件之间获得一致的结果,而不是API用户真正关心的事情。如上所述,这有点奇怪。对于部分覆盖像素的四轴飞行器,它还会搞砸导数计算——真倒霉。我能说的是,它可能是工业强度的胶带,但它仍然是胶带。

最后(DX11中的新特性!)有一个“拉模型”属性插值。常规的属性插值是在像素着色器开始之前自动完成的;拉模插值添加了实际的指令,做插值到像素着色器。这允许着色器计算它自己的位置来采样值,或者只在一些分支中插入属性,而不在其他分支中。它可以归结为像素着色器能够发送额外的请求到插值单元,而着色器正在运行。

5. 实际的着色器体

再一次,一般的着色器原则在API文档中有很好的解释,所以我不打算讨论单个指令是如何工作的;一般来说,答案是“如你所料”。然而,关于像素着色器的执行还有一些有趣的细节值得讨论。

第一个是:纹理采样!等等,在第4部分中我不是已经花了很长时间在材质采样器上了吗?是的,但那是纹理采样方面的事情-如果你还记得,有一点关于纹理缓存错过是如此频繁,采样器通常被设计为维持至少一次错过主存的请求(16-32像素,记住!)而不会中断。那么多循环,上百个循环。这将是一个巨大的浪费,完美的ALUs,让他们闲置,而所有这些都在进行。

所以着色单元实际上做的是在他们发布了纹理样本之后切换到不同的批处理;然后当批处理发出纹理样本(或完成)时,它切换回先前的批处理并检查纹理样本是否存在。只要每个着色器单位有一些批次,它可以在任何给定的时间工作,这就充分利用了可用的资源。但是,它确实增加了完成单个批的延迟——同样,这是延迟与吞吐量之间的权衡。现在你应该知道哪一方在gpu上获胜了:吞吐量!总是这样。这里需要注意的一点是,同时保持多个批(在NVidia硬件上称为“Warps”,在AMD称为“wavefront”)运行需要更多的寄存器。如果一个着色器需要很多寄存器,一个着色器单元可以保持较少的扭曲;如果有较少的他们,在某些点上你会跑完没有等待纹理结果的可运行批的机会是更高的。如果没有可运行的批,您就不走运了,必须暂停,直到其中一个批获得结果为止。这是很不幸的,但是在这种情况下,硬件资源是有限的——如果内存不足,那么内存就会不足。

另一点我还没有谈到:动态分支着色器(即循环和条件)。在着色单元中,每批处理的所有元素的工作通常是同步进行的。所有“线程”在同一时间运行相同的代码。这意味着ifs有点棘手:如果任何线程想要执行的“那么”分支,如果他们需要,尽管他们中的大多数可能会忽略结果使用一种称为预测的技术,因为他们不想下那里的. .“else”分支也是类似的。如果条件语句在元素之间是连贯的,那么它就很有用;如果条件语句或多或少是随机的,那么它就不那么有用了。最坏情况下,你总是会执行每个if的两个分支。哎哟。循环的工作原理类似——只要至少有一个线程想要继续运行一个循环,那么批处理/Warp/Wavefront中的所有线程都会这样做。

另一个特定的像素着色器是丢弃指令。一个像素着色器可以决定“杀死”当前的像素,这意味着它不会被写入。同样,如果一个批处理中的所有像素都被丢弃,着色单元可以停止并转到另一个批处理;但如果至少有一根线还在,其余的就会被拖走。DX11在这里添加了更多的细粒度控制,通过从像素着色器写入输出的像素覆盖(这总是与原始的三角形/Z-test覆盖进行沙子处理,以确保一个着色器不能写入它的原语之外,为了健康)。这允许着色器放弃个别样本而不是整个像素;例如,它可以用来在着色器中使用自定义的抖动算法来实现Alpha-to-Coverage。

像素着色器也可以写入输出深度(这个特性已经存在了很长一段时间了)。根据我的经验,这是一种很好的方法,可以降低早期Z、分层Z和Z压缩,并且通常可以获得最慢的路径。到目前为止,您已经足够了解这些东西是如何工作的了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPU渲染管线之旅 的相关文章

  • 边缘计算

    多接入边缘计算 xff08 MEC xff09 是云计算之后的又一项突破性技术 xff0c 该技术有望使得应用和内容更接近网络边缘 xff0c 能够降低网络延迟 xff0c 并提供新的服务 iGR Research的分析师Iain Gill
  • TX2上如何查看cuda版本

    如果知道安装的路径 一般都是在local下 可以直接查看 nvidia tegra ubuntu cat usr local cuda version txt CUDA Version 9 0 252 能看到机器上的CUDA版本是9 0 2
  • Jetson开发实战记录(一):Jetson家族的基本介绍

    Jetson开发实战记录 一 Jetson家族的基本介绍 一 Jetson家族 二 Jetson家族产品横向对比 1 Jeston Nano 2 Jetson Xavier 3 Jetson Xavier NX 4 Jetson TX2 5
  • 边缘计算2.0时代,“云边缘”与“边缘云”你分清了吗?

    5G时代的来临 意味着整个世界的连接 计算 和沟通方式都将迎来巨大的改变 这样的改变挑战着每一个人对于未来的想象力 越来越多的 低时延 大带宽 业务需求将会涌现 与此同时 大规模的数据激增也给整个行业和企业带来了不小的挑战 2020年对于全
  • 【毕业设计】基于M5Stack UnitV2的手写识别计算器的设计与制作

    目录 一 简介 二 设计原理 三 系统设计 四 注意点 五 困难 一 简介 耗时五个月 终于完成了毕业设计和毕业答辩 在这里记录一下学习与实现过程 题目是导师给的 这是主要任务和工作内容 利用M5Stack UnitV2的目标检测功能 用摄
  • 边缘计算开源框架EdgeXFoundry的部署应用开发(三)设备服务开发

    边缘计算开源框架EdgeXFoundry的部署应用开发 三 设备服务开发 使用SDK开发真实设备接入服务 着手编写一个温湿度设备接入 准备相关文件及目录 脚本可选 用于单文件编译测试 编写温湿度设备接入设备服务 功能框架 设备名的解析 配置
  • 区块链如何应用于边缘计算、隐私计算联邦学习

    近年来数据安全事件频发 数据安全威胁日益严峻 随着 中华人民共和国数据安全法 的颁布和实施 对企业合规安全地发挥数据价值提出了更高的要求 如何在保障数据安全的前提下发挥数据价值 平衡效率和风险 是当前面临的重要课题 本文探讨如何将区块链应用
  • 【模型压缩】网络层与算子融合

    由于深度学习网络层数深 结构复杂 生成的算子数量众多 带了巨大的计算资源在和时间的消耗 业界对于加速算子的计算展开了一定研究 比较经典的方法是将多个算子重新组合成一个新的算子 同时对生成的代码进行底层的性能优化 融合成新算子后计算相对于多个
  • IOTCS+Ekuiper搭建物联网边缘计算平台

    背景介绍 IOTCS 是专为物联网平台而设计的工业智能网关 自从 2020 年 10 月以来 我们从需求调研 设计 定型 研发 测试经过漫长的沉淀与孵化 最终顺利实现工业智能网关最初的设想 我们凭借创新设计理念 快捷的安装以及部署 易用的扩
  • NVIDIA TX2上ROS安装

    TX2上的ROS自动安装git上有现成的 记录如下 首先 下载git上的自动安装脚本 gt git clone https github com jetsonhacks installROSTX2 git 其次 安装全量ros版本 inst
  • #3文献学习总结--边缘计算资源分配与任务调度优化

    文献 边缘计算资源分配与任务调度优化综述 1 系统模型 云 边 端 第 1 层是物联网层 传感器 处理器根据应用需求感知 测量和收集原始数据 在本地处理大量数据或将其上传至计算节点 第 2 层是边缘计算层 位于互联网边缘 靠近数据源 边缘计
  • 缘计算开源框架EdgeXFoundry的配置参数

    EdgeXFoundry的配置参数 Notes on device profiles 关于设备配置文件的说明 The device profile 设备配置文件 coreCommands deviceCommands deviceResou
  • Day20【元宇宙的实践构想06】—— 元宇宙与Web3.0

    本人简介 男 年龄 18 作者 那就叫我亮亮叭 专栏 元宇宙 部分资料参考文献 成生辉教授的 元宇宙 概念 技术及生态 和百度相关资料 0 0 写在前面 元宇宙 在2021年成为时髦的概念 元宇宙到底是什么 元宇宙是否是互联网技术的下一次革
  • [转]什么是边缘计算?

    转自 https blog csdn net gui951753 article details 80952907 注 本篇翻译自施巍松教授的论文 Edge Computing Vision and Challenges 目录 文章目录 摘
  • 读标准01-IEEE1451-智能传感器接口标准介绍

    老规矩 这里排版不是最佳 并且下文有个别误字太麻烦去改 这里保持第一版 2021 7 14 方便的话请移步 Github Gitee 页面看最新的 或下载下来用 markdown 编辑器看排版更佳 Github仓库 Gitee仓库 记录经过
  • RK3588移植-opencv交叉编译aarch64

    文章目录 概括 准备资源 编译Opencv 修改CMakelist文件 将lib库复制到 lib目录 问题 opencv videoCapture无法运行视频 安装历程 history 注意 本文中的所有配置相关路径都与当前安装的路径有关
  • 边缘计算概念以及应用

    什么是边缘计算 边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和IT环境服务 边缘计算的目标是在靠近数据输入或用户的地方提供计算 存储和网络带宽 边缘计算 是一种分散式运算的架构 在这种架构下 将应用程序 数据资料与服务的运算
  • 工业协议网关IOTCS企业版正式发布

    一 发布前言 继今年5月份IOTCS开源版本发布以后 我们依然在致力于开源版的功能升级迭代 目前南向驱动类型支持OPCUA与Siemens S7协议 1200 1500型号 以及Modbus全协议 北向资源有HTTP MQTT 通过不同的连
  • 什么是边缘计算网关?

    边缘计算网关 简称 边缘网关 将云端功能扩展到本地的边缘设备 使边缘设备能够快速自主地响应本地事件 提供低延时 低成本 隐私安全 本地自治的本地计算服务 同时所有服务都以 Docker 镜像方式安装 真正做到了跨平台 部署快捷 易管理 在链
  • #13文献学习--边缘计算的计算卸载建模综述

    文献 A survey on computation offloading modeling for edge computing 一 介绍 边缘计算 在网络边缘 代表云服务的下游数据和代表物联网服务的上游数据上执行计算 优势 计算或云计算

随机推荐

  • 01-----在Ubuntu16.04上搭建git服务器

    一 在Ubuntu16 04上搭建git服务器的步骤 1 下载git apt get install y git 注 上面可能下载失败 更新一下包即可 然后重新下载 apt get update apt get install y git
  • fullCalendar日程表在Vue项目中的应用

    fullCalendar日程表在Vue项目中的应用 fullCalendar相关API 使用fullCalendar插件在项目中实现日程排版 支持天 月日程转换 自定义事件 页面布局 通过按钮切换天与月视图的转换 天视图回显具体的时分排版项
  • 物联网LoRa系列-21:LoRa终端--射频芯片SX1261 SX1262的FSK调制解调器与配置

    目录 1 SX1261 2功能模块 2 调制技术的基本原理 3 FSK调制技术的基本原理 4 SX1261 2的FSK调制器主要的性能参数 5 SX1261 2的FSK调制器主要寄存器设置 1 SX1261 2功能模块 MCU与SX1261
  • Linux I/O(输入和输出)

    1 文件I O 1 文件描述符 对于内核而言 所有打开的文件都通过文件描述符引用 文件描述符通常是一个小的非负整数 内核用它标识一个特定进程正在访问的文件 当内核打开一个已有文件或创建一个新文件时 它返回一个文件描述符 2 按照惯例 UNI
  • 68.文件操作(打开、读写和关闭)&69.文件操作(文件读写位置)& 70 ftell 、feof、‘EOF‘

    函数库的使用 不要类比字符串函数 仅掌握正确使用 不考虑如何实现 文件有编号 暂时认为是文件指针 FILE指针 文件指针 句柄 实际上是结构体的重定义 struct file int fd typedef struct file FILE
  • C语言从键盘上输入一个大写字母,C语言编程输入一个字符,如果它是一个大写字 – 手机爱问...

    2008 03 17 设计字符界面application程序 输入一字符 如果为小写字母 则转换为大写字符 如果为大写字母 则转换为小写字母 其它字符不变 我写了下 总是错误 帮忙看下 import java awt import java
  • anaconda3在创建虚拟环境中途出错,想要删掉,如何删彻底

    这个文件夹里面是专门放不同环境中的包的 只是没有区分环境 都混在一起了 一般在想要删除一个虚拟环境 除了在命令行中输入conda remove n your env name 虚拟环境名称 all 然后在envs中删除虚拟环境的文件夹 还可
  • Kanzi学习教程培训教程-Kanzi的简介和安装

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com Kanzi UI Solution是一个完整的UI解决方案 为嵌入式的UI的设计 开发和部
  • QLineEdit 设置输入掩码

    背景 QLineEdit 是单行文本编辑器 常用于界面中的文本输入 QLineEdit 提供了 inputMask 使用一些特定到字符来设置输入的格式和内容 inputMask 概述 输入掩码包括两部分组成 之前是输入格式及占位符设置 之后
  • pytorch的学习

    torch save net1 net pkl 保存entire net整个网络 torch save net1 state dict net params pkl 保存参数
  • MySQL5.7忘记root密码-手动修改密码教程

    MySQL 5 7相对于MySQL 5 6在应用上发生了一些新的变化 这里就MySQL5 7忘记root密码情况下 手动去修改root密码做一些介绍 操作系统 Windows10 数据库版本 MySQL 5 7 20 1 Windows10
  • TCL中变量嵌套使用

    TCL中变量嵌套使用 在使用多重嵌套变量时候 因为 对于tcl来说属于非运算符号 因此在使用变量嵌套 直接调用会出现问题 即变量不能正确调用 set mm list 0 1 set nn list 2 3 set index mm puts
  • 憨批的语义分割重制版5——Keras 搭建自己的Unet语义分割平台

    憨批的语义分割重制版5 Keras 搭建自己的Unet语义分割平台 注意事项 学习前言 什么是Unet模型 代码下载 Unet实现思路 一 预测部分 1 主干网络介绍 2 加强特征提取结构 3 利用特征获得预测结果 二 训练部分 1 训练文
  • OC语言学习 (三) 成员变量get/set方法和“.”语法,@proterty和@synthesize关键字

    Person h objc view plain copy print ifndef oc Person h define oc Person h interface Person NSObject int age protected fl
  • 蓝桥杯第一期模拟赛 英文转换 C语言

    英文转换 问题描述 输入一个由小写英文字母组成的字符串 请将其中的元音字母 a e i o u 转换成大写 其它字母仍然保持小写 输入格式 输入一行包含一个字符串 输出格式 输出转换后的字符串 样例输入 lanqiao 样力输出 lAnqI
  • 印刷企业如何利用MES管理系统实现智能计划排产

    在数字化时代 印刷企业面临着日益激烈的市场竞争和不断攀升的成本压力 为了提高生产效率和质量 印刷企业需要采用先进的生产管理系统 其中 MES生产管理系统已成为实现智能计划排产的重要工具 本文将探讨如何利用印刷MES管理系统实现印刷企业的智能
  • 让你的群晖NAS支持DTS!

    由于版权群晖的video station不支持dts 所以我简单的说一下如何安装套件让其支持dts解码 下面只文字阐述 1 打开套件中心 点击设置 2 进入套件来源 新增 名称 SynoCommunity 位置 http packages
  • matlab_非线性优化

    求解非线性问题 min z f x s t c x 0 ceqx 0 Ax b Aeqx beq lb x ub fmincon函数 x fval exitflag output lambda grad hessian fmincon fu
  • linux svn版本管理命令

    1 svn merge回滚 1 先 svn up 保证更新到最新的版本 如2106 2 然后用 svn log 查看历史修改 找出要恢复的版本 如2105 如果想要更详细的了解情况 可以使用svn diff r 2105 2106 文件或目
  • GPU渲染管线之旅

    在这一部分中 我们来谈谈像素处理的前半部分 dispatch和实际的像素着色 事实上 这部分是大多数图形开发者在谈到PS stage时所关心的内容 有关alpha blend和Late Z的内容则会下一篇文章中去探讨 后面我们会看到 在硬件