VAO 및 VBO 이해
나는 꽤 오랫동안 다루지 않았기 때문에 기본 개념을 새로 고치기 위해 OpenGL 학습을 읽고 있습니다.
특히 나는 여전히 VAO와 VBO의 의미를 이해할 수 없다고 생각합니다. 책은 주로 엄격한 정의를 제공하지 않는 예제를 통해 진행됩니다.
VBO 정보 :
정의 된 정점 데이터를 사용하여 그래픽 파이프 라인의 첫 번째 프로세스 인 정점 셰이더에 입력으로 보내려고합니다. 이는 정점 데이터를 저장하는 GPU에 메모리를 만들고 OpenGL이 메모리를 해석하는 방법을 구성하고 데이터를 그래픽 카드로 보내는 방법을 지정하여 수행됩니다. 그런 다음 정점 셰이더는 메모리에서 지정한만큼의 정점을 처리합니다. 우리는 GPU의 메모리에 많은 수의 정점을 저장할 수있는 소위 정점 버퍼 객체 (VBO)를 통해이 메모리를 관리합니다. 이러한 버퍼 개체를 사용할 때의 장점은 한 번에 한 정점 씩 데이터를 보내지 않고도 대용량 데이터 일괄 처리를 그래픽 카드로 한꺼번에 보낼 수 있고 충분한 메모리가 남아있는 경우 그대로 유지할 수 있다는 것입니다. CPU에서 그래픽 카드로 데이터를 보내는 것은 상대적으로 느리기 때문에 가능한 한 많은 데이터를 한 번에 보내려고 할 수 있습니다. 데이터가 그래픽 카드의 메모리에 있으면 정점 셰이더는 정점에 거의 즉각적으로 액세스하여 매우 빠릅니다.
그래서 VBO에 대한 나의 이해는 VBO가 특별히 Vertex Data 전용이라는 차이점과 함께 본질적으로 Buffer 객체 (GPU로 보낼 바이트 무리)입니다. 이 올바른지?
VAO 정보 :
대신에 나는 정말로 이해하지 못한다.
정점 배열 오브젝트 (라고도 VAO는 ) 단지 정점 버퍼 객체와 VAO 내부에 저장되는 시점부터 후속 정점 속성 호출 같이 결합 될 수있다.
그 시점에서 이후의 정점 속성 호출이 VAO 내부에 저장 된다는 것은 무엇을 의미 합니까? "call be stored"비트를 이해하지 못합니다. 이는 우리가 생성 한 OpenGL 컨텍스트 어딘가에 관련 데이터처럼 저장 한다는 의미입니까? 정점 속성 호출 (예 : 호출의 쌍 입력 출력? 호출의 출력? 호출과 관련된 것?)
이것은 정점 속성 포인터를 구성 할 때 이러한 호출을 한 번만 수행하면되고 객체를 그릴 때마다 해당 VAO를 바인딩 할 수 있다는 장점이 있습니다. 따라서 서로 다른 VAO를 바인딩하는 것만 큼 쉽게 서로 다른 정점 데이터와 속성 구성 사이를 전환 할 수 있습니다. 방금 설정 한 모든 상태는 VAO 내에 저장됩니다.
나는 여기서 이점을 이해하지 못합니다. VAO에 저장되어 있기 때문에 "한 번 호출"을 이해합니다 ( "저장된 부분"이 의미하는 바에 관계없이). 스위칭 부분은 서로 다른 Vertex Attributes 호출을 캡처하는 여러 VAO를 만들 수 있으며 vertex 속성을 다시 호출하지 않고 필요할 때 각각을 바인딩 할 수 있음을 의미 할 수 있습니까?
참고 로이 질문 에 흥미로운 답변이 있다고 생각했습니다.
답변
그래서 VBO에 대한 나의 이해는 VBO가 특별히 Vertex Data 전용이라는 차이점과 함께 본질적으로 Buffer 객체 (GPU로 보낼 바이트 무리)입니다. 이 올바른지?
"VBO"는 사실이 아닙니다. 튜토리얼이 그런 척하는 것을 그만두 길 바랍니다.
버퍼 객체 가 있다는 점에서 정확 합니다 . GPU가 다양한 프로세스를 위해 저장하고 액세스 할 수있는 형식화되지 않은 데이터의 선형 배열입니다. GPU가 사용할 수있는 "다양한 프로세스"중 하나는 정점 렌더링 작업을위한 배열 데이터를 제공하는 것입니다.
그러나 버퍼 자체 는 특별하지 않습니다. 정점 데이터에 사용한다고해서 달라지는 것이 아니며, 현재 정점 데이터에 사용중인 버퍼를 다른 버퍼 용도에도 사용할 수 없다는 규칙은 없습니다.
이것은 텍스처가 작동하는 방식과 다릅니다. 텍스처 객체를 생성하고 2D 텍스처로 바인딩하면 해당 텍스처 객체는 영원히 2D 텍스처가됩니다. 나중에 1D 또는 큐브 맵 등으로 바인딩 할 수 없습니다. 버퍼 객체는 그렇지 않습니다. 바인딩하는 위치는 현재 사용 중인 방식 만 정의 합니다.
"그 시점부터 모든 후속 정점 속성 호출이 VAO 내에 저장됩니다"라는 의미는 무엇입니까?
이것은 또 다른 성가신 튜토리얼 비유입니다. 객체가 "저장소 호출"이거나 매크로 또는 다른 말도 안되는 것입니다.
OpenGL의 개체는 호출을 저장하지 않습니다. 그들은 상태 를 저장 합니다 . 그들은 구조체와 같습니다. 데이터 멤버가 있습니다. 객체를 OpenGL 컨텍스트에 바인딩하면 특정 상태에 액세스하는 OpenGL 작업이 바인딩 된 객체 내에서 해당 상태를 찾을 수 있습니다. 따라서 바인딩 된 객체의 특정 상태를 수정하는 함수를 호출하면 해당 함수가 객체 내의 상태를 수정합니다.
VAO를 바인딩하면 정점 배열에 사용되는 상태를 저장하는 객체를 바인딩하는 것입니다. 정점 배열의 상태를 수정하는 함수를 호출하면 해당 함수는 현재 바인딩 된 VAO에 저장된 상태를 수정합니다. 렌더링 할 때 렌더링 시스템은 현재 바인딩 된 VAO에있는 정점 배열 상태를 사용합니다.
VBO는 GPU가 액세스 할 수있는 메모리 버퍼입니다. 그게 전부입니다.
VAO는 정점 바인딩을 저장하는 개체입니다. 즉, glVertexAttribPointer와 친구들을 호출하여 정점 형식을 설명하면 형식 정보가 현재 바인딩 된 VAO에 저장됩니다. 그리고 그릴 때 현재 바인딩 된 VAO의 정점 바인딩을 사용합니다.
바인딩 호출을 재생하는 척하는 것은 잘못된 것입니다. VAO 이전에는 그리는 메시를 변경할 때마다 정점 바인딩을 다시 실행해야했기 때문에 VAO가 만들어진 이유에서 유물입니다. VAO를 사용하면 단일 호출로이를 수행 할 수 있습니다.