Learn ComputeShader 10 HUD Overlay

news2024/11/22 19:10:44

前言:

1. HUD Overlay (Head-Up Display Overlay)

  • 定义: HUD 是指游戏或应用程序中的一类叠加界面元素,通常显示在屏幕上,用于向用户提供实时信息。它通常显示关键信息而不会打断用户的主要活动或视线。
  • 应用场景: 常见于游戏、飞行模拟器和驾驶游戏中,HUD 元素包括生命值、弹药数、速度、地图、目标标记等。
  • 特点: HUD 通常位于屏幕的上层,直接显示在用户的视野中,不与用户的输入有直接交互,目的是提供信息的可视化呈现。

2. UI (User Interface)

  • 定义: UI 是一个更广泛的概念,指的是用户和系统之间进行交互的界面。UI 包括所有用户可见的界面元素,例如按钮、菜单、滑块、对话框等。
  • 应用场景: UI 包括了游戏菜单、设置界面、任务面板等,适用于任何需要用户与系统进行交互的场景。
  • 特点: UI 通常涉及到用户的操作,例如点击、拖动或输入,用户可以通过这些元素直接与系统进行交互。

区别

  • HUD Overlay 是 UI 的一部分: HUD 是 UI 的一个子集,但专注于向用户提供信息,而不是与用户交互。例如,HUD 可以显示游戏中的玩家生命值、当前任务状态等,但它一般不会包含需要用户直接操作的元素。
  • 交互性: HUD 通常是静态的或半动态的显示信息,不要求用户主动操作,而 UI 元素通常需要用户输入或点击,提供更多的互动性。

类比:

  • HUD 是 UI 中的一种展示方式,像汽车仪表盘上的速度表一样,持续显示信息。
  • UI 则像车载导航系统中的触摸屏菜单,用户可以通过点击进行交互和控制。

下面要实现一个下图这样的hudoverlay效果

首先生成水平和垂直两条竖线以及周围的三层圆圈。

为了生成的水平和垂直的线都在屏幕中央,我们有必要进行坐标转换。根据原图像的宽高比对像素坐标进行缩放,同时调整屏幕中心点的位置。

之后我们就可以通过调整后的坐标在指定 轴上生成一条线。用的就是下面这个函数,这个函数主要就是检测x和y的接近程度(程度取决于后两个参数),只要接近就会返回1,否则返回0

float onLine(float x, float y, float line_width, float edge_width){
    return smoothstep(x-line_width/2.0-edge_width, x-line_width/2.0, y) - smoothstep(x+line_width/2.0, x+line_width/2.0+edge_width, y);
}

通过这个函数添加水平和垂直两个轴

[numthreads(8, 8, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
    float3 white = 1;
    
    float2 uv = (float2)id.xy;
    float2 center = 0.5;
    float aspectRatio = (float)source.Length.x/(float)source.Length.y;

    if (aspectRatio>1){
        uv /= (float)source.Length.y;
        center.x *= aspectRatio; 
    }else{
        uv /= (float)source.Length.x;
        center.y /= aspectRatio;
    }

    float3 color = onLine(uv.y, center.y, 0.002, 0.001) * axisColor.rgb;//xAxis
    color+= onLine(uv.x, center.x, 0.002, 0.001) * axisColor.rgb;//xAxis
    //TO DO: Add code here

    float alpha = saturate(color.r + color.g + color.b);
    float3 finalColor = lerp(source[id.xy].rgb, color, alpha);

    output[id.xy] = float4(finalColor, 1.0);
}

效果:

 然后添加周围的三个圆圈

下面这个函数可以生成一个圆形

float circle(float2 pt, float2 center, float radius, float line_width, float edge_thickness){
    pt -= center;
    float len = length(pt);
    //Change true to false to soften the edge
    float result = smoothstep(radius-line_width/2.0-edge_thickness, radius-line_width/2.0, len) - smoothstep(radius + line_width/2.0, radius + line_width/2.0 + edge_thickness, len);

    return result;
}

 生成三个圆形

    color+= circle(uv, center, 0.45,0.002, 0.001) * axisColor.rgb;
    color+= circle(uv, center, 0.30,0.002, 0.001) * axisColor.rgb;
    color+= circle(uv, center, 0.15,0.002, 0.001) * axisColor.rgb;

效果:

目前为止我们已经完成了所有静态效果,下面完成动态效果 。

首先生成一个动态的绕着圆弧旋转的直线,同时在直线后面增加一个尾随的渐变效果。可以利用下面的函数。(数学原理暂时没搞懂)

float sweep(float2 pt, float2 center, float radius, float line_width, float edge_thickness){
    float2 d = pt - center;
    float theta = time;
    float2 p = float2(cos(theta), -sin(theta))*radius;
    float h = clamp( dot(d,p)/dot(p,p), 0.0, 1.0 );
    //h = dot(d,p)/dot(p,p);
    float l = length(d - p*h);

    float gradient = 0;
    const float gradient_angle = PI * 0.5;
    if (length(d) < radius) {
        float angle = fmod(theta + atan2(d.y, d.x), PI * 2.0);
        gradient = clamp(gradient_angle - angle, 0.0, gradient_angle) / gradient_angle * 0.5;
    }

    return gradient+1.0 - smoothstep(line_width, line_width+edge_thickness, l);
}

最后就是生成水平轴两边的小三角形,可以利用下面的函数

float polygon(float2 pt, float2 center, float radius, int sides, float rotate, float edge_thickness){
    pt -= center;

    // Angle and radius from the current pixel 
    float theta = atan2(pt.y, pt.x) + rotate;
    float rad = PI2/float(sides);

    // Shaping function that modulate the distance    
    float d = cos(floor(0.5 + theta/rad)*rad-theta)*length(pt);

    return 1.0 - smoothstep(radius, radius + edge_thickness, d);
}

最后是完整的核函数代码:

[numthreads(8, 8, 1)]
void CSMain(uint3 id : SV_DispatchThreadID)
{
    float3 white = 1;
    
    float2 uv = (float2)id.xy;
    float2 center = 0.5;
    float aspectRatio = (float)source.Length.x/(float)source.Length.y;

    if (aspectRatio>1){
        uv /= (float)source.Length.y;
        center.x *= aspectRatio; 
    }else{
        uv /= (float)source.Length.x;
        center.y /= aspectRatio;
    }

    float3 color = onLine(uv.y, center.y, 0.002, 0.001) * axisColor.rgb;//xAxis
    color+= onLine(uv.x, center.x, 0.002, 0.001) * axisColor.rgb;//yAxis
    color+= circle(uv, center, 0.45,0.002, 0.001) * axisColor.rgb;
    color+= circle(uv, center, 0.30,0.002, 0.001) * axisColor.rgb;
    color+= circle(uv, center, 0.15,0.002, 0.001) * axisColor.rgb;

    color+= sweep(uv, center, 0.45,0.002, 0.001) * sweepColor.rgb;

    float offset = sin(time * 4) * 0.05 + 0.5;
    color += polygon(uv, float2(center.x + offset, center.y), 0.008, 3, 0.0, 0.001) * white;
    color += polygon(uv, float2(center.x - offset, center.y), 0.008, 3, PI, 0.001) * white;

    float alpha = saturate(color.r + color.g + color.b);
    float3 finalColor = lerp(source[id.xy].rgb, color, alpha);

    output[id.xy] = float4(finalColor, 1.0);
}

最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[项目][CMP][Page Cache]详细讲解

目录 1.申请内存2.释放内存3.框架 1.申请内存 当Central Cache向Page Cache申请内存时&#xff0c;Page Cache先检查对应位置有没有span&#xff0c;如果没有则向更大页寻找一个span&#xff0c;如果找到则分裂成两个 比如&#xff1a;申请的是4页page&#xff0c;4页page后面…

【MRI基础】TI反转时间概念

在磁共振成像 (MRI) 中&#xff0c;反转时间 (TI) 是反转恢复脉冲序列中的一个特定参数。它表示施加 180 度反转脉冲&#xff08;将纵向磁化翻转到相反方向&#xff09;与随后的 90 度激励脉冲&#xff08;将磁化翻转到横向平面以创建 MR 信号&#xff09;之间的时间间隔。 MRI…

常见概念 -- 电层业务调制谱宽与光层通道谱宽

本文介绍了“电层业务调制谱宽”和“光层通道谱宽”这两个概念&#xff0c;并结合网管的配置界面解释二者的配置方法。 电层业务调制谱宽 电层业务调制谱宽与光线路码型唯一相关&#xff0c;光线路码型确定后谱宽随之确定。 电层业务调制谱宽是指某业务信号的损耗谱从峰值下…

C++解决:求排列数

描述 输入两个整数m,n&#xff0c;求m个数字中选n个数的排列数。&#xff08;1<n<m<50&#xff09; 输入描述 两个正整数m和n。 输出描述 一个正整数表示排列数。 用例输入 1 6 5 用例输出 1 720 AC code #include<bits/stdc.h> using namespace s…

[linux 驱动]platform总线设备驱动详解与实战

目录 1 描述 2 结构体 2.1 bus_type 2.2 platform_bus_type 2.2.1 platform_match 2.2.2 platform_uevent 2.2.3 platform_dma_configure 2.2.4 platform_dev_pm_ops 2.3 platform_driver 2.4 platform_device 3 platform注册 3.1 platform_driver_register 3.1.1 …

【python因果推断库11】工具变量回归与使用 pymc 验证工具变量4

目录 Wald 估计与简单控制回归的比较 CausalPy 和 多变量模型 感兴趣的系数 复杂化工具变量公式 Wald 估计与简单控制回归的比较 但现在我们可以将这个估计与仅包含教育作为控制变量的简单回归进行比较。 naive_reg_model, idata_reg make_reg_model(covariate_df.assign…

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数&#xff0c;其值不超过1000。如果n是非负整数&#xff0c;则该函数必须在一行中打印出n!的值&#xff0c;否则打印“Invalid input”。 首先&#xff0c;知道阶乘是所有小于及等于该数的…

halcon 自定义距离10的一阶导数幅图,摆脱sobel的3掩码困境

一&#xff0c;为什么要摆脱3的掩码 在处理图像的过程中&#xff0c;会用到平滑算子&#xff0c;很容易破坏边际&#xff0c;所谓的一阶导数sobel只计算掩码为3的差分&#xff0c;在幅度图分割中&#xff0c;往往是很难把握的。 举个例子-现在图像头平滑好了&#xff0c;缺陷…

【Python 千题 —— 算法篇】寻找两个正序数组的中位数

Python 千题持续更新中 …… 脑图地址 &#x1f449;&#xff1a;⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在处理大规模数据时&#xff0c;我们经常需要对数据进行排序和分析。一个常见问题是如何高效地从两个正序数组中找出它们的中位数。…

今天又学到了——图编号关联章节号,QGIS下载文件存储的瓦片

记录教程来源&#xff1a;​​​​​​【Word图编号关联章节号】图片分章节 编号&#xff0c;图1-1、图2-1_哔哩哔哩_bilibili 上面链接这个实现的是这个效果&#xff1a; word自动目录及章节自动编号教程_哔哩哔哩_bilibili&#xff0c;这个的效果是自己设计多级列表&#xf…

Pr:首选项 - 音频

Pr菜单&#xff1a;编辑/首选项 Edit/Preferences Premiere Pro 首选项中的“音频” Audio选项卡主要作用是控制音频的处理设置&#xff0c;包括音量调整、波形生成、音频渲染等选项&#xff0c;这些设置有助于优化音频的处理和编辑工作&#xff0c;适用于不同的剪辑需求和项目…

【Qt】Qt与Html网页进行数据交互

前言&#xff1a;此项目使用达梦数据库&#xff0c;以Qt制作服务器&#xff0c;Html制作网页客户端界面&#xff0c;可以通过任意浏览器访问。 1、Qt与网页进行数据交互 1.1、第一步&#xff1a;准备qwebchannel.js文件 直接在qt的安装路径里复制即可 1.2、第二步&#xf…

海外云手机是否适合运营TikTok?

随着科技的迅猛发展&#xff0c;海外云手机逐渐成为改变工作模式的重要工具。这种基于云端技术的虚拟手机&#xff0c;不仅提供了更加便捷、安全的使用体验&#xff0c;还在电商引流和海外社媒管理等领域展示了其巨大潜力。那么&#xff0c;海外云手机究竟能否有效用于运营TikT…

Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)

目录 介绍 准备工作 配置jenkins 构建部署任务 常见问题 介绍 在平常开发前端vue项目时,我们通常需要将vue项目进行打包构建,将打包好的dist目录下的静态文件上传到服务器上,但是这种繁琐的操作是比较浪费时间的,可以使用jenkins进行自动化构建部署前端vue 准备工作 准备…

Java 面试题:通过JProfile排查OOM问题 内存溢出与内存泄漏问题 --xunznux

文章目录 如何通过JProfile排查OOM或内存泄漏问题1、启动工具观测程序执行状态2、使用默认设置采样3、查看memory&#xff0c;Run GC无效4、查看 Live Memory发现两个byte大数组存在5、通过快照查看堆中的内存使用情况6、找到Full GC无法清除的对象通过大对象列表定位内存泄漏问…

MES系统如何支持企业进行数字化转型

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;在企业数字化转型中扮演着至关重要的角色&#xff0c;它通过提供实时的生产数据、优化生产流程、提升质量管理水平、实现设备智能化管理以及促进企业内部协同和沟通等多种方式&#xff…

行政组织理论-第十二章:政府再造流程

章节章节汇总第一章&#xff1a;绪论第二章&#xff1a;行政组织的演变第三章&#xff1a;科层制行政组织理论第四章&#xff1a;人本主义组织理论第五章&#xff1a;网络型组织理论第六章&#xff1a;行政组织目标第七章&#xff1a;行政组织结构第八章&#xff1a;行政组织体…

MarkdownEditor 配置以及使用

MarkdownEditor 配置以及使用 MarkdownEditor是一款基于浏览器的 Markdown 编辑器&#xff0c;虽然他是独立软件&#xff0c;但该软件内嵌一个浏览器。功能非常简单实用、反应速度很快&#xff0c;号称是Markdown领域的NotePad&#xff08;记事本&#xff09;。 MarkdownEdit…

港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长出席“2024科技新质生产力高峰论坛”&#xff0c;做了题为“三个创新&#xff1a;培育和发展新质生产力、贡献国家科技强国战略”的主题演讲。该论坛于9月2日在香港召开。论坛围绕夯实基础科研、推动源头创新、…

【VUE】Vue 项目基本开发结构介绍

&#x1f4dd;个人主页&#x1f339;&#xff1a;个人主页 ⏩收录专栏⏪&#xff1a;VUE &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339;&#xff0c;让我们共同进步&#xff01; 在 Vue 开发中&#xff0c;了解 Vue 项目的基本结构是进行 Vue 开发的基础…