序言

科赫(雪花)曲线是一个经典分形图案,来一起领略下分形之美。本篇内容用到一些基础的内容,例如UV的理解和画线技巧,有需要的话可以参考合集的画圆和画线两篇文章。

示例



shadertoy 代码:

#define T .01

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = (fragCoord.xy-0.5 * iResolution.xy) / iResolution.y;
vec3 col = vec3(0.);
float a = (4. / 6.) * 3.1415926;
vec2 n = vec2(sin(a), cos(a));
float s = 1.;
int t = int(sin(iTime) * 2. + 3.);
uv.x += .5;
uv.y += .25;
for (int i = 0; i < t; i++ )
{
s *= 3.;
uv *= 3.;
uv.x -= 1.5; uv.x = abs(uv.x);
uv.x -= 0.5; uv -= n * min(0., dot(uv, n)) * 2.;
} float d = length(uv - vec2(clamp(uv.x, -1., 1.), 0.));
col += smoothstep(T, .0, d/s);
fragColor = vec4(col, 1.);
}

注解

先简化一下问题--只考虑一次迭代



观察到上述代码有偏移和对称,其实我们只需要关心对称轴的一侧,来看图像的左半边的绘制



它大概的形状如上图中的绿色线所示,观察负半轴,负半轴绿色的线可以有紫色线沿着蓝色线为对称轴反转得到,之反转原理如下



(对应上述代码 uv -= n * min(0., dot(uv, n)) * 2.)

  • y 假设是对称轴
  • n 是y的法线(单位向量)
  • uv 是当前uv所在的位置

    则dot(uv, n) * n 是u',这里稍微解释下



    点乘的公式:dot(a, b) = |a||b|cosθ,a是单位向量,则dot(a, b) = |b|cosθ = |b'|,b'向量 = a * |b'|

    u'与b'同理

    易求得uv'' = -dot(uv, n) * n * 2.

    uv -= dot(uv, n) * n * 2. 即从原uv点移动到了uv''所指的位置,从而画出绿线

再考虑多次迭代,其实就是不断重复上述过程,迭代uv,实现自相似(分形),其他的都比较好理解,相信大家仔细看看都能明白就不赘述了。

shader编程经典:分形--科赫曲线的更多相关文章

  1. python画图——雪花(科赫曲线)

    科赫曲线是一种分形,其形态非常像雪花,因此又被称作科赫雪花.雪花曲线. 下面是用python的turtle包让我们来实时画一个 import turtledef koch(t,n): #定义一个函数 ...

  2. 海岸线、科赫曲线、turtle、递归

    本章绘图要点: turtle模块:python标准库自带的一个模块,可用来绘制二维图形.该模块封装了底层的数据处理逻辑,向外提供了更符合手工绘图习惯的接口函数,适用于绘制对质量.精度要求不高的图形. ...

  3. 科赫曲线和科赫雪花的绘制Python

    #KochDrawV1.pyimport turtledef koch(size,n): if n == 0: turtle.fd(size) else: for angle in [0,60,-12 ...

  4. 分形之科赫(Koch)雪花

    科赫曲线是一种分形.其形态似雪花,又称科赫雪花.雪花曲线.瑞典人科赫于1904年提出了著名的“雪花”曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边.分别向外 ...

  5. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  6. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  7. 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    [源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...

  8. Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合

    一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器 ...

  9. 《C# 并发编程 · 经典实例》读书笔记

    前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...

  10. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

随机推荐

  1. 还在stream中使用peek?不要被这些陷阱绊住了

    目录 简介 peek的定义和基本使用 peek的流式处理 Stream的懒执行策略 peek为什么只被推荐在debug中使用 peek和map的区别 总结 简介 自从JDK中引入了stream之后,仿 ...

  2. git初始化流程

    1. 添加 SSH key 一台主机仅需要设置一次 1.1 检查主机是否已经有 SSH key 只需要检查~/.ssh下是否存在 id_rsa.pub 或 id_dsa.pub.若已存在,跳转至步骤3 ...

  3. 制作一个同时具有PE和Windows原版安装方式的U盘

    这个方法可能很多人已经制作成功过了,但是呢,也有些人不会的,也可能没想到过,那就是让Win PE与Windows原版安装包在一个U盘里面同时共存. 需要用到的软件有这几样:DiskGenius.Gim ...

  4. .NET生成MongoDB中的主键ObjectId

    前言 因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务,像EF中我们可以生成Guid来,本来想着要不要实现一套MongoDB中ObjectId的,结 ...

  5. 循序渐进讲解负载均衡vivoGateway(VGW)

    作者:vivo 互联网运维团队- Duan Chengping 在大规模业务场景中,已经不可能通过单机提供业务,这就衍生出了负载均衡的需求.为了满足合适可靠的负载,本文将从简单的基础需求出发,一步步推 ...

  6. Laplace分布算子开发经验分享

    摘要:Laplace 用于 Laplace 分布的概率统计与随机采样. 本文分享自华为云社区<Laplace分布算子开发经验分享>,作者:李长安. 1.任务解析 详细描述: Laplace ...

  7. Go 语言切片是如何扩容的?

    原文链接: Go 语言切片是如何扩容的? 在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice). 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装.它非常灵活,支 ...

  8. LeeCode 713 乘积小于k的子数组

    LeeCode 713 题目描述: 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 标签: 双指针.滑动窗口 建立模型 枚举子数组的右端 ...

  9. golang常用库包:log日志记录-uber的Go日志库zap使用详解

    Go 日志记录库:uber-go 的日志操作库 zap 使用 一.简介 zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包. go1.20.2 zap v1.24.0 zap的特性 ...

  10. PHP创建SqlLite数据表并让ID自增

    <?php class MyDB extends SQLite3 { function __construct() { $this->open('test.db'); } } $db = ...