当前位置: 首页 > 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; 符号位…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...