내 자신의 소프트웨어 3d 래스터 라이저를 작성해야하며, 지금까지 삼각형으로 만든 3D 모델을 2D 공간으로 투영 할 수 있습니다.
점을 회전, 변환 및 투영하여 각 삼각형의 2D 공간 표현을 얻습니다. 그런 다음 3 개의 삼각형 점을 취하고 스캔 선 알고리즘 (선형 보간법 사용)을 구현하여 삼각형의 가장자리 (왼쪽 및 오른쪽)를 따라 모든 점 [x] [y]을 찾아 삼각형을 가로로 스캔 할 수 있습니다. 행 단위로 픽셀로 채 웁니다.
작동합니다. z- 버퍼링도 구현해야합니다. 이것은 삼각형의 3 개의 정점의 회전 및 변환 된 z 좌표를 알면 스캔 라인 알고리즘으로 찾은 다른 모든 점에 대해 z 좌표를 보간해야한다는 것을 의미합니다.
개념은 충분히 분명해 보입니다. 나는 먼저 다음 계산을 통해 Za와 Zb를 찾습니다.
var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y);
var Za = top_point_z + ((current_point_y - top_point_y) * Z_Slope);
그런 다음 각 Zp에 대해 동일한 보간을 수평으로 수행합니다.
var Z_Slope = (right_z - left_z) / (right_x - left_x);
var Zp = left_z + ((current_point_x - left_x) * Z_Slope);
현재 z가 해당 인덱스에서 이전 z보다 뷰어에 더 가까운 경우 색상을 색상 버퍼에 쓰고 새 z를 z 버퍼에 씁니다. (내 좌표계는 x : 왼쪽-> 오른쪽; y : 위쪽-> 아래쪽; z : 얼굴-> 컴퓨터 화면입니다.)
문제는, 그것은 건초로 간다는 것입니다. 프로젝트가 여기 있고 "Z-Buffered"라디오 버튼을 선택하면 결과가 표시됩니다 ... "Z-Buffered"모드에서 페인터 알고리즘을 사용하여 와이어 프레임을 그립니다. 디버깅 목적으로 )
PS : 나는 읽은 여기 당신이 자신의 역수 (의미로 Z의를 설정해야 z = 1/z
당신이 보간 전). 나는 그것을 시도했지만 아무런 변화가없는 것 같습니다. 내가 무엇을 놓치고 있습니까? (누구든지 z를 1 / z로 바꾸어야하는 곳과 그것을 돌려 놓을 곳 (if)을 명확히 할 수 있습니까?)
[편집] 내가 얻는 최대 및 최소 z 값에 대한 데이터는 다음과 같습니다.
max z: 1; min z: -1; //<-- obvious, original z of the vertices of the triangles
max z: 7.197753398761272; min z: 3.791703256899924; //<-- z of the points that were drawn to screen (you know, after rotation, translation), by the scanline with zbuffer, gotten with interpolation but not 1/z.
max z: 0.2649908532179404; min z: 0.13849507306889008;//<-- same as above except I interpolated 1/z instead of z.
//yes, I am aware that changing z to 1/z means flipping the comparison in the zBuffer check. otherwise nothing gets drawn.
어려운 디버깅에 들어가기 전에 누군가 내 개념이 올바른지 확인할 수 있습니까?
[편집 2]
z- 버퍼링을 해결했습니다. 결과적으로 도면 순서가 엉망이되지 않았습니다. z 좌표가 올바르게 계산되었습니다.
문제는 프레임 속도를 높이기 위해 화면의 실제 픽셀 대신 4 픽셀마다 4 픽셀 / 4 픽셀 상자를 그리는 것이 었습니다. 그래서 픽셀 당 16px를 그리지 만 z 버퍼 중 하나만 검사합니다. 나는 그런 가슴입니다.
TL / DR : 여전히 의문의 여지가 있습니다 : Z 대신에 Z의 역수 (1 / z에서와 같이)를 어떻게 / 왜 / 어떻게 사용해야합니까? 지금 당장은 모든 것이 작동합니다. (눈에 띄는 차이는 없습니다).