You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GLSL矩形旋转着色器修改为实现中心点旋转的椭圆

GLSL椭圆旋转效果实现方案

核心问题解答

你应该对整体坐标执行旋转变换,而非对半径参数乘旋转矩阵,理由如下:

  • 旋转矩阵mat2是作用于二维坐标向量的变换算子,半径r.x/r.y是标量,直接和矩阵相乘不符合数学逻辑
  • 先变换坐标系再绘制轴对齐的椭圆,最终呈现的效果就是椭圆围绕中心点旋转,实现逻辑更简洁,计算成本也更低

调整后完整代码

const float PI = 3.14159265359;

mat2 rotate2d (float _angle) {
    return mat2 (cos (_angle), -sin (_angle),
                sin (_angle), cos (_angle));
}

void main (void) {
    // 标准化坐标,中心点为(0,0)
    vec2 st = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
    // 先对坐标做旋转变换
    st = rotate2d(sin(time) * PI) * st;
    
    // 椭圆参数设置
    vec2 center = vec2(0.0, 0.0); // 椭圆中心点
    vec2 radius = vec2(0.4, 0.2); // 椭圆水平、垂直半径,可按需调整大小
    // 计算椭圆有向距离
    float d = length((st - center) / radius) - 1.0;
    // 阈值处理得到硬边缘
    float shape = step(0.0, 1.0 - abs(ceil(d)));
    
    vec3 color = vec3(shape);
    gl_FragColor = vec4(color, 1.0);
}

代码修改说明

  • 保留了原有rotate2d旋转函数和坐标标准化、旋转变换的逻辑
  • 移除了原有矩形的距离计算代码,替换为椭圆的SDF(有向距离场)计算逻辑
  • 半径参数radius可按需调整,修改数值即可改变椭圆的大小和长宽比
  • 如果你需要椭圆边缘有抗锯齿效果,可以把step(0.0, 1.0 - abs(ceil(d)))替换为1.0 - smoothstep(0.0, 0.02, d)

内容的提问来源于stack exchange,提问作者x001017

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:36:02