2011-03-28 7 views
1

저는이 셰이더 세계에서 새로운 기능을 시도해보고 싶습니다. 다음과 같이하고 싶습니다.
마우스 주위의 특정 반경에서 배경의 텍스처가 10 ° 회전해야합니다. 마우스 좌표는 절대 값이므로 좌표를 정규화해야하므로 텍스처의 올바른 공간을 찾을 수 있습니다. 그러나 어떻게 든 이것이 올바르게 작동하지 않습니다. 회전 작동하지만 약간의 오프셋 색 정보를 얻을.GLSL 마우스 입력 표준화

나는이 문제가 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)); 

감사합니다.

답변

4

절대 마우스 좌표를 [0,1] 범위 (텍스처 샘플에 필요)로 변환하려면 normalize 함수가 필요하지 않습니다. 당신은 간단한 스케일이 필요합니다

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

내가 GLSL에서 쓴,하지만 원래 화면 해상도를 인식 CPU 측이기 때문에 당신을 위해 그것을는 유니폼을 전달하기 전에 CPU 측에서 할 쉬울 것이다.

+0

네 말이 맞아. 고맙습니다. 완벽하게 작동합니다. – Philip