GLSLマウス入力の正規化

fragment-shader glsl normalize
GLSLマウス入力の正規化

私はこのシェーダーの世界に新しくて、何か試してみたいだけです。 次のことを行います。+マウスを中心とした特定の半径で、背景のテクスチャが10°回転します。 マウス座標は絶対値であるため、それらを操作するには、それらを正規化する必要があるため、テクスチャ内の適切なスペースをアドレス指定できます。 しかし、どういうわけかこれは正しく機能しません。 回転は機能しますが、少しのオフセットで色情報を取得します。

問題は「ノーマライズ(マウス)」だと思いますが、これを正しく行う方法がわかりません。 シェーダーは次のとおりです。

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  1


ベストアンサー

マウスの絶対座標を[0,1]の範囲(テクスチャサンプルに必要)に変換するには、「normalize」関数は必要ありません。 シンプルなスケールが必要です:

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

GLSLで作成しましたが、ユニフォームを渡す前にCPU側で行う方が簡単です。元々は画面側の解像度を認識しているのはCPU側だからです。

4


タイトルとURLをコピーしました