2009-12-17 4 views
0

에 z 버퍼를 구현하는 과정에서 소프트웨어 래스터 라이저를 작성합니다. 나는 내 z 버퍼링이 잘 작동하지 않는다는 것을 알아 차렸다. 그래서 그것을 화면에 출력하여 디버깅하려고한다. (검은 색이 가깝고 흰색이 멀리 있습니다.)숙제로 소프트웨어 래스터 라이저

그러나 꼭지점 z에 대한 특이한 값을 얻고 있습니다.

float Camera::GetZToPoint(Vec3 a_Point) 
{ 
    Vec3 camera_new = (m_MatRotation * a_Point) - m_Position; 

    return (HALFSCREEN/tanf(_RadToDeg(60.f * 0.5f))/camera_new.z); 
} 

m_MatRotation는 3 × 3 행렬이 내가 포인트를 변환하는 데 사용하는 것입니다. 이것을 벡터로 곱하면 변환 된 벡터가 반환됩니다.

0과 x 사이의 최대 값과 최소값을 얻습니다. 여기서 x는 임의의 숫자입니다.

이 변환 작업을 올바르게하고 있습니까? 그렇다면 두 세트 포인트 사이에 있도록 Z 값을 정규화하려면 어떻게해야합니까? 사전에

감사합니다.

답변

4

Z 값을 표준화하려면 가까운 클리핑 평면과 먼 클리핑 평면을 정의해야합니다. 그런 다음 Z를 정상 평면에서 0, 멀리 평면에서 1로 정규화합니다.

그러나 일반적으로 프로젝션을 수행하면됩니다. 마지막 선은 투영이 발생하는 곳입니다.

다른 것들의 숫자 :

  • 당신은 전체 행렬 - 벡터 곱셈을 계산하지만, 단지 Z를 유지, 이것은 낭비입니다. 포인트를 변형하고 모든 X, Y, Z 좌표를 유지하는 것을 고려해야합니다.
  • 모든 정점에서 tanf()를 다시 계산하지만 상수는 상수입니다.
  • tanf 계산 대신 프로젝션 매트릭스를 사용하는 것이 좋습니다.
  • 간단한 직각 투영으로 시작하면 디버그하기가 더 쉽습니다.
1

는 a_Point 일 것 vertez에서 z를 알고 싶은 가정 : 모든

첫째, 당신은 당신이 카메라의 주위에 회전하지 원점을 수행 할 수 있도록 회전하기 전에 변환을 수행 할 너의 공간, wchich 다른 어딘가에있을 수 있습니다. 둘째, camera_new는 카메라의 위치에 따라 새 참조 집합에있는 a_Point의 좌표를 나타내는 이름으로 잘 선택되지 않습니다. 대신, 다음을 수행하십시오 문제가 해결되지 않으면

Vec3 point_new = (m_MatRotation * (a_Point-m_Position)); 

, 당신은 하나의 곱셈의 이동, 회전 및 프로젝션을 모두 수행하는 실제 투영 행렬을 생성하여 어려운 방법을해야 할 것이다. 저에게 그것을하는 방법을 많이 이해하는 데 도움이되는 자습서가 있습니다.

http://www.songho.ca/opengl/gl_projectionmatrix.html

codeguru.com/cpp/misc/misc/math/article.php/c10123/

당신이 관점-올바른 방법으로 화면에 정점을 프로젝트 관리했으면 ' 그들 사이의 공간을 채울 수있는 방법을 찾고 채워진 각 픽셀에 대해 z가 무엇인지 찾아야합니다. 이것은 완전히 새로운 이야기이며, Wikipedia의 Texture mapping에 대한 기사에서 도움이되었습니다.

en.wikipedia.org/wiki/Texture_mapping#Perspective_correctness

미안 해요 때문에 나는 당신에게 더 많은 링크를 줄 수없는, 유래 나를 못하게하는 새로운 사용자 ...