Picking
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Picking with Rasterization (GPU)
Render Target | Index - Render Target |
---|---|
// ..
ID3D11RenderTargetView *targets[] = {m_renderTargetView.Get(), m_indexRenderTargetView.Get()};
m_context->OMSetRenderTargets(2, targets, m_depthStencilViw.Get());
//...
struct PixelShaderOutput
{
float4 pixelColor : SV_Target0;
float4 indexColor : SV_Target1;
}
- Mesh마다 index color를 지정
- Render Target 2개를 만들어 하나는 index color로 렌더링
- Index Render Target을 통해 Picking 여부를 확인!
Results
🐥 Picking with Ray Collision (CPU)
Vector3 cursorNdcNear = Vector3(m_cursorNdcX, m_cursorNdcY, 0.0f);
Vector3 cursorNdcFar = Vector3(m_cursorNdcX, m_cursorNdcY, 1.0f);
Matrix inverseProjView = (viewRow * porjRow).Invert();
Vector3 CursorWorldNear = Vector3::Transform(cursorNdcNear, inverseProjView);
Vector3 CursorWorldFar = Vector3::Transform(cursorNdcFar, inverseProjView);
Vector3 dir = (CursorWorldFar - CursorWorldNear).Normalize();
SimpleMath::Ray ray = SimpleMath::Ray(CursorWorldNear, dir);
float dist = 0.0f;
m_selected = ray.Intersects(m_mainBoundingSphere, dist);
// ...
- 마우스의 NDC좌표를 다시 world space로 옮겨주어야 함
- 마우스로는 z값을 알 수 없으므로 near plane, far plane 양쪽으로 변환
- 마우스에 대응하는 픽셀에서 Ray를 쏘아 picking 여부 판단 (near plane에서 출발해야 함)
- 몰랐는데 SimpleMath::Ray에 sphere, circle, box, … 등 Intersects 메서드가 구현되어 있다..
Results
댓글 남기기