그래서 외부 소스에서 (잠재적으로 색상 및/또는 표준) 점 스트림을 수신하는 시스템 (OpenGL 4.x 사용)이 있습니다. 그리고이 점들을 GL_POINTS로 그려야합니다. 색상을 지정할 수있는 전환 가능한 셰이더를 실행해야합니다 (색상은 절차 적으로 생성 될 수도 있고, 정점 색상 또는 법선 방향에서 생성 될 수도 있음).스트리밍 지점을 업로드하고 가끔씩 제거하는 가장 빠른 방법
스트림은 일정한 간격 (4에서 10hz)으로 임의의 수 (일반적으로 1k에서 70k까지의 지점)의 지점 그룹 (정상 또는 색상 없음 또는 없음)을 수신하는 것으로 구성됩니다. 현재 점을 가리키고 지금까지받은 점을 모두 그립니다.
내 꼭지점 유형이 변경되지 않는다는 것을 보증합니다. 예상되는 스트리밍 시작 부분에서 말 했으므로 pos + normal + color, pos + normal, pos +와 함께 인터리브 된 정점을 사용하고 있습니다. 색상, 또는 그냥 pos.
내 현재 해결 방법은 최대 버텍스 카운트 (다이나믹 힌트로 할당 됨)로 지정된 구성 파일에 적절한 버텍스 유형의 인터리브 된 버텍스 VBO (주변 VAO와 함께)를 할당하는 것입니다.
새로운 점으로 glBufferSubData를 통해 현재 채워지지 않은 VBO를 채 웁니다. 현재 프론티어 VBO가 얼마나 많은 버텍스를 가지고 있는지 계산 (activePoints)하고 glBufferSubData를 사용하여 activePoints로 시작하는 범위를 채 웁니다. 현재 업데이트 그룹에 내 프론티어 버퍼에 들어갈 수있는 것보다 많은 정점이있는 경우 (이후 VBO 당 버텍스 수를 제한), 새로운 VBO를 할당하고 범위가 0에서 시작하여 마지막 업데이트에 추가되지 않은 포인트 수로 끝납니다. 이 일을 계속 반복하십시오. 업데이트 그룹이 2 개 이상의 버퍼를 넘는 경우는 거의 없습니다.
것은 내가 glDrawArrays와 numVertices 맥스 버퍼 허용 크기 같다 glDrawArrays (m_DrawMode, 0, numVertices), 내 프론티어 완충액 내 VBOs (-1) 렌더링 렌더링 할 때 (m_DrawMode, startElem을 numElems) 유효한 꼭지점으로 완전히 채워지지 않았 음을 설명합니다.
물론 어떤 시점에서 대화식으로 그릴 수있는 것보다 많은 점수를 가질 것이므로 필요에 따라 가장 오래된 (LRU alg에 따라) 할당을 해제하는 LRU 메커니즘이 있습니다.
더 좋은 방법이 있습니까? 버퍼 고아? 스트리밍 힌트 요? 지도 대 SubData? 다른 것?
두 번째 문제는 한 번에 10 개에서 2000 개 사이 인 점을 (불규칙한 간격으로) 제거하도록 요청되었습니다. 그러나이 점들은 처음에받은 순서대로 불규칙적으로 배치되어 있습니다. 어떤 버퍼가 현재 어느 버퍼에서 벗어나지는 않지만 어떤 범위보다 더 많은 버퍼가 있는지 알 수 있습니다. 나는 오른쪽 버퍼로 오프셋을 찾고 glBufferSubData를 1 (범위가 희박한 버퍼가 있음)로 호출하여 하나씩 오프셋을 제거하고 위치를 멀리 떨어진 위치로 변경하여 "제거"했습니다. 그들은 결코 보이지 않을 것이다. 결국 버퍼를 삭제 요청에서 삭제해야한다고 추측하지만, 현재 그렇게하지는 않습니다.
어떻게 처리할까요?
사용하지 않는 정점을 물리적으로 제로 (zero)로 만드는 대신에, glDrawElements (...)를 사용하는 것이 좋습니다. 그런 다음 실제로 데이터가있는 모든 점의 배열을 전달합니다. 사용하지 않거나 자유로운 버텍스를 내부적으로 보관할 수 있지만, 자유 버텍스를 제로 아웃하는 버스 대역폭을 낭비하는 것은 분명합니다. 그들이 그대로있는 것처럼 그들을 남겨주세요. 그러나 정답은 렌더링되지 않아야합니다/정크가 포함되어 있음을 인정하십시오. –
그래서 삭제를 만들고 인덱스 (또는 IBO)로 채워진 새 VBO를 만들 것을 제안합니다. 매번 4 포인트를 말합니다. 버퍼에서 300k를 제거해야합니까? 그런 다음 glDrawArrays와 함께 glDrawElements를 그립니다. – Ryan
아닙니다. 나는 정점 버퍼에 같은 크기의 IBO를 할당 할 것을 제안했다. 처음에는 0-n (n은 VBO 크기)의 값으로 순차적으로 채워질 것이다. 임의의 위치 또는 일련의 연속 된 정점에서 하나의 정점을 제거하려면'glBufferSubData (...) '를 사용하고 IndexArray [n]의 값을 유효한 정점을 가리키는 인덱스로 바꿉니다. 이렇게하면 정점 위치를 다시 정의하거나 렌더링시 제거 된 정점을 "숨기"위해 32 비트 w 좌표를 추가하는 대신 16 비트 인덱스를 다시 정의하는 것만으로도 해결할 수 있습니다. –