2017-10-23 8 views
-1

transform feedback을 사용하여 피킹 루틴을 구현하려고합니다. 현재는 정상적으로 작동하지만 문제는 매우 느립니다 (GL_SELECT보다 느림). 지금 작동 방법느린 변환 피드백 기반 피킹?

: (처음에 0) 오프셋 glBindBufferRange()와를 사용하여

  1. 바인드 TBO.
  2. glBufferSubData()을 사용하여 메모리 재설정 (TF 가변 구조의 크기) (정확한 수확을 위해). 주요 문제는 여기에 있습니다.
  3. 피킹 선과 교차를 검사하는 지오메트리 셰이더가있는 개체를 그립니다. 교차점이 발견되면 쉐이더는이를 TF 변화에 씁니다 (처음에는 교차가 없으므로 2 단계 참조).
  4. 오프셋을 늘리고 다음 개체로 1 단계로 이동하십시오.

그래서 마지막으로 각 개체에 대한 데이터를 선택하는 배열이 있습니다.

질문은 각 반복마다 glBufferSubData() 번으로 전화하는 것을 피하는 방법입니까? 가능한 솔루션 (그러나 구현 방법을 모르겠습니다)은 다음과 같습니다.

  • 하나만 변경하면 TF가 변경됩니다. 그래서 다른 방법

어떤 아이디어를 다른 사람에게

  • 재설정 데이터를 재설정 할 필요가 없습니다?

  • +0

    OpenGL을 사용 했으므로 오랜 시간이 걸렸지 만 한 번에 모든 객체를 처리 할 수 ​​없었고 기하 도형 필터가 교차하는 모든 프리미티브의 ID를 쓸 수 없었습니까? 원시 객체를 자신이 속한 객체와 연관시키는 방법을 찾아야하지만 가능해야합니다. – Knoep

    답변

    1

    버퍼 영역을 지우려면 모두 use glClearBufferSubData이어야합니다. 즉, 그곳에있는 내용을 덮어 쓰지 않고 왜 삭제해야하는지 명확하지 않습니다.

    FYI : 피킹은 장면을 렌더링하고, 객체에 다른 "색상"을 지정하고, 관심있는 픽셀을 다시 읽음으로써 가장 잘 구현됩니다. 귀하의 방법은 이며 항상이 더 느립니다.

    +0

    모든 원시가 광선을 교차시킬 수있는 것은 아닙니다. 내 쉐이더는 가변적 인 경우에만 그것을 씁니다. 왜냐하면 나는 프리미티브의 개수를 알지 못하기 때문에, 다음 오브젝트에 대해 첫 번째로 가변적 인 오프셋을 사용합니다. 그러나 다음 첫 번째 변화의 기억은 이미 이전의 대상에 의해 영향을 받았다. 그것이 내가 그것을 깨끗하게해야하는 이유입니다. –

    +0

    직사각형 선택 및 큰 줌 위치 설정으로 인해 색상 기반 방법이 적합하지 않습니다. 개체가 퇴화 될 수 있으며 확대 한 후 선택된 개체가 없습니다. –

    +0

    @VetalB : 확대/축소하려는 경우 해당 확대/축소는 피킹 렌더링의 일부 여야합니다. 사용자가 객체를 볼 수 있으면 객체를 클릭 할 수 있습니다. 상자 선택은 해당 상자 내의 모든 픽셀을 읽는 것만으로 간단히 작동 할 수 있습니다. "* 그 이유는 그것을 지울 필요가있다. *"버퍼를 지워야하는 이유는 여전히 명확하지 않다. 피드백 작업은 작성한 데이터를 기억합니다. 따라서 피드백 작업을 중단하지 않는 한 다른 피드백 렌더링을 수행하면 작성된 데이터가 이전 데이터를 덮어 쓰지 않습니다. 그냥 버퍼의 다음 위치로 이동합니다. –