답변:
정점 배열 객체의 이름은 다소 불행합니다. 응용 프로그램 안팎에서 나타나거나 표시되는 것처럼 보이는 세 가지 항목이 있으며 이름에 "배열"또는 "버퍼"를 사용하여 이름이 다르게 지정된 (역사적으로는) 이름이 있습니다 (프레임 버퍼 개체도 있음) 그러나 나는 그것을 무시할 것이다).
VAO (Vertex Array Object)는 하나 이상의 정점 버퍼 객체를 포함하는 객체로, 렌더링 된 객체에 대한 정보를 저장하도록 설계되었습니다.
( 크로노스 에서 잡아 당김 )
각 버퍼는 정점 배열 (객체)의 하나의 속성을 구성하는 경향이 있습니다. VAO는 많은 정점 속성 (예 : 위치, 색상, UV)을 포함 할 수 있습니다. 각 버퍼는 자체 버퍼에 보관 될 수 있습니다. 여기서 버퍼 는 포맷되지 않은 일련의 연속 바이트를 나타내며 CPU 측 OpenGL 호출 및 GPU 측 셰이더 작업 모두에 대해 버퍼 요소 당 크기 (유형)를 명시 적으로 지정해야합니다.
한 가지 방법입니다. 이것이 작동하는 다른 방법은 다음과 같습니다.
아래 다이어그램은이 두 가지 경우를 보여줍니다.
결론 : "vertex array"라는 문구가 OpenGL에서 규정되지 않은 것으로 사용되는 경우 OpenGL 컨텍스트에서 (특히) 버퍼와는 매우 다른 VAO를 의미한다고 가정 할 수 있습니다.
주석 편집 :: GL_ARRAY_BUFFER
위에서 설명한 것처럼 해당 버퍼 객체를 꼭짓점 속성 데이터에 사용하려는 의도를 나타냅니다. 버퍼는 꼭짓점 속성 에만 사용되지 않기 때문 입니다. 그러나 가장 일반적인 사용 사례이며 VAO에 대해 묻기 때문에 다른 것에 대해서는 다루지 않겠습니다. 그러나 여기 에는 설정할 수있는 다른 유형의 버퍼 목록이 있습니다.
struct
유형일 수 있습니다. 버퍼 당 데이터 가 인터리브되거나 완전히 균일 할 수 있습니다. CPU의 기존 C 배열과 마찬가지로 색인을 생성 할 수 있습니다. 배열 객체 (이 올바른 용어를 사용하거나 혼란스러워합니다!) ... (아래 계속)
이 용어는 OpenGL의 역사에 뿌리를두고 있습니다. 기억해야 할 것은 여기에 관련된 대부분의 GL 버전에서 OpenGL은 점진적으로 발전했으며 API를 변경하는 대신 기존 API에 새로운 기능을 추가함으로써 점진적으로 발전했다는 것입니다.
OpenGL의 첫 번째 버전에는 이러한 객체 유형이 없었습니다. 여러 glBegin / glEnd 호출을 실행하여 그리기를 수행했으며이 모델의 한 가지 문제점은 함수 호출 오버 헤드 측면에서 매우 비효율적이라는 점이었습니다.
OpenGL 1.1은 정점 배열을 도입하여이를 해결하기위한 첫 단계를 수행했습니다. 꼭짓점 데이터를 직접 지정하는 대신 이제 C / C ++ 배열에서 소스를 지정할 수 있습니다. 따라서 정점 배열은 정점 배열과 정점을 지정하는 데 필요한 GL 상태의 배열입니다.
다음 주요 진화는 GL 1.5와 함께 제공되었으며 시스템 ( "클라이언트 측") 메모리가 아닌 GPU 메모리에 정점 배열 데이터를 저장할 수있게했습니다. GL 1.1 정점 배열 사양의 약점은 전체 정점 데이터를 사용할 때마다 GPU로 전송해야한다는 것입니다. 이미 GPU에있는 경우이 전송을 피하고 잠재적 인 성능 향상을 달성 할 수 있습니다.
따라서이 데이터를 GPU에 저장할 수 있도록 새로운 유형의 GL 객체가 만들어졌습니다. 텍스처 객체를 사용하여 텍스처 데이터를 저장하는 것처럼 정점 버퍼 객체는 정점 데이터를 저장합니다. 실제로는 비 특정 데이터를 저장할 수있는보다 일반적인 버퍼 객체 유형의 특수한 경우입니다.
버텍스 버퍼 객체를 사용하기위한 API는 이미 존재하는 버텍스 어레이 API에 대해 피기 백되었습니다. 이제 우리는 상태를 저장하는 정점 배열 API를 가지고 있으며, 데이터는 메모리 내 배열이 아닌 버퍼 객체에서 소스로 제공됩니다.
이것은 우리를 거의 이야기의 끝으로 데려옵니다. 결과 API는 정점 배열 상태를 지정할 때 매우 장황했기 때문에 최적화의 또 다른 방법은이 상태를 모두 수집하고 단일 API 호출에서 여러 정점 배열 상태 변경을 허용하고 GPU를 허용하는 새로운 객체 유형을 만드는 것이 었습니다 어떤 상태가 미리 사용 될지 알 수 있기 때문에 잠재적으로 최적화를 수행합니다.
이 모든 것을 모아 정점 배열 객체를 입력하십시오.
요약하자면, 정점 배열 은 상태를 그리기위한 상태와 데이터 (어레이에 저장 됨)로 시작되었습니다. 정점 버퍼가 이탈하는 GL 객체 타입과 메모리 어레이 스토리지를 대체 정점 어레이 단지 상태중인. 정점 배열 객체는 더 쉽게 변경 적은 API 호출을 할 수 있도록이 상태 단지 컨테이너 개체입니다.
한동안 OpenGL과 함께 일하지 않았으므로 절반 만 할 수 있습니다. 일반적으로 : 버퍼는 포맷되지 않은 메모리 배열을 저장합니다. 배열은 연속 메모리의 일반적인 용어입니다.
버퍼는 컨텍스트에 바인딩되어야하지만 배열은 데이터 배열 일뿐입니다. 올바르게 호출하면 버퍼의 데이터가 그래픽 카드에 복사됩니다 (따라서 바인딩).
희망이 조금 도움이되기를 바랍니다.
char* buffer = socketRead();
(의사 코드) 처럼 간단 합니다. 반면에 로그는 전체 앱 수명주기 동안 유지됩니다. 따라서 어딘가에 배열을 만들고 소켓을 읽기 시작하면 데이터를 얻을 때마다 해당 청크를 배열에 기록하여받은 모든 데이터의 깔끔한 목록을 제공합니다.