Picking

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 Picking with Rasterization (GPU)

Render Target Index - Render Target
captured1 captured
   
// ..
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

ezgif com-crop (1)


🐥 Picking with Ray Collision (CPU)

Ect-38

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

ezgif com-crop



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기