ShaderToy学习笔记 02.圆

1. 画圆

1.1. 圆的方程

圆的方程是:(x^2 + y^2 = r^2),其中(r)是圆的半径。
我们可以使用 desmos 来验证一下。
输入 x^2 + y^2 -1=0,即可得到圆。
类似下图

1.2. 画圆的方式

  1. 画圆:使用圆的方程,判断每个像素点是否在圆内,在圆内则为白色,否则为黑色。
  2. 画圆:使用圆的方程,判断每个像素点到圆心的距离是否小于半径,小于半径则为白色,否则为黑色。

目前我们在画圆时,先设定圆心在屏幕的中心(0,0)。
这样的好处是 length(uv) 可以直接计算出像素点到圆心的距离。

1.3. 方式1 画圆

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)//vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xy;vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;//    vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);//取x和y的最小值作为比例float c=0.;//默认黑色float r=0.3;//圆的半径if( length(uv) < r )//矢量长度小于半径,就为白色c=1.;// Output to screenfragColor = vec4(vec3(c),1.0);
}

注意:

1.4. 方式2 画圆

如果代码是如下形式,那么圆会变成椭圆,因为x和y的比例不一样

vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xy;

1.5. 方式3 画圆


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;//    vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);//取x和y的最小值作为比例float c=0.;//默认黑色float r=0.5;//圆的半径c=1.-step(0.,length(uv)-r);// Output to screenfragColor = vec4(vec3(c),1.0);
}

注意:

  1. 在fragment shader中,尽量不要用if 语句,因为if语句会降低性能

1.6. 方式4 画圆(平滑 smoothstep)


可以看到边缘的30个像素是平滑过渡的

#define PIXW (1./iResolution.y)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/iResolution.xx;float r=0.3;float c=smoothstep(0.,0.+30.*PIXW,length(uv)-r);// Output to screenfragColor = vec4(vec3(c),1.0);
}

1.7. 极坐标系

极坐标系是一种二维坐标系统,它用以确定平面上点的位置。与常用的笛卡尔坐标系不同,极坐标系使用一个距离和一个角度来描述点的位置。

在极坐标系中,每个点的位置由两个数值定义:

  1. 径向坐标(r):也称为极径,是从原点(也称为极点)到该点的直线距离。
  2. 角坐标(θ):也称为极角或方位角,是指从固定的参考方向(通常是正x轴)到通过原点和该点的线段之间所夹的角度。角坐标通常以弧度或度为单位。

因此,在极坐标系中,一个点的位置表示为 (P(r, \theta))。

极坐标系特别适用于那些具有圆形对称性的问题,例如物理学中的圆周运动、工程学中的旋转机械设计、以及数学中的某些类型的方程和图形等。转换公式如下:

  • 从极坐标到笛卡尔坐标的转换:

    • (x = r \cdot \cos(\theta))
    • (y = r \cdot \sin(\theta))
  • 从笛卡尔坐标到极坐标的转换:

    • (r = \sqrt{x^2 + y^2})
    • (\theta = \arctan2(y, x)),这里(\arctan2)函数用于根据x和y的值正确地确定角度,即使在x或y为零的情况下也能返回正确的象限。

在计算机图形学、图像处理以及游戏开发等领域,理解如何在不同坐标系之间转换是非常有用的,尤其是在需要实现基于角度和距离的计算时,如光线追踪、物理模拟、用户界面设计等。

运行效果

#define PIXW (1./iResolution.y)
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{vec2 uv=(fragCoord.xy-.5*iResolution.xy)*PIXW;vec4 O=vec4(smoothstep(0.+10.*PIXW,0.,length(uv)-0.5));uv=vec2(length(uv),atan(-uv.y,-uv.x));//polar systemfragColor=mix(vec4(0),O,uv.y/6.28+.5);}

1.8. 参考资料

  1. shadertoy入门手册1-掌控画布

2. 移动圆

2.1. 圆的方程

圆的方程是:((x-offsetX)^2 + (y-offsetY)^2 = r^2),其中(r)是圆的半径。
我们可以使用 desmos 来验证一下。
((x-1)^2 + (y-1)^2 -1=0)
类似下图

2.2. 思路

  1. 将uv坐标转换成圆心坐标 (x,y) = (uv.x-offsetX,uv.y-offsetY)
  2. 计算 (x,y) 到圆心的距离 d
  3. 如果 d 小于半径 r,则为白色,否则为黑色。

2.3. 将圆心移动到(0.3,0.3)

#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(1.);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.3,0.3));// Output to screenfragColor = vec4(vec3(c),1.0);
}

2.4. 让圆动起来

思路:

  1. 让圆的圆心坐标随着时间变化
  2. 让圆的颜色随着时间变化
#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(abs(sin(iTime*0.3)),abs(cos(iTime*0.3)),abs(sin(iTime*0.3)));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.+sin(iTime)*0.2,0.+cos(iTime)*0.2));// Output to screenfragColor = vec4(vec3(c),1.0);
}

2.5. 画两个圆

思路:

  1. 背景为黑色,即vec(0.,0.,0.)
  2. 圆为非黑色
  3. 两个圆的颜色相加,由于这两个圆没有重叠,所以颜色相加后,刚好会显示出两个圆

注: 这种方法,只适用于两个圆没有重叠且背景色为黑色这种简单情况。后续会说明更通用的方法。

//显示两个圆
#define PIXW (1./iResolution.y)vec3 sdfCircle(vec2 uv, float r,vec2 offset)
{uv=uv-offset;float d=length(uv)-r;return d>0.?vec3(0.):vec3(abs(sin(iTime*0.3)),abs(cos(iTime*0.3)),abs(sin(iTime*0.3)));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{// Normalized pixel coordinates (from -1 to 1)vec2 uv = (2.0*fragCoord-iResolution.xy)/min(iResolution.x,iResolution.y);float r=0.3;vec3 c=sdfCircle(uv,r,vec2(0.5,0.5));c=c+sdfCircle(uv,r,vec2(-0.5,0.5));//c=max(c,sdfCircle(uv,r,vec2(-0.5,0.5)));// Output to screenfragColor = vec4(vec3(c),1.0);
}

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

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

相关文章

一文详解卷积神经网络中的卷积层和池化层原理 !!

文章目录 前言 一、卷积核大小&#xff08;Kernel Size&#xff09; 1. 卷积核大小的作用 2. 常见的卷积核大小 3. 选择卷积核大小的原则 二、步长&#xff08;Stride&#xff09; 1. Stride的作用 三、填充&#xff08;Padding&#xff09; 1. 填充的作用 四、通道数&#xff…

云+AI双轮驱动,亚马逊云科技加速中国企业出海新浪潮

导读&#xff1a;全球化就是本地化 作者 | 小葳 图片来源 | 摄图 近年来&#xff0c;中国企业出海步伐不断加快&#xff0c;“不出海&#xff0c;就出局”成为很多企业的共识。 据沙利文统计&#xff0c;2024年上半年&#xff0c;超过2000家中国上市企业布局海外市场&#xff…

C语言HashTable基本理解

文章目录 一、哈希表概念1. 哈希表的基本概念2. 哈希表的核心组件2.1 哈希函数2.2 冲突处理&#xff08;哈希碰撞&#xff09; 3.哈希表的三种结构(1) 数组作为哈希表示例&#xff1a; 2. Set&#xff08;集合&#xff09;示例&#xff1a;查找数组中的重复元素1. Set 基础概念…

【缓存与数据库结合最终方案】伪从技术

实现伪从技术&#xff1a;基于Binlog的Following表变更监听与缓存更新 技术方案概述 要实现一个专门消费者服务作为Following表的伪从&#xff0c;订阅binlog并在数据变更时更新缓存&#xff0c;可以采用以下技术方案&#xff1a; 主要组件 MySQL Binlog监听&#xff1a;使…

《100天精通Python——基础篇 2025 第3天:变量与数据类型全面解析,掌握Python核心语法》

目录 一、Python变量的定义和使用二、Python整数类型&#xff08;int&#xff09;详解三、Python小数/浮点数&#xff08;float&#xff09;类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…

【前后端分离项目】Vue+Springboot+MySQL

文章目录 1.安装 Node.js2.配置 Node.js 环境3.安装 Node.js 国内镜像4.创建 Vue 项目5.运行 Vue 项目6.访问 Vue 项目7.创建 Spring Boot 项目8.运行 Spring Boot 项目9.访问 Spring Boot 项目10.实现 Vue 与 Spring Boot 联动11.安装 axios12.编写请求13.调用函数请求接口14.…

线性代数(一些别的应该关注的点)

一、矩阵 矩阵运算&#xff1a;线性变换 缩放、平移、旋转 无所不能的矩阵 - 三维图形变换_哔哩哔哩_bilibili

01Redis快速入门(nosql、安装redis、客户端、命令及类型、java客户端、序列化)

Redis的常见命令和客户端使用 1.初识Redis Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型 NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样&#xff0c;可以是字符串…

AI编程:[体验]从 0 到 1 开发一个项目的初体验

一、开发信息 开发时间&#xff1a;1.5-2天工具使用&#xff1a; 不熟练&#xff0c;开发本项目前1天&#xff0c;才简单使用了Cursor的功能 功能复杂度&#xff1a; 开发的功能相对简单。页面&#xff1a;2个&#xff0c;登录页面&#xff0c;个人中心页面功能&#xff1a;5个…

LeetCode-392 判断子序列

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&#…

Linux 系统监控大师:Glances 工具详解助力自动化

看图猜诗&#xff0c;你有任何想法都可以在评论区留言哦~ 摘要 Glances 是一款基于 Python 开发的跨平台系统监控工具&#xff0c;集成了 CPU、内存、磁盘、网络、进程等核心指标的实时监控能力&#xff0c;并支持命令行、Web界面、客户端-服务器模式等多种使用场景。其轻量级…

Spring Boot 3.4.5 运行环境需求

&#x1f4dd; Spring Boot 3.4.5 运行环境要求 &#x1f33f; 1️⃣ 基本需求 ☑️ JDK版本&#xff1a;最低 Java 17 &#x1f517; https://www.java.com/ 最高兼容至 Java 24 ☑️ 依赖框架&#xff1a;需搭配 Spring Framework 6.2.6 &#x1f517; https://docs.sprin…

在KEIL里C51和MDK兼容以及添加ARM compiler5 version编译器

前言 我们想在一个keil里面可以打开32和51的文件&#xff0c;这样就不需要两个keil了 还有就是现在的keil&#xff0c;比如我用的是5.41的&#xff0c;就没有5版本的处理器&#xff0c;所以要安装 本篇文章我们来详细讲解如何实现上面说的两个内容 准备的东西 1.ARM5编译器 …

Flutter 弹窗队列管理:支持优先级的线程安全通用弹窗队列系统

在复杂的 Flutter 应用开发中&#xff0c;弹窗管理是一个常见难题。手动管理弹窗的显示顺序和条件判断不仅繁琐&#xff0c;还容易出错。为此&#xff0c;我们实现了一个支持优先级的线程安全通用弹窗队列管理系统。它能够自动管理弹窗的显示顺序&#xff0c;支持条件判断&…

鸿蒙NEXT开发剪贴板工具类(ArkTs)

import { pasteboard } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 剪贴板工具类* 需要权限&#xff1a;* ohos.permission.READ_PASTEBOARD // 允许应用读取剪贴板。* author CSDN-鸿蒙布道师* since 2025/04/25*/ export class PasteboardUtil {…

FastAPI 零基础入门指南:10 分钟搭建高性能 API

一、为什么选择 FastAPI&#xff1f; 想象一下&#xff0c;用 Python 写 API 可以像搭积木一样简单&#xff0c;同时还能拥有媲美 Go 语言的性能&#xff0c;这个框架凭借三大核心优势迅速风靡全球&#xff1a; 开发效率提升 3 倍&#xff1a;类型注解 自动文档&#xff0c;…

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思&#xff0c;假设有下面的一块田地&#xff0c;负数代表是凹地&#xff0c;正数代表是凸地&#xff0c;数字的大小表示凹或者凸的程度。现在下一场大雨&…

代码随想录算法训练营第三十七天|动态规划part4

1049. 最后一块石头的重量 II 题目链接&#xff1a; 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a; 代码随想录 思路&#xff1a; 理解为把石头分成两堆 使得两堆的差值尽可能小 求这个最小值1 理解为往背包里装物品 每个物品的…

(八)深入了解AVFoundation-采集:拍照功能的实现

引言 在上一篇文章中&#xff0c;我们初步完成了使用 AVFoundation 采集视频数据的流程&#xff0c;掌握了 AVCaptureSession 的搭建与视频流的预览显示。 本篇将继续深入 AVFoundation&#xff0c;聚焦于静态图片采集的实现。通过 AVCapturePhotoOutput&#xff0c;我们可以…

git tag使用场景和实践

背景 每次上线一个迭代&#xff0c;为了区分本次代码的分支是哪个迭代的commit&#xff0c;可以给分支打上tag&#xff0c;这样利于追踪分支所属迭代&#xff0c;如果devops没有自动给分支打tag&#xff0c;需要自己来打 操作 1.查看当前tag git tag2.给分支打tag git tag…