2011-11-19 3 views
4

호기심 문제가있는 것 같습니다. 나는이 같은 OpenGL을 설정 :GLSL 정점 셰이더에서 올바른 좌표계를 사용하여

glViewport(0, 0, width, height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, width, height, 0, -width, width); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

는 물론, 폭, 높이, 600 (400)에 의해 내부의 OpenGL 모든 것이 괜찮 내 윈도우의 크기, 나는 정확한 좌표 시스템을 이동 할 수 있습니다. 200 픽셀만큼 그려지는 것은 무엇이든 200 개의 움직임으로 번역됩니다. 주요 내부

vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; 
gl_Position = pos; 

을() 모든 것이 잘 될 것 같다 :

이제 내 버텍스 쉐이더 내부 저도 같은 좌표계를 사용할 수없는 것, 내가 평소 않습니다. 그러나 이런 식으로 시도 할 때 :

정점 위치는 각 방향으로 1 픽셀 씩 이동하지 않고 x는 300, y는 200으로 변환됩니다.

나는이 값들을 쉐이더 내부에서 스케일 할 수 있다는 것을 알고 있지만 약간 더러운 것처럼 보인다. 분명히 내가 설정에서 뭔가 잘못하고 있어야합니다. 어떤 도움이라도 대단히 감사합니다.

답변

3

변환 후 [+1, -1] 변환 을 적용하고 있습니다. -1 < = x < = 1, -1 < = y < = 1이 변환 이후의 뷰포트 가장자리에 해당하므로 너비/2와 높이/2가 증가합니다.

9

gl_Position으로 출력되는 위치는 화면 공간이 아닙니다. 클립 공간입니다. 클립 공간은 각 방향으로 -1에서 1로 간다. 은 암시적인/w를 뒤에 나누어으로 나눈다. glOrtho는 투영에 변환을 적용하여 [0, 800] x [0,600] 범위의 좌표를 [-1,1]로 오프셋/스케일합니다.

스크린 공간 픽셀로의 변환은 뷰포트 변환을 통해 발생합니다. NDC 좌표 (클립 좌표 이후의 작은 단계이지만 중요한 단계)와 창 크기를 관련시키는 뷰포트입니다. 프로젝션은 뷰포트 차원에 의존하지 않아도됩니다 (물론 픽셀 단위로 배치하고 눈 공간 좌표를 스크린 픽셀 공간에 매핑하는 프로젝션을 사용하는 것이 바람직합니다).

관련 문제