2012-11-16 3 views
0

저는 python OpenGL 바인딩을 사용하고 있으며 최신 OpenGL 호출 만 사용하려고합니다. 버텍스가있는 VBO가 있고 버텍스 쉐이더에 전달 된 직교 투영 행렬로 렌더링하려고합니다.화면 하단에 원점이있는 직교 투영

from numpy import array 

w = float(width) 
h = float(height) 
n = 0.5 
f = 3.0 

matrix = array([ 
        [2/w,  0,  0,  0], 
        [ 0,  2/h,  0,  0], 
        [ 0,  0, 1/(f-n), -n/(f-n)], 
        [ 0,  0,  0,  1], 
       ], 'f') 


#later 
projectionUniform = glGetUniformLocation(shader, 'projectionMatrix') 
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix) 

내가 여기에서 가져온 그 코드 :

나는 다음과 같은 값을 내 투영 행렬 계산하고 현재

Formula for a orthogonal projection matrix?

이 잘 작동하는 것 같다,하지만 내가 좋아하는 것 내 Origin이 화면 왼쪽 하단에 있습니다. 이 함수는 모든 것이 "그냥 작동합니다", 즉 모든 객체를 w/2 h/2로 수동으로 변환해야하므로 매트릭스에 적용 할 수있는 함수입니까?

사이드 노트 : 좌표가 픽셀 위치와 올바르게 일치합니까?

저는 현대 OpenGL 기술을 사용하고 있기 때문에 gluOrtho2d 또는 GL_PROJECTION 호출을 사용해야한다고 생각하지 않습니다.

답변

1

저는 최근에 OpenGL 프로그래밍 만 시작 했으므로 예측에 대해서는 아직 완전히 익숙하지 않지만 현재 매트릭스는 어떤 점도 변환하지 않습니다. 대각선은 크기 조정을 적용하지만 가장 오른쪽 열은 번역을 적용합니다. Dirk가 준 링크는 화면의 왼쪽 하단 모서리 (0,0은 원하는 것, 예?)를 만드는 투영 행렬을 제공합니다.

I는 (각 행은 실제로는 OpenGL에 열이다) 이렇게 사용한 매트릭스 : 왼쪽 때문에

OrthoMat = mat4(
     vec4(2.0/(screenDim.s - left), 0.0, 0.0, 0.0), 
     vec4(0.0, 2.0/(screenDim.t - bottom),  0.0, 0.0), 
     vec4(0.0, 0.0, -1 * (2.0/(zFar - zNear)), 0.0), 
     vec4(-1.0 * (screenDim.s + left)/(screenDim.s - left), -1.0 * (screenDim.t + bottom)/(screenDim.t - bottom), -1.0 * (zFar + zNear)/(zFar - zNear), 1.0) 
); 

screenDim 수학 효과적으로 폭 또는 높이와 바닥이 0으로 설정되어 zFar와 zNear는 각각 1과 -1입니다 (2D이기 때문에 매우 중요하지 않습니다).

이 매트릭스는 픽셀 단위로 값을 취하며 정점 위치는 픽셀 단위 여야합니다. 화면의 크기를 조정할 때도 (0, 32) 점은 항상 같은 위치에 있습니다.

희망이 도움이됩니다.

편집 # 1 : 내가 말한 왼쪽/아래/zfar/znear 값은 입니다. 나는을 선택했습니다. 당신은 그들이 어떻게 보이는지를 바꿀 수 있습니다.

+0

예를 들어 Alex에게 감사드립니다. 이것과 GL_FALSE가 섞여서 모든 것이 예상대로 작동합니다! – Shootfast

1

왼쪽, 오른쪽 위치를 추가로 사용하는보다 일반적인 투영 행렬을 사용할 수 있습니다.

정의에 대해서는 Wikipedia을 참조하십시오.

1
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, matrix) 

행렬 주요 정렬 순서로 저장됩니다. 따라서 GL_TRUE를 전달해야합니다. 그렇지 않으면 행렬을 column-major로 변경해야합니다.

+0

Nicol을 찾아 주셔서 감사합니다. 어떻게 내가 왼쪽 botton에 원점을 이동할 수있는 아이디어? – Shootfast

관련 문제