2015-01-12 3 views
0

저는 OpenGL 모델 뷰어에서 작업 중이며 문제가 발생했습니다. 내 장면을 렌더링 할 때 모델이 보였던 것처럼 보였습니다. 나는 그것으로 보면서 생각 어쩌면 내 깊이 버퍼가 작동하지 않는하지만 난 그것을 장소의 코드를 가지고 :OpenGL : 깊이 버퍼링이 거꾸로 작동합니다. 와인딩 순서입니까?

glEnable(GL_DEPTH_TEST) 
glDepthFunc(GL_LEQUAL) 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 

glGetIntegerv(GL_DEPTH_BITS) 

가 아닌 0 값을 반환 깊이 버퍼에 대한 테스트를 (24를 반환). 그래서 깊이 테스트 해 보았습니다. 깊이 버퍼가 작동하지 않는다는 것을 발견했습니다. 역 버퍼로 작동한다는 것입니다. 그것은 앞에있는 것들 위에 뒷면을 보여줍니다. glCullFace (GL_FRONT)를 호출하면 모델이 정상적으로 렌더링됩니다. 이것은 훌륭하지만 왜 그런 일이 일어나는 지에 대한 문제를 제기하며, 나는 아마도 문제의 근원에 도달해야합니다. 내 권선 순서가 문제가 될 것 같은 주위를 둘러 보니 modelviewprojectionmatrix에 대한 내 자신의 행렬 스택을 만들었고 이것이 문제 일 수 있다고 생각합니다. 내가 카메라가 1.000로, 0.785 라드, 1.333의 측면의 수평 FOV로, 뒤로 clipplaneNear을 20 개 단위를 이동 내 장면을 렌더링, 및 30.000의 clipplaneFar 경우 내 매트릭스는 다음과 같다 :

model: 
[ 1 0 0 0 ] 
[ 0 1 0 0 ] 
[ 0 0 1 0 ] 
[ 0 0 0 1 ] 
view: 
[ 1 0 0 0 ] 
[ 0 1 0 0 ] 
[ 0 0 1 0 ] 
[ 0 0 -20 1 ] 
proj: 
[ 2.414214 0   0   0 ] 
[ 0   -3.218951 0   0 ] 
[ 0   0   -1.068966 -1 ] 
[ 0   0   -2.068966 0 ] 

를 내가있을 때 앞면에있는 얼굴은 카메라에서 20 단위 떨어져 제대로 렌더링 된 객체를 사용하여 원하는대로 렌더링됩니다. 나는 그것을 원하고 좋아하는 것처럼 움직일 수 있고 모든 것이 작동합니다. 그러나 외계인없이 깊이가 바뀌면 내 z 값이 어딘가에서 엉망이됩니까? 모든 것은 지금까지 내가 작업해온 자원과 비슷합니다. 그리고 그게 아니라면이 거꾸로 문제가 어디서 오는 거지?

+0

문제가있는 경우'glCullFace (GL_BACK)'로'GL_CULL_FACE'를 사용할 수 있습니까? 아니면'GL_CULL_FACE'을 사용할 수 없습니까? –

+0

GL_BACK로 남겨두면 문제가 발생하며 사용하지 않으면 문제가 동일하게 유지됩니다. 하지만 문제가 발생한 초기 시간과 GL_FRONT없이 실행하는 방법은 GL_BACK – Pricedg

답변

1

나는 약 12 ​​시간 동안 내 모든 코드를 샅샅이 뒤지고 내가 잘못 가고있는 곳을 찾을 수있는 모든 가능성을 시도했다. 내 투영 행렬을 좁히고 두 번째 열의 두 번째 행까지 내려갔습니다. 나는 this source을 사용하여 투영 행렬을 읽고 손으로 계산하여 내 값과 일치해야하는 점을 찾아내어 불일치를 발견했습니다. 3.21의 값은 음수가 아닌 양수 여야하며 내 깊이 값을 변경해야합니다. 나는 포트를 사용하고 있던 라이브러리가 오류로 포팅 된 것을 알 수있었습니다. 라이브러리에는 make_projection_fov 함수가 있으며,이 함수는 뷰의 필드를 위쪽/아래쪽/오른쪽/왼쪽 값으로 변환하고 함수 make_projection이라고합니다. 그러나 make_projection의 매개 변수는 왼쪽 위의 맨 아래 왼쪽 하단에 있었고 make_projection_fov는 오른쪽 맨 아래의 맨 위까지 멀리 호출했습니다. 부정이 거기에서오고 있었다.

이렇게하면 내 라이브러리를 확인해야합니다. 이후로 모든 라이브러리 함수를 통해 테스트를 실행했고 현재 사용되지 않는 몇 가지 기능에서 또 다른 오류를 발견했습니다.

+0

과 같습니다. 행렬 요소 [1] [1]이 (가) 음수라는 것을 알았습니다. 그것은 깊이에 영향을 미치지 않아야합니다. y 값을 거꾸로 뒤집어서 프로세스의 와인딩 순서를 반전시킵니다. 그래서'GL_CULL_FACE'를 비활성화하면 어떻게되는지 물어 보았습니다. 도태와 관련된 문제가 있다면, 나는 이것만으로는 설명 할 수 없다고 생각합니다. –

관련 문제