스크린 스페이스의 픽셀을 가져다가 뷰, 프로젝션 역행렬이랑 깊이버퍼 값을 이용해서 월드 좌표 값으로 되돌려놓고싶은데
뭐가 잘못됐는지 자꾸 이상한 값이 나와...
상수들이랑 행렬, 깊이버퍼는 전부 GPU에 잘 올라가는거 그래픽스 디버거로 확인했는데 도저히 뭐가 문제인지 모르겠음
스크린 스페이스의 픽셀을 가져다가 뷰, 프로젝션 역행렬이랑 깊이버퍼 값을 이용해서 월드 좌표 값으로 되돌려놓고싶은데
뭐가 잘못됐는지 자꾸 이상한 값이 나와...
상수들이랑 행렬, 깊이버퍼는 전부 GPU에 잘 올라가는거 그래픽스 디버거로 확인했는데 도저히 뭐가 문제인지 모르겠음
Perspective division 을 까먹어서 그런건가? 아니면 G-Buffer 따로 만들어뒀으면 거기에 screen-space world position 정보가 있으니까 거기서 샘플링 해오는건 안됨?
텍스쳐에 volumetric color 말고 한번 world position 을 ouput으로 그려주면 값 어떻게 나오는지 한번 볼 수 있을 것 같은데
원근 나누기라면 리턴에서 해주고있는게 그거 아냐? G버퍼는 뭔지 모르겠어
inverse projection 으로 곱해준다음에 그 결과의 w로 나눠서 homogeneous coordinate 에서 cartesian coordinate로 맞춰줘야할 것 같은데
프로젝션 역행렬 곱하고 w로 나눈 값을 뷰 역행렬로 곱해주라는거임?
내 screen space -> ndc -> p = mul(ndc, inv perspective proj matrix) (Cartesian Coordinate->Homogeneous Coordinate) p = p.xyzw/p.w // Homogeneous Coordinate->Cartesian Coordinate worldPos = mul(p, inv view matrix)
말해준대로 해봤는데 여전함. x값은 얼추 비슷하게 나오는것같은데 y는 조금 엇나가있고 z는 1.13432812e+10이야
depth 가 ndc 에 정확히 맵핑됐나 확인해보셈 그리고 worldcoords.w 로 왜나눔? 나눌 필요 없음
depth는 일반 렌더 패스에서 나온 값인데 [0, 1]로 되어있어서 x y랑 다르게 따로 처리할 필요 없다고 생각해서 저렇게 넣은거... 어떻게 변환해줘야하나?
0~1이면 맞는거임. 그리고 ndc 좌표값에 inv projection 곱하는데, projection matrix 자체가 z-division을 제외하고 만든 행렬임. 그래서 z division을 w로 저따구로 하면 안됨;;
그럼 ndcCoords 변수 자체는 맞게 집어넣은거라는거고, w로 나누기를 안하면 잘 될거라는거야?
아니, inv projection을 곱하기 이전에, vertex shader에서 fragment shader 이전으로 가는 상태로 만들어놔야지.
이전이 아니라 직전
프래그먼트 쉐이더 직전으로 가는 상태라는건 보간되기전의 각 버텍스 좌표로 변경해야한다는거? 레스터라이저에 들어가기 전 상태로 만들어야한다면 모르겠는데 픽셀쉐이더 이전 상태라는건 좀 이해가 안가;
밥먹고 글 써줄게 ㄱㄷ