ABS - Rhomb

Task

Write a shader that draws the full screen rhombus.
编写一个绘制全屏菱形的着色器

Requirements

The shader should avoid using branching or conditional statements in its code, and instead rely on the abs and step functions to determine the color of each pixel.
着色器应避免在其代码中使用分支或条件语句,而是依赖 absstep函数来确定每个像素的颜色。

Theory

曼哈顿距离:菱形的数学本质

我们通过abs将所有象限的坐标折叠到第一象限,折叠后坐标的 xy 分量相加:

glsl 复制代码
float d = abs_st.x + abs_st.y;
// 或者写成 float d = abs(st.x) + abs(st.y);

这个 d 值代表什么?它在数学上有一个响亮的名字:曼哈顿距离(Manhattan Distance) ,也叫 L1 范数。它表示从原点 (0,0) 到点 (x,y) 只允许沿着坐标轴方向移动所需的最短距离。

现在,我们来分析这个 d 值:

  • 在画布中心 (0,0)d = 0
  • 随着点向外移动,d 值线性增加。
  • 所有满足 abs(st.x) + abs(st.y) = C(C为常数)的点,构成了一个等值线。

C = 0.5 时,这条等值线正好是连接 (0.5, 0), (0, 0.5), (-0.5, 0), (0, -0.5) 四个点的正菱形!

其它:

  • 正方形 (L∞ 范数/切比雪夫距离): d = max(abs(st.x), abs(st.y));
  • 圆形 (L2 范数/欧几里得距离): d = length(st);d = sqrt(st.x*st.x + st.y*st.y);

Answer

glsl 复制代码
uniform vec2 iResolution;

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;
  uv -= 0.5; // 坐标中心化 将坐标从 [0, 1] 映射到 [-0.5, 0.5]

  float t = abs(uv.x) + abs(uv.y);
  t = 1.0 - step(0.5, t);

  gl_FragColor = vec4(t, 0.0, 0.0, 1.0);
}

效果

练习

## ABS - Rhomb

最后

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

相关推荐
Luna-player36 分钟前
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本,解决方法
前端·npm·node.js
悢七37 分钟前
windows npm打包无问题,但linux npm打包后部分样式缺失
linux·前端·npm
Felicity_Gao1 小时前
uni-app App升级功能实现
前端·学习·uni-app
CS Beginner1 小时前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
老程序员刘飞2 小时前
node.js 和npm 搭建项目基本流程
前端·npm·node.js
歪歪1003 小时前
在C#中除了按属性排序,集合可视化器还有哪些辅助筛选的方法?
开发语言·前端·ide·c#·visual studio
wangbing11253 小时前
开发指南139-VUE里的高级糖块
前端·javascript·vue.js
半桶水专家3 小时前
Vue 3 动态组件详解
前端·javascript·vue.js
csj503 小时前
前端基础之《React(6)—webpack简介-图片模块处理》
前端·react
我有一棵树3 小时前
避免 JS 报错阻塞 Vue 组件渲染:以 window.jsbridge 和 el-tooltip 为例
前端·javascript·vue.js