【问题标题】:Draw a circle at cursor position using fragment shader on a non square canvas在非方形画布上使用片段着色器在光标位置绘制一个圆圈
【发布时间】:2018-10-04 15:02:12
【问题描述】:

我刚刚开始使用着色器,并且无法根据光标位置绘制圆而不显示为椭圆。

我正在使用以下片段着色器(通过 Shadertoy):

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 st = fragCoord.xy/iResolution.xy;

    float m_x = iMouse.x / iResolution.x;
    float m_y = iMouse.y / iResolution.y;

    vec3 m_color = vec3(1.0);

    float mouse_pct = distance(vec2(m_x, m_y), st);
    mouse_pct = step(0.01, mouse_pct);
    m_color = vec3(mouse_pct);


    fragColor = vec4(m_color, 1.0);
}

我可以通过添加使椭圆变成一个圆圈:

st.x *= iResolution.x/iResolution.y;

但是,这会导致在 X 轴上的错误位置绘制圆(这也不是正确的做法)。我想我通常对如何绘制不基于整个画布的形状感到困惑,并且不确定我应该寻找什么来填补我的理解空白。

Shadertoy link - 你需要点击并拖动来改变鼠标位置。

【问题讨论】:

  • 为什么首先要按分辨率划分?使用像素坐标似乎要简单得多。
  • @riv 老实说,因为那是在着色器手册中所做的,这是我正在学习的,所以我只知道这种方法。不过,这是一个很好的观点......我可能会使用绝对像素坐标重写它,看看我是否觉得更直观。

标签: glsl webgl shader fragment-shader


【解决方案1】:

您必须尊重片段点向量与圆心的纵横比:

vec2 dist = vec2(m_x, m_y) - st.xy;
dist.x *= iResolution.x/iResolution.y;

以某种方式更改您的代码:

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 st = fragCoord.xy/iResolution.xy;

    vec2 dist = iMouse/iResolution - st.xy;
    dist.x *= iResolution.x/iResolution.y;

    float mouse_pct = length(dist);

    mouse_pct = step(0.3, mouse_pct);
    vec3 m_color = vec3(mouse_pct);
    fragColor = vec4(m_color, 1.0);
}

【讨论】:

  • 这行得通 :) - 我还在琢磨它,但它现在可以工作了,所以谢谢!我敢肯定,当我更多地使用它时,它会更有意义:p
猜你喜欢
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
相关资源
最近更新 更多