GLSL 标准化鼠标输入

发布于 2024-10-28 00:50:38 字数 989 浏览 4 评论 0原文

我是这个着色器世界的新手,只是想尝试一些东西。我想做以下事情:
在鼠标周围的特定半径内,背景中的纹理应旋转 10°。鼠标坐标是绝对值,因此要使用它们,我必须对它们进行标准化,以便我可以在纹理中找到正确的空间。但不知怎的,这并不正常。旋转有效,但我得到的颜色信息有一点偏移。

我认为问题在于 normalize(mouse) 但我不知道如何正确执行此操作。这是着色器:

uniform sampler2D tex0;
uniform vec2 mouse;

void main() {
    vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y);

    if (distance(pos, mouse) < 90.0) {
        vec2 p = gl_TexCoord[0].st;
        vec2 m = normalize(mouse);

        p.x = m.x + (cos(radians(10.0)) * (p.x - m.x) - sin(radians(10.0)) * (p.y - m.y));
        p.y = m.y + (sin(radians(10.0)) * (p.x - m.x) + cos(radians(10.0)) * (p.y - m.y));

        gl_FragColor = vec4(0.0, m.y, 0.0, 0.0);
        gl_FragColor = texture2D( tex0, p );
    }
    else {
        gl_FragColor.rgb = texture2D( tex0, gl_TexCoord[0].st ).rgb;
        gl_FragColor.a = 1.0;
    }
}

我正在使用 cinder 来执行此操作。

mShader.uniform( "mouse", Vec2f( m.x, 682 - m.y ) );

谢谢。

i'm new in this shader world and just want to try out something. I want to do the following:
In a specific radius around the mouse the texture in the background should rotate by 10°. The mouse coordinates are absolute values, so to work with them i have to normalize them, so i can adress the right space in the texture. But somehow this doesn't work right. The rotation works but i get the color information with a little offset.

I think the problem is the normalize(mouse)but i don't know how to do this right. Here is the shader:

uniform sampler2D tex0;
uniform vec2 mouse;

void main() {
    vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y);

    if (distance(pos, mouse) < 90.0) {
        vec2 p = gl_TexCoord[0].st;
        vec2 m = normalize(mouse);

        p.x = m.x + (cos(radians(10.0)) * (p.x - m.x) - sin(radians(10.0)) * (p.y - m.y));
        p.y = m.y + (sin(radians(10.0)) * (p.x - m.x) + cos(radians(10.0)) * (p.y - m.y));

        gl_FragColor = vec4(0.0, m.y, 0.0, 0.0);
        gl_FragColor = texture2D( tex0, p );
    }
    else {
        gl_FragColor.rgb = texture2D( tex0, gl_TexCoord[0].st ).rgb;
        gl_FragColor.a = 1.0;
    }
}

I'm using cinder to do this.

mShader.uniform( "mouse", Vec2f( m.x, 682 - m.y ) );

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜雨飘雪 2024-11-04 00:50:38

为了将绝对鼠标坐标转换为 [0,1] 范围(纹理样本所需),您不需要 normalize 函数。你需要一个简单的比例:

vec2 mouse_norm = vec2( m.x/screen.width, 1.0 - m.y/screen.height )

我用 GLSL 编写了它,但对你来说,在传递统一之前在 CPU 端完成会更容易,因为最初是 CPU 端知道屏幕分辨率。

In order transform absolute mouse coordinates into [0,1] range (required for a texture sample), you don't need normalize function. You need a simple scale:

vec2 mouse_norm = vec2( m.x/screen.width, 1.0 - m.y/screen.height )

I wrote it in GLSL, but for you it will be easier to do on CPU side before passing a uniform, because originally it's CPU side that is aware of the screen resolution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文