当前位置: 首页 > news >正文

shader 案例学习笔记之smoothstep函数

参考:smoothstep

用来生成0-1的平滑过渡值

smoothstep函数源码实现: 

float smoothstep(float t1, float t2, float x) {// Scale, bias and saturate x to 0..1 rangex = clamp((x - t1) / (t2 - t1), 0.0, 1.0); // Evaluate polynomialreturn x * x * (3 - 2 * x);
}

先理解clamp函数:

用于将一个值限制在给定的范围之内。其语法为clamp(x, minVal, maxVal),它接受三个参数:

  • x:要被限制的值。
  • minVal:范围的最小值。
  • maxVal:范围的最大值。
#ifdef GL_ES
precision mediump float;
#endifuniform vec2 u_resolution;
uniform float u_time;void main(){vec2 st = gl_FragCoord.xy/u_resolution.xy;st.x *= u_resolution.x/u_resolution.y;float maxValue = abs(sin(u_time)) * 0.5;float f = clamp(st.y, 0.0, maxValue);gl_FragColor = vec4(f,f,f, 1.0); 
}
  •  float maxValue = abs(sin(u_time));
    • sin(u_time)返回[-1,1]的值,abs(sin(u_time)) 取绝对值将该值限制在了[0,1],再乘以0.5返回[0,0.5]
  • float f = clamp(st.y, 0.0, maxValue);

    • maxValue的区间为[0,0.5]

    • clamp(st.y, 0.0, maxValue)将屏幕的Y值限制在[0,0.5]之间

x = clamp((x - t1) / (t2 - t1), 0.0, 1.0);

  • x的值被限制在0-1之间。
绘制圆环:
#ifdef GL_ES
precision mediump float;
#endifuniform vec2 u_resolution;void main(){vec2 st = gl_FragCoord.xy/u_resolution.xy;st -=0.5;st.x *= u_resolution.x/u_resolution.y;float r = length(st);float r1 = smoothstep(0.2,0.3 ,r );float r2 = smoothstep(0.3,0.4 ,r );float color = r1- r2;gl_FragColor = vec4(vec3(color),1.0);
}

r1-r2的函数图像 

绘制结果 

另一种实践
#ifdef GL_ES
precision mediump float;
#endifuniform vec2 u_resolution;float plot(vec2 st,float pct ){return  smoothstep( pct-0.02, pct, st.y) -
smoothstep( pct, pct+0.02, st.y);
}void main(){vec2 st = gl_FragCoord.xy/u_resolution;float y = step(0.5,st.x);vec3 color = vec3(y);float pct = plot(st,y);color = (1.0-pct) * color + pct * vec3(0.0,1.0,0.0);gl_FragColor = vec4(color,1.0);}

绘制结果

 

代码解析:

  •  vec2 st = gl_FragCoord.xy/u_resolution;
    • 坐标归一化,将屏幕坐标映射到[0,1]
  • float y = step(0.5,st.x);

    • step函数。根据st的x分量,当x大于等于0.5时,返回1.0,否则返回0.

    • 所以y的值只有两种:0或者1

  • vec3 color = vec3(y);  以y的值构建三维向量,那么color也只有两个情况:(1.0,1.0,1.0)或者(0.0,0.0,0,0)

    • 当st.x分量值小于0.5对应颜色为(0.0,0.0,0,0)

    • 当st.x分量值大于等于0.5对应颜色为(1.0,1.0,1.0)

    • 所以屏幕以0.5为分界线左侧是黑色,右侧为白色

  • float pct = plot(st,y);

  • float plot(vec2 st,float pct ){
    •   return  smoothstep( pct-0.02, pct, st.y) -

              smoothstep( pct, pct+0.02, st.y);

      }

    • 调用函数plot,plot接收两个参数,一个是二维向量st,另一个是浮点数pct。根据输入的参数计算并返回一个浮点数结果

    • 分析函数图像:

那么可以得出结论,当st.y接近pct(0或者1时),返回1.所以能看到st.y=0和st.y=1时,图像会高亮 

  • color = (1.0-pct) * color + pct * vec3(0.0,1.0,0.0);

    • pct * vec3(0.0,1.0,0.0) 是将原来的白色变成了绿色

    • (1.0-pct) * color 通过pct的值来影响原来的颜色,pct越大,影响越大

相关文章:

shader 案例学习笔记之smoothstep函数

参考:smoothstep 用来生成0-1的平滑过渡值 smoothstep函数源码实现: float smoothstep(float t1, float t2, float x) {// Scale, bias and saturate x to 0..1 rangex clamp((x - t1) / (t2 - t1), 0.0, 1.0); // Evaluate polynomialreturn x * x *…...

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己,而软件的根基是代码生成。代码生成第一波就是AI辅助开发,这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用,为什么会是辅助编程,这里说下什么: 必…...

不允许有程序员不知道这款AI代码扩写工具

01CodeGeeX编程大模型 在介绍什么是codeGeeX之前,先上图。 想象一下,自己写代码的时候旁边有个专家助手,随时跟你解释前面别人写的代码是什么意思,有什么缺陷。在你自己写的时候也可以每一步进行代码提示和代码扩写,是…...

java 的list集合排序自定义元素

在 Java 中,可以对包含自定义元素的List集合进行排序。通常可以使用Collections.sort()方法结合自定义的比较器来实现。 一、定义包含自定义元素的类 假设我们有一个表示学生的类Student: class Student {private int id;private String name;private …...

【数学建模】2024数学建模国赛经验分享

文章目录 一、关于我二、我的数模历程三、经验总结: 一、关于我 我的CSDN主页:https://gxdxyl.blog.csdn.net/ 2020年7月(大二结束的暑假)开始在CSDN写作: 阿里云博客专家: 接触的领域挺多的&#xff…...

Scala尾递归解决爆栈问题

引言 我在上篇中详细的讲了递归的一系列问题,多路递归,爆栈问题,尾递归优化等,今天就实际演示一下尾递归是如何解决爆栈问题的,以及它的原理是什么? 支持尾递归优化的语言 尾递归是一种特殊的递归形式,如果…...

【观察者】设计模式:构建灵活且响应式的软件系统

引言 在软件开发中,我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时,我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式,它定义…...

开源网安斩获CCIA中国网络安全创新创业大赛总决赛三等奖

近日,由中央网信办指导,中国网络安全产业联盟(CCIA)主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…...

进程的同步与互斥

目录 一、进程同步 二、进程互斥 1.临界资源访问代码: ①进入区 ②临界区 ③退出区 ④剩余区 注: 2.互斥准则: ①.空闲让进。 ②.忙则等待。 ③.有限等待。 ④.让权等待。 三、进程互斥的软件实现方法 1.单标志法 2.双标志先…...

基础的八股

JS this 全局:this指向window 函数:this指向window 对象:this指向调用它的 get、post的区别 1、写的地方不同:get在地址栏里 地址栏有多长就只能写多少、post在请求体里 没有上限 2、关于回退和刷新:get回退和刷新没问…...

使用Python从头开始创建PowerPoint演示文稿

目录 一、环境搭建与基础知识 1.1 环境搭建 1.2 基础知识 二、创建演示文稿对象 三、添加幻灯片 3.1 选择幻灯片布局 3.2 设置幻灯片内容 3.2.1 设置标题和副标题 3.2.2 添加文本内容 3.2.3 插入图片 3.2.4 插入图表 四、高级应用:批量生成演示文稿 4.…...

【C++ Primer Plus习题】15.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "sales.h"…...

Pipeline Scheduling(UVA 690)

网址如下&#xff1a; Pipeline Scheduling - UVA 690 - Virtual Judge (vjudge.net) &#xff08;第三方网站&#xff09; 噫&#xff0c;好&#xff01;我中了&#xff01; 这题还是有点折磨的&#xff0c;刚开始我只会递归下一个程序运行的时间&#xff08;范围在1~n&…...

萤石举办2024清洁机器人新品发布会 多维智能再造行业标杆

导言&#xff1a;作为智慧生活守护者&#xff0c;萤石今日发布了两款清洁机器人&#xff0c;AI扫拖机器人RS20 Pro Ultra 和AI洗地机器人RX30 Max &#xff0c;标志着萤石在智能清洁领域的全新突破。RS20 Pro Ultra基于CutFree 2.0内切割滚刷专利&#xff0c;有效解决毛发缠绕难…...

企业级Ansible自动化运维项目案例:实战与技巧

在企业级的IT运维中&#xff0c;自动化已成为提高效率、减少人为错误和保证服务一致性的关键手段。Ansible作为一种简单但功能强大的自动化工具&#xff0c;广泛应用于配置管理、应用程序部署、任务自动化和IT编排。本文将通过一个企业级的Ansible自动化运维项目案例&#xff0…...

JavaSE-易错题集-005

1. 下面有关java object默认的基本方法&#xff0c;说法错误的是&#xff1f; A equals(Object obj) 指示某个其他对象是否与此对象“相等” B copy() 创建并返回此对象的一个副本 C wait() 导致当前的线程等待&#xff0c;直到其他线程调用此对象的 notify() 方法或 notifyA…...

决策树模型的可解释性

我们首先介绍一下一个比较简单的机器学习模型&#xff0c;其在设计之初就已经有了比较好的可 解释性&#xff0c;这个模型就是决策树模型。决策树相较于线性的模型&#xff0c;它是更强大的模型。而决策树 的另外一个好处&#xff0c;相较于深度学习它具有良好的可解释性。比如…...

2. geoserver 发布postgis数据

1. 新建工作空间 2. 新建存储空间 3. 新建图层 4. 切片图层 5. 查看发布的图层...

【渗透测试】——Brup Suite平台安装

&#x1f4d6; 前言&#xff1a;Burp Suite 是用于攻击 web 应用程序的集成平台。它包含了许多Burp工具&#xff0c;这些不同的burp工具通过协同工作&#xff0c;有效的分享信息&#xff0c;支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击。 它主要用来做安全性…...

redis:全局ID生成器实现

问题&#xff1a;订单id不能设置为自增长的原因 id的规律性太明显&#xff0c; 受订单的数据量限制:若数据量过大&#xff0c;需要多张表存储&#xff0c;若自增会导致id重复 全局ID生成器&#xff1a;在分布式系统中用来生成全局唯一ID的工具 ID的组成&#xff1a; 符号位…...

5步告别Windows卡顿:Win11Debloat系统优化工具让电脑性能提升51%的实战指南

5步告别Windows卡顿&#xff1a;Win11Debloat系统优化工具让电脑性能提升51%的实战指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各…...

探索:空间网格编码SpatialGridCoding在北斗导航与地理实体管理中的应用

1. 空间网格编码&#xff1a;北斗导航的"数字身份证" 想象一下&#xff0c;当你打开手机导航时&#xff0c;系统如何快速锁定你的位置并规划路线&#xff1f;这背后离不开空间网格编码技术的支持。简单来说&#xff0c;空间网格编码就像给地球表面贴满二维码&#xf…...

联想M920x黑苹果终极指南:从零构建完美macOS系统

联想M920x黑苹果终极指南&#xff1a;从零构建完美macOS系统 【免费下载链接】M920x-Hackintosh-EFI Hackintosh Opencore EFIs for M920x 项目地址: https://gitcode.com/gh_mirrors/m9/M920x-Hackintosh-EFI 你是否想让联想M920x这款紧凑型主机运行macOS系统&#xff…...

别再瞎装了!用NVIDIA-SMI一键查CUDA版本,保姆级PyTorch 2.6.0安装避坑指南

深度学习环境搭建实战&#xff1a;从CUDA版本诊断到PyTorch 2.6.0完美安装 刚接触深度学习的新手最常遇到的"入门杀"问题&#xff0c;往往不是模型调参或代码编写&#xff0c;而是环境搭建这个看似简单的环节。我见过太多人在安装PyTorch时直接复制粘贴网上的pip命令…...

Workbench与Ls-Dyna中位移与远程位移设置的关键字映射解析

1. 固定支撑的关键字映射与实战配置 在有限元分析中&#xff0c;固定支撑是最基础的边界条件之一。Workbench和Ls-Dyna对固定支撑的实现逻辑完全不同&#xff0c;但最终达到的约束效果是等效的。先看Workbench端的操作&#xff1a;在Mechanical界面右键选择Ls-Dyna环境&#xf…...

Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南

Uvicorn与Couchbase Analytics Service集成&#xff1a;构建高性能数据分析API的终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn 在现代数据驱动的应用开发中&#xff0c;…...

Obsidian Local Images Plus 终极指南:如何一键解决所有本地图片管理难题

Obsidian Local Images Plus 终极指南&#xff1a;如何一键解决所有本地图片管理难题 【免费下载链接】obsidian-local-images-plus This repo is a reincarnation of obsidian-local-images plugin which main aim was downloading images in md notes to local storage. 项…...

Leather Dress Collection惊艳效果:Leather_Romper皮连体衣+户外场景自然光渲染

Leather Dress Collection惊艳效果&#xff1a;Leather_Romper皮连体衣户外场景自然光渲染 1. 项目介绍 Leather Dress Collection 是一个基于Stable Diffusion 1.5的LoRA模型集合&#xff0c;专门用于生成各种皮革服装风格的图像。这个系列由Stable Yogi开发&#xff0c;包含…...

别再ping IP了!手把手教你给ZeroTier虚拟网络里的设备起个‘好记’的名字(DNS/mDNS实战)

告别IP记忆困扰&#xff1a;ZeroTier网络中的智能命名方案实战指南 每次在ZeroTier虚拟网络中访问设备时&#xff0c;你是否也厌倦了反复查看和输入那串冗长的IP地址&#xff1f;想象一下&#xff0c;当你想连接家庭NAS时&#xff0c;只需输入nas.home就能立即访问&#xff0c…...

别再手动改配置了!用Flutter的--dart-define实现开发/测试/生产环境一键切换

Flutter多环境配置实战&#xff1a;用--dart-define打造全链路自动化工作流 每次切换环境都要手动修改十几个配置项&#xff1f;还在为不同环境的API地址、应用图标和包名管理头疼&#xff1f;是时候告别这种低效的开发方式了。作为一位经历过无数个深夜调试环境的Flutter开发者…...