GLSL нормализует ввод мыши - PullRequest
1 голос
/ 28 марта 2011

Я новичок в этом мире шейдеров и просто хочу попробовать что-нибудь.Я хочу сделать следующее:
В определенном радиусе вокруг мыши текстура на заднем плане должна повернуться на 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 ) );

Спасибо.

1 Ответ

4 голосов
/ 28 марта 2011

Чтобы преобразовать абсолютные координаты мыши в диапазон [0,1] (требуется для образца текстуры), вам не нужна функция normalize.Вам нужна простая шкала:

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

Я написал это в GLSL, но для вас будет проще сделать это на стороне процессора, прежде чем сдавать униформу, потому что изначально это сторона процессора, которая знает о разрешении экрана.

...