GLSL标准化鼠标输入

时间:2011-03-28 14:09:28

标签: glsl fragment-shader normalize

我是这个着色器世界的新手,只想尝试一些东西。我想做以下事项:
在鼠标周围的特定半径内,背景中的纹理应旋转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;
    }
}

我正在使用煤渣来做这件事。

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

谢谢。

1 个答案:

答案 0 :(得分:4)

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

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

我是用GLSL编写的,但是对于你来说,在传递制服之前在CPU端会更容易,因为最初它是CPU侧知道屏幕分辨率。