A trip through the Graphics Pipeline 2011, part 12

【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

A trip through the Graphics Pipeline 2011, part 12

by fgiesen on September 6, 2011

Welcome back! This time, we’ll look into what is perhaps the “poster boy” feature introduced with the D3D11 / Shader 5.x hardware generation: Tessellation. This one is interesting both because it’s a fun topic, and because it marks the first time in a long while that a significant user-visible component has been added to the graphics pipeline that’s not programmable.

Unlike Geometry Shaders, which are conceptually quite easy (it’s just a shader that sees whole primitives as opposed to individual vertices), the topic of “Tessellation” requires some more explanation. There’s tons of ways to tessellate geometry – to name just the most popular ones, there’s Spline Patches in dozens of flavors, various types of Subdivision Surfaces, and Displacement Mapping – so from the bullet point “Tessellation” alone it’s not at all obvious what services the GPU provides us with, and how they are implemented.

To describe how hardware tessellation works, it’s probably easiest to start in the middle – with the actual primitive tessellation step, and the various requirements that apply to it. I’ll get to the new shader types (Hull Shaders and Domain Shaders in D3D11 parlance, Tessellation Control Shader and Tessellation Evaluation Shader in OpenGL 4.0 lingo) later.

Tessellation – not quite like you’d expect

Tessellation as implemented by Shader 5.x class HW is of the “patch-based” variety. Patch types in the CG literature are mostly named by what kind of function is used to construct the tessellated points from the control points (B-spline patches, Bézier triangles, etc.). But we’ll ignore that part for now, since it’s handled in the new shader types. The actual fixed-function tessellation unit deals only with the topology of the output mesh (i.e. how many vertices there are and how they’re connected to each other); and it turns out that from this perspective, there’s basically only two different types of patches: quad-based patches, which are defined on a parameter domain with two orthogonal coordinate axes (which I’ll call u and v here, both are in [0,1]) and usually constructed as a tensor product of two one-parameter basis functions, and triangle-based patches, which use a redundant representation with three coordinates (u, v, w) based on barycentric coordinates (i.e. u, v, w \ge 0, u + v + w = 1). In D3D11 parlance, these are the “quad” and “tri” domains, respectively. There’s also an “isoline” domain which instead of a 2D surface produces one or multiple 1D curves; I’ll treat it the same way as I did lines and point primitives throughout this series: I acknowledge its existence but won’t go into further detail.

Tessellated primitives can be drawn naturally in their respective domain coordinate systems. For quads, the obvious choice of drawing the domain is as a unit square, so that’s what I’ll use; for triangles, I’ll use an equilateral triangle to visualize things. Here’s the coordinate systems I’ll be using in this post with both the vertices and edges labeled:

Quad coordinate system
Triangle coordinate system

Anyway, both triangles and quads have what I would consider a “natural” way to tessellate them, depicted below. But it turns out that’s not actually the mesh topology you get.

'Natural' tessellated quad (4x3) 'Natural' tessellated tri (3)

Here’s the actual meshes that the tessellator will produce for the given input parameters:

Actual tessellated quad (4x3) Actual tessellated tri (edges=inside=3)

For quads, this is (roughly) what we’re expecting – except for some flipped diagonals, which I’ll get to in a minute. But the triangle is a completely different beast. It’s got a very different topology from the “natural” tessellation I showed above, including a different number of vertices (12 instead of 10). Clearly, there’s something funny going on here – and that something happens to be related to the way transitions between different tessellation levels are handled.

Making ends meet

The elephant in the room is handling transitions between patches. Tessellating a single triangle (or quad) is easy, but we want to be able to determine tessellation factors per-patch, because we only want to spend triangles where we need them – and not waste tons of triangles on some distant (and possibly backface-culled) parts of the mesh. Additionally, we want to be able to do this quickly and ideally without extra memory usage; that means a global fix-up post-pass or something of that caliber is out of the question.

The solution – which you’ve already encountered if you’ve written a Hull or Domain shader – is to make all of the actual tessellation work purely local and push the burden of ensuring watertightness for the resulting mesh down to the shaders. This is a topic all by itself and requires, among other things, great care in the Domain Shader code; I’ll skip all the details about expression evaluation in shaders and stick with the basics. The basic mechanism is that each patch has multiple tessellation factors (TFs), which are computed in the Hull Shader: one or two for the actual inside of the patch, plus one for each edge. The TFs for the inside of the patch can be chosen freely; but if two patches share an edge, they’d better compute the exact same TFs along that edge, or there will be cracks. The hardware doesn’t care – it will process each patch by itself. If you do everything correctly, you’ll get a nice watertight mesh, otherwise – well, that’s your problem. All the HW needs to make sure is that it’s possible to get watertight meshes, preferably with reasonable efficiency. That by itself turns out to be tricky in some places; I’ll get to that later.

So, here are some new reference patches – this time with different TFs along each edge so we can see how that works:

Asymmetrically tessellated quad Asymmetrically tessellated triangle

I’ve colored the areas influenced by the different edge tessellation factors; the uncolored center part in the middle only depends on the inside TFs. In these images, the u=0 (yellow) edge has a TF of 2, the v=0 (green) edge has a TF of 3, the u=1 / w=0 (pink) edge has a TF of 4, and the v=1 (quad only, cyan) edge has a TF of 5 – exactly the number of vertices along the corresponding outer edge. As should be obvious from these two images, the basic building block for topology is just a nice way to stitch two subdivided edges with different number of vertices to each other. The details of this are somewhat tricky, but not particularly interesting, so I won’t go into it.

As for the inside TFs, quads are fairly easy: The quad above has an inside TF of 3 along u and 4 along v. The geometry is basically that of a regular grid of that size, except with the first and last rows/columns replaced by the respective stitching triangles (if any edge has a TF of 1, the resulting mesh will have the same structure as if the inside TFs for u/v were both 2, even if they’re smaller than that). Triangles are a bit more complicated. Odd TFs we’ve already seen – for a TF of N, they produce a mesh consisting of \frac{N+1}{2} concentric rings, the innermost of which is a single triangle. For even TFs, we get \frac{N}{2} concentric rings with a center vertex instead of a center triangle. Below is an image of the simplest even case, N=2, which consists just of edge stitches plus the center vertex.

Triangle with asymmetric tessellation, even inner TF

Finally, when triangulating quads, the diagonal is generally chosen to point away from the center of the patch (in the domain coordinate space), with a consistent tie-breaking rule. This is simply to ensure maximum rotational symmetry of the resulting meshes – if there’s extra degrees of freedom, might as well use them!

Fractional tessellation factors and overall pipeline flow

So far, I’ve only talked about integer TFs. In two of the so-called “partitioning types”, namely “Integer” and “Pow2″, that’s all the Tessellator sees. If the shader generates a non-integer (or, respectively, non-power-of-2) TF, it will simply get rounded up to the next acceptable value. More interesting are the remaining two partitioning types: Fractional-odd and Fractional-even tessellation. Instead of jumping from tessellation factor to tessellation factor (which would cause visible pops), new vertices start out at the same position as an existing vertex in the mesh and then gradually move to their new positions as the TF increases.

For example, with fractional-odd tessellation, if you were to use an inner TF of 3.001 for the above triangle, the resulting mesh would look very much like the mesh for a TF of 3 – but topologically, it’d be the same as if the TF was 5, i.e. it’s a patch with 3 concentric rings, even though the middle ring is very narrow. Then as the TF gets closer to 5, the middle ring expands until it is eventually at its final position for TF 5. Once you raise the TF past 5, the mesh will be topologically the same as is the TF was 7, but again with a number of almost-degenerate triangles in the middle, and so forth. Fractional-even tessellation uses the same principle, just with even TFs.

The output of the tessellator then consists of two things: First, the positions of the tessellated vertices in domain coordinates, and second, the corresponding connectivity information – basically an index buffer.

Now, with the basic function of the fixed-function tessellator unit explained, let’s step back and see what we need to do to actually churn out primitives: First, we need to input a bunch of input control points comprising a patch into the Hull Shader. The HS then computes output control points and “patch constants” (both of which get passed down to the Domain Shader), plus all Tessellation Factors (which are essentially just more patch constants). Then we run the fixed-function tessellator, which gives us a bunch of Domain Positions to run the Domain Shader at, plus the associated indices. After we’ve run the DS, we then do another round of primitive assembly, and then send the primitives either down to the GS pipeline (if it’s active) or Viewport transform, Clip and Cull (if not).

So let’s look a bit into the HS stage.

Hull Shader execution

Like Geometry Shaders, Hull Shaders work on full (patch) primitives as input – with all the input buffering headaches that causes. How much of a headache entirely depends on the type of input patch. If the patch type is something like a cubic Bézier patch, we need 4×4 = 16 input points per patch and might just produce a single quad of output (or even none at all, if the patch is culled); clearly, that’s a somewhat awkward amount of data to work with, and doesn’t lend itself to very efficient shading. On the other hand, if tessellation takes plain triangles as input (which a lot of people do), input buffering is pretty tame and not likely to be a source of problems or bottlenecks.

More importantly, unlike Geometry Shaders (which run for every primitive), Hull Shaders don’t run all that often – they run once per patch, and as long as there’s any actual tessellation going on (even at modest TFs), we have way less patches than we have output triangles. In other words, even when HS input is somewhat inefficient, it’s less of an issue than in the GS case simply because we don’t hit it that often.

The other nice attribute of Hull Shaders is that, unlike Geometry Shaders, they don’t have a variable amount of output data; they produce a fixed amount of control points, each which a fixed amount of associated attributes, plus a fixed amount of patch constants. All of this is statically known at compile time; no dynamic run-time buffer management necessary. If we Hull Shade 16 hulls at a time, we know exactly where the data for each hull will end up before we even start executing the shader. That’s definitely an advantage over Geometry Shaders; for lots of Geometry Shaders, it’s possible to know statically how many output vertices will be generated (for example because all the control flow leading to emit / cut instructions can be statically evaluated at compile time), and for all of them, there’s a guaranteed maximum number of output vertices, but for HS, we have a guaranteed fixed amount of output data, no additional analysis required. In short, there’s no problems with output buffer management, other than the fact that, again depending on the primitive type, we might need lots of output buffer space which limits the amount of parallelism we can achieve (due to memory/register constraints).

Finally, Hull Shaders are somewhat special in the way they are compiled in D3D11; all other shader types basically consist of one block of code (with some subroutines maybe), but Hull Shaders are generated factored into multiple phases, each of which can consist of multiple (independent) threads of execution. The details are mainly of interest to driver and shader compiler programmers, but suffice it to say that your average HS comes packaged in a form that exposes lots of latent parallelism, if there is any. It certainly seems like Microsoft was really keen to avoid the bottlenecks that plague Geometry Shaders this time around.

Anyway, Hull Shaders produce a bunch of output per patch; most of it is just kept around until the corresponding Domain Shaders run, except for the TFs, which get sent to the tessellator unit. If any of the TFs are less than or equal to zero (or NaN), the patch is culled, and the corresponding control points and patch constants silently get thrown away. Otherwise, the Tessellator (which implements the functionality described above) kicks in, reads the just-shaded patches, and starts churning out domain point positions and triangle indices, and we need to get ready for DS execution.

Domain Shaders

Just like for Vertex Shading way back, we want to gather multiple domain vertices into one batch that we shade together and then pass on the PA. The fixed-function tessellator can take care of this: “just” handle it along with producing vertex positions and indices (I put the “just” in quotes here because this does involve some amount of bookkeeping).

In terms of input and output, Domain Shaders are very simple indeed: the only input they get that actually varies per vertex is the domain point u and v coordinates (w, when used, doesn’t need to be computed or passed in by the tesselator; since u+v+w=1, it can be computed as w=1-u-v). Everything else is either patch constants, control points (all of which are the same across a patch) or constant buffers. And output is basically the same as for Vertex Shaders.

In short, once we get to the DS, life is good; the data flow is almost as simple as for VS, which is a path we know how to run efficiently. This is perhaps the biggest advantage of the D3D11 tessellation pipeline over Geometry Shaders: the actual triangle amplification doesn’t happen in a shader, where we waste precious ALU cycles and need to keep buffer space for a worst-case estimate of vertices, but in a localized element (the tessellator) that is basically a state machine, gets very little input (a few TFs) and produces very compact output (effectively an index buffer, plus a 2D coordinate per output vertex). Because of this, we need way less memory for buffering, and can keep our Shader Units busy with actual shading work instead of housekeeping.

And that’s it for this post – next up: Compute Shaders, aka the final part in my original outline for this series! Until then.

Final remarks

As usual, I cut a few corners. There’s the “isoline” patch type, which I didn’t go into at all (if there’s any demand for this, I can write it up). The Tessellator has all kinds of symmetry and precision requirements; as far as vertex domain positions are concerned, you can basically expect bit-exact results between the different HW vendors, because the D3D11 spec really nails this bit down. What’s intentionally not nailed down is the order in which vertices or triangles are produced – an implementation can do what it wants there, provided it does so consistently (i.e. the same input has to produce the same output, always). There’s a bunch of subtle constraints that go into this too – for example, all domain positions written by the Tessellator need to have both u and 1-u (and also v and 1-v) exactly representable as float; there’s a bunch of necessary conditions like this so that Domain Shaders can then produce watertight meshes (this rule in particular is important so that a shared edge AB between two patches, which is AB to one patch and BA to the other, can get tessellated the same way for both patches).

Writing Domain Shaders so they actually can’t produce cracks is tricky and requires great care; I intentionally sidestep the topic because it’s outside the scope of this series. Another much more trivial issue that I didn’t mention is the winding order of triangles generated by the Tessellator (answer: it’s up to the App – both clockwise and counterclockwise are supported).

The description of Input/Output buffering for Hull and Domain shaders is somewhat terse, but it’s very similar to stages we’ve already seen, so I’d rather keep it short and avoid extra clutter; re-read the posts on Vertex Shaders and Geometry Shaders if this was too fast.

Finally, because the Tesselation pipeline can feed into the GS, there’s the question of whether it can generate adjacency information. For the “inside” of patches this would be conceivable (just more indices for the Tessellator unit to write), but it gets ugly fast once you reach patch edges, since cross-patch adjacency needs exactly the kind of global “mesh awareness” that the Tessellation pipeline design tries so hard to avoid. So, long story short, no, the tessellator will not produce adjacency information for the GS, just plain triangles.

双闭环PWM整流器VOC控制 +SVPWM调制仿真(Simulink仿真实现) 内容概要:本文围绕城市空中交通环境下多无人机协同路径规划问题展开深入研究,重点探讨了在包含建筑物、禁飞区、动态威胁等复杂约束条件下,如何利用仿生优化算法(如布谷鲶鱼优化算法CCO、灰雁优化算法GGO、田忌赛马优化算法THRO)实现安全、高效的多无人机路径规划。文章提出了一种分层规划策略,融合全局路径规划与局部动态避障机制,构建了综合考虑路径长度、威胁暴露度、高度变化及地形碰撞风险的多目标优化模型。通过Matlab仿真平台对多种算法进行对比实验,系统评估了各算法在路径安全性、收敛速度、优化性能和鲁棒性方面的表现,并深入分析了现有方法的局限性,对未来研究方向如动态环境适应、通信受限下的分布式协同等进行了展望。; 适合人群:具备一定编程基础,熟悉Matlab/Simulink仿真环境,从事无人机系统设计、智能交通、自动化控制、路径规划算法研究等相关领域的科研人员及高校研究生。; 使用场景及目标:①应用于城市空中交通系统中多无人机的协同任务执行与动态避障;②为复杂威胁环境下多智能体系统的路径规划提供先进算法支持与仿真验证框架;③辅助研究人员深入理解并复现仿生优化算法在高维、多约束路径规划问题中的具体实现与性能差异。; 阅读建议:此资源以Matlab代码实现为核心,紧密结合理论建模与仿真实验,建议读者在学习过程中重点关注算法的设计原理、参数调优策略及仿真结果的可视化分析,结合文中提供的实验数据进行横向对比,以深刻把握不同仿生算法的搜索机制、适用场景及其在实际工程应用中的潜力与挑战。 立即下载

相关推荐

仿真+课设Multisim直流可调稳压电源(0-15V)仿真设计基于LM317+LM337【仿真+课程报告】

内容概要:本文详细介绍了一种基于LM317(正压调节)和LM337(负压调节)芯片的Multisim直流可调稳压电源仿真设计方案,输出电压范围为0-15V,具备完整的电路仿真模型与课程设计报告。设计涵盖线性稳压电源的核心原理,包括电压调节机制、元件参数配置、双极性电源构建及仿真测试流程,突出理论与实践结合。文档还附带丰富的扩展资源,如三相PWM整流器、函数信号发生器等仿真项目,并提供百度网盘链接用于获取全套资料,适用于电子类课程设计与自主学习。整体内容系统性强,注重仿真操作指导与工程实践能力培养。; 适合人群:电子信息工程、自动化、电气工程及其相关专业的本科生、专科生,以及正在进行模拟电子技术课程设计或毕业设计的学生。; 使用场景及目标:①深入理解线性稳压电源的工作原理与设计方法;②掌握Multisim软件在电路仿真中的实际应用;③完成基于LM317/LM337的可调稳压电源课程设计任务;④提升模拟电路系统的设计、仿真与分析综合能力; 阅读建议:建议结合Multisim软件同步实践,按照文档电路图逐步搭建仿真模型,重点关注电压调节电路的实现细节与参数设置,并参考所提供的其他仿真资源拓展知识广度,强化工程思维训练。

A trip through the graphics pipeline 2011 Part 10(翻译)

之前的几篇翻译都烂尾了,这篇希望。。。。能好些,恩,还有往昔呢。 ------------------------------------------------------------- primitive 图元 tris  三角形 quad  栅格 -----------------------------------------------------------...

anfu8346的博客 263

阻尼器磁流变阻尼器MR Damper非线性(阻尼、滞回)特性研究(Matlab代码实现)

内容概要:本文围绕磁流变阻尼器(MR Damper)的非线性特性开展深入研究,重点剖析其在动态载荷作用下的阻尼力响应与滞回行为所表现出的强非线性特征,并基于Matlab平台进行系统建模与数值仿真。通过建立能够准确描述MR阻尼器非线性力学行为的数学模型,模拟其在不同激励条件、电流强度和运动频率下的动态响应过程,进而对系统的非线性特性进行定性与定量分析。研究涵盖了模型构建、参数设定、仿真执行与结果可视化等全过程,突出了Matlab在处理复杂非线性系统仿真中的强大功能与工程实用性,为智能材料器件在振动控制领域的应用提供了坚实的理论支撑与技术路径。; 适合人群:具备一定控制理论、机械动力学或智能材料基础知识,熟悉Matlab编程环境的研究生、科研人员及从事振动控制、结构工程等相关领域的工程技术人员。; 使用场景及目标:①用于智能材料与结构领域的科研与教学,帮助深入理解磁流变阻尼器的工作机理与非线性动力学特性;②为车辆半主动悬架系统、建筑结构抗震减震、桥梁风振抑制等实际工程中的振动控制系统设计、仿真验证与参数优化提供技术支持;③作为非线性系统建模、动力学仿真与Matlab编程实践的经典案例,有效提升使用者的系统分析能力和工程软件应用水平。; 阅读建议:建议读者结合文中提供的Matlab代码进行动手实践,通过调整模型参数(如电流、激励幅值与频率)观察系统响应的变化规律,深入探究非线性特性的形成原因与影响因素,并可尝试将该建模方法迁移至其他智能阻尼器件(如压电、电流变阻尼器)的研究中,以拓展应用视野。

A trip through the Graphics Pipeline 2011, part 1

http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/ A trip through the Graphics Pipeline 2011, part 1 by fgiesen on July 1, 2011 It’s been awhile since

killcpp的专栏 1025

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

内容概要:本文档详细介绍了一种基于Simulink实现的全桥LLC谐振变换器闭环仿真模型,采用变频与移相混合控制策略,重点研究系统的动态响应、稳态性能及高效软开关特性。内容涵盖系统建模、PI控制器设计、闭环反馈机制构建以及谐振参数的优化配置,全面展示了从理论分析到仿真验证的全过程。通过在不同输入电压与负载条件下进行仿真测试,验证了该模型在提升转换效率、实现零电压开通(ZVS)和精确调控输出电压方面的优越性能。同时,配套提供参数设计报告、仿真说明文档及参考文献,有助于深入理解与复现实验结果。; 适合人群:具备电力电子与电力系统基础知识,熟悉Simulink/Matlab仿真环境,从事高频DC-DC变换器、新能源电源、车载充电机或相关领域研发工作的工程师及高校研究生。; 使用场景及目标:① 掌握全桥LLC谐振变换器的建模方法与闭环控制系统设计流程;② 深入理解变频+移相混合控制在高效率电源变换中的协同作用机制;③ 用于科研项目复现、教学案例演示或工业级电源产品的前期仿真预研;④ 为实际硬件原型开发提供可靠的理论支撑与关键参数设计依据。; 阅读建议:建议结合所提供的仿真文件与设计报告同步操作,重点关注控制环路搭建、谐振腔参数选取及其对系统性能的影响,推荐通过调整负载与输入条件进行多工况仿真分析,有条件者可进一步推进至样机实验验证。

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法。

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法

weixin_42960380的博客 2499

A trip through the Graphics Pipeline 2011, part 10

A trip through the Graphics Pipeline 2011, part 10 by fgiesen on July 20, 2011 Welcome back. Last time, we dove into bottom end of the pixel pipeline. This time, we’ll switch back to the midd

killcpp的专栏 1593

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6684

A trip through the Graphics Pipeline 2011, part 2

A trip through the Graphics Pipeline 2011, part 2 by fgiesen on July 2, 2011 Not so fast. In the previous part I explained the various stages that your 3D rendering commands go through on a P

killcpp的专栏 1104

智能车竞赛走马观碑组:如何高效识别目标板并优化绕行策略(附实战代码)

本文深入探讨了智能车竞赛走马观碑组中,如何构建从图像识别到路径决策的全栈优化方案。针对目标板识别与绕行策略的核心难点,文章详细解析了基于MobileNetV2的高效识别流水线、结合预瞄点与纯追踪算法的平滑路径规划,以及横向与纵向协同控制策略,并提供了实战代码与调试指南,旨在全面提升小车的比赛表现。

o5p6q的博客 884

【实战指南】OpenClaw Telegram 群聊不响应完整解决方案:从获取群 ID 到关闭隐私模式全流程

将整个从“获取群组 ID → 配置 OpenClaw Telegram 通道 → 关闭隐私模式 → 测试”的全流程都整合进去。

hampeter的博客 3487

A trip through the Graphics Pipeline 2011, part 8

A trip through the Graphics Pipeline 2011, part 8 by fgiesen on July 10, 2011 In this part, I’ll be dealing with the first half of pixel processing: dispatch and actual pixel shading. In fact

killcpp的专栏 871

基于Simulink的强化学习(DQN)自主调节占空比

摘要:本文介绍了一种基于Simulink的强化学习(DQN)方法,用于Buck变换器的自主占空比调节。通过建立马尔可夫决策过程模型,设计了包含状态、动作和奖励函数的强化学习框架,并在Simulink中实现了Buck主电路、RL接口模块和DQN智能体的集成。实验表明,相比传统PID控制,DQN方法在负载突变和输入跌落等复合扰动下表现出更好的鲁棒性,电压超调小于1%,恢复时间缩短至0.3ms。文章还详细讨论了关键设计技巧、工程挑战及对策,并提出了多目标优化、先进算法应用等扩展方向,为智能电源控制提供了新思路。

amy_mhd的博客 74

A trip through the Graphics Pipeline 2011, part 13

A trip through the Graphics Pipeline 2011, part 13 by fgiesen Welcome back to what’s going to be the last “official” part of this series – I’ll do more GPU-related posts in the future, but th

killcpp的专栏 1074

Vue3 - [最强] 超详细 Element Plus 组件库主题颜色进行 “统一全局“ 替换,将默认的蓝色主题色更换为其他自定义颜色,覆盖原来的主题色改为自己的颜色(完美解决主题色不生效、没反应)

elementplus修改主题色,vue3+element-plus主题色更换,vue3vite如何修改扩展elementplus主题色样式,全局设置elementplus主题色,有什么办法可以直接全局修改主题色,对elementplus默认蓝色不满意怎么替换更改其他颜色,elementplus覆盖默认主题色,elementplus主题色官方文档,vue3中修改elementplus主题色,elementplus修改主题色不生效怎么办,elementplus如何修改主题颜色,eleme

🏆 前端领域优质创作者 1万+

YOLOv8改进策略【注意力机制篇】| CVPRW-2024 分层互补注意力混合层 H-RAMi 针对低质量图像的特征提取模块

许多证据表明层次化网络对图像恢复(IR)任务通常不太有效,因为IR的目标是逐个预测像素值(密集预测),而缩小特征图会丢失重要的像素级信息。然而,层次化结构有降低时间复杂度以及学习语义级和像素级特征表示的优点。为了弥补缺点并利用优点,设计了H - RAMi层。

Limiiiing的博客 377

A trip through the Graphics Pipeline 2011, part 9

A trip through the Graphics Pipeline 2011, part 9 by fgiesen on July 12, 2011 Welcome back! This post deals with the second half of pixel processing, the “join phase”. The previous phase was al

killcpp的专栏 767

《人工智能基础》[工具篇2]:ChatBox怎么使用本地模型和知识库配置教程

通过设置-知识库,添加,填入知识库名称、选用的嵌入模型创建好知识库后,点击添加文件按钮+,可以上传本地文件、拖动文件支持上传PDF、DOCX等格式的文档。系统会自动对文档进行处理。批量上传:一次最多上传 50 个文档,总大小不超过 2GB;格式检测:支持 PDF/DOCX/TXT/Markdown,不支持 EXE/RAR 等二进制文件。‌文档类‌图片类‌代码类‌:Python、Java、JavaScript等编程文件‌其他‌:Markdown(用于导出对话记录) ‌。

专注大数据、云计算、人工智能、机器人领域技术传播 2935

A trip through the Graphics Pipeline 2011, part 11

A trip through the Graphics Pipeline 2011, part 11 by fgiesen on August 14, 2011 Welcome back! This time, the focus is going to be on Stream-Out (SO). This is a facility for storing the Outpu

killcpp的专栏 750

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

A trip through the Graphics Pipeline 2011, part 3

A trip through the Graphics Pipeline 2011, part 3 by fgiesen on July 3, 2011 At this point, we’ve sent draw calls down from our app all the way through various driver layers and the command p

killcpp的专栏 783

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

A trip through the Graphics Pipeline 2011, part 6

A trip through the Graphics Pipeline 2011, part 6 by fgiesen on July 6, 2011 Welcome back. This time we’re actually gonna see triangles being rasterized – finally! But before we can rasterize t

killcpp的专栏 646

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

A trip through the Graphics Pipeline 2011, part 7

A trip through the Graphics Pipeline 2011, part 7 by fgiesen on July 8, 2011 In this installment, I’ll be talking about the (early) Z pipeline and how it interacts with rasterization. Like

killcpp的专栏 936

A trip through the Graphics Pipeline 2011, part 4

A trip through the Graphics Pipeline 2011, part 4 by fgiesen on July 4, 2011 Welcome back. Last part was about vertex shaders, with some coverage of GPU shader units in general. Mostly, they’

killcpp的专栏 877

A trip through the Graphics Pipeline 2011, part 5

A trip through the Graphics Pipeline 2011, part 5 by fgiesen on July 5, 2011 After the last post about texture samplers, we’re now back in the 3D frontend. We’re done with vertex shading, so no

killcpp的专栏 834

A trip through the Graphics Pipeline 2011_13 Compute Shaders, UAV, atomic, structured buffer

Welcome back to what’s going to be the last “official” part of this series – I’ll do more GPU-related posts in the future, but this series is long enough already. We’ve been touring all the regular...

weixin_34024034的博客 341

ATE test for STB(机顶盒) chip Kronos from Trident

数字视频变换盒(Set Top Box)简称STB,通常称作机顶盒或机上盒,是一个连接电视机与外部信号源的设备。它可以将压缩的数字信号转成电视内容,并在电视机上显示出来。信号可以来自有线电缆、卫星天线、宽带网络以及地面广播。机顶盒接收的内容除了模拟电视可以提供的图像、声音之外,更在于能够接收数字内容,包括电子节目指南、因特网网页等等。它使用户能在现有电视机上观看数字电视节目,并可通过网络进行交互式数字化娱乐、教育和商业化活动。

m0_37918394的博客 450
上一篇: A trip through the Graphics Pipeline 2011, part 11
下一篇: A trip through the Graphics Pipeline 2011, part 13
killcpp
博客等级 码龄20年 13粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值