Sin -- 重复的、流动的波浪

Task

Draw an image with 5 sinusoidal waves coming out from the center of the screen. The waves should be based on the distance from each pixel to the center. Adjust the sine values to a range from 0 to 1, and use these values to control the brightness of the red color. This will create a repeating pattern of peaks and troughs of the waves. Use 3.14 as the approximate value for π.
绘制一幅图像,其中有5个正弦波从屏幕中心向外扩散。波形应基于每个像素点到中心的距离。将正弦值调整到0到1的范围内,并用这些值来控制红色的亮度。

Theory

函数介绍

  • sin(x): 正弦函数,*输入一个线性增长的值,输出一个在 [-1, 1] 区间内平滑振荡的值

任务拆解

1. 实现一个完整的圆周

  • 在弧度制中,一个完整的圆周2 * π,正弦函数 sin(x) 的一个完整周期恰好对应一个完整的圆周
  • uv.x 的值从屏幕的左边缘 (0.0) 线性增长到右边缘 (1.0) ,对应sin(x)[0, 1]也就是弧度的[0,π],正好是半圆。因此完整的圆为sin(x * 2.0 * π)
  • 而颜色的范围也在[0,1]之间,所以需要把sin(x)[-1, 1]转换到[0, 1]之间
ini 复制代码
// 最终的一个完整圆的代码为
float wave = sin(uv.x * 2.0 * PI);
float normalized_wave = wave * 0.5 + 0.5;

2. 增加频率

  • 增加频率也就意味着sin(x)出现了多个圆,可以通过控制x的变化来实现
ini 复制代码
float frequency = 10.0;
float wave = sin((uv.x * 2.0 * PI) * frequency );

3.实现圆控制

  • 使用length或者distance来控制圆的绘制

Answer

glsl 复制代码
uniform vec2 iResolution;

#define PI 3.14

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;

  vec2 ratio = vec2(iResolution.x / iResolution.y, 1.0);
  uv -= 0.5;
  uv *= ratio;
  float wave = sin(length(uv) * 2.0 * PI * 5.0 ); 
  float normalized_wave = wave * 0.5 + 0.5;
  gl_FragColor = vec4(vec3(normalized_wave, 0, 0), 1.0);
}

效果

练习

Sin

最后

如果你觉得这篇文章有用,记得点赞、关注、收藏,学Shader更轻松!!

相关推荐
郭老二5 小时前
【前端】vue3:编译步骤
前端
不在逃避q6 小时前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁6 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9856 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易6 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师7 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174468 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈8 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen9 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒9 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端