Atan--着色器中的角度计算

Task

Create a gradient that transitions from red to green. The weight of each pixel should be determined by the angle between the center-to-pixel ray and the x-axis. Limit the gradient to a circular area with a diameter equal to the height of the texture.
创建一个从红色到绿色的渐变。每个像素的权重应该由从中心到像素的射线与x轴之间的角度来确定。将渐变限制在直径等于纹理高度的圆形区域内。

Theory

函数介绍

atan(y_over_x) :接受一个浮点数,即 y 坐标除以 x 坐标的比值

它的返回值被限制在 [-π/2, π/2](-90° 到 90°)的范围内

atan(y, x): 接受两个参数

atan(y, x) 能够准确判断出点所在的象限,并返回一个覆盖 [-π, π](-180° 到 180°)完整圆周的角度(以弧度为单位)

任务解析

坐标中心化

ini 复制代码
//坐标中心化
uv -= 0.5;

计算角度

scss 复制代码
float angle = atan(uv.y, uv.x); // angle 范围[-π, π]

把弧度转换到[0-1]

scss 复制代码
float angle = abs(angle / 3.14); // angle [-π, π] / π

限制范围半径为0.5的圆

scss 复制代码
float dist = length(uv);
float color = step(0.5, dist);

Answer

glsl 复制代码
uniform vec2 iResolution;

#define PI 3.14159265359

void main() {
  vec2 uv = gl_FragCoord.xy / iResolution.xy;
  //坐标中心化
  uv -= 0.5;
  
  vec2 ratio = vec2(iResolution.x / iResolution.y, 1.0);
  uv *= ratio;

  float angle = atan(uv.y, uv.x) ; 
  float normalized_angle = abs(angle / PI);

  vec3 color1 = vec3(1.0, 0.0, 0.0);
  vec3 color2 = vec3(0.0, 1.0, 0.0);
 
  vec3 color = mix(color1, color2, normalized_angle);
  float dist = length(uv);
  color -= step(0.5, dist);

  gl_FragColor = vec4(color, 1.0);
}

效果

练习

Atan

最后

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

相关推荐
Cache技术分享7 分钟前
290. Java Stream API - 从文本文件的行创建 Stream
前端·后端
陈_杨9 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片开发完全指南
前端·harmonyos
小杨同学4916 分钟前
C 语言实战:枚举类型实现数字转星期(输入 1~7 对应星期几)
前端·后端
陈_杨17 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片刷新机制
前端·harmonyos
go_caipu24 分钟前
Vben Admin管理系统集成qiankun微服务(二)
前端·javascript
唐叔在学习28 分钟前
insertAdjacentHTML踩坑实录:AI没搞定的问题,我给搞定啦
前端·javascript·html
超绝大帅哥28 分钟前
Promise为什么比回调函数更好
前端
幸福小宝28 分钟前
uniapp 异型无缝轮播图
前端
wordbaby31 分钟前
TanStack Router 实战: 如何设置基础认证和受保护路由
前端
智算菩萨34 分钟前
Anthropic Claude 4.5:AI分层编排的革命,成本、速度与能力的新平衡
前端·人工智能