2017-11-14 1 views
2

그래서 VAO를 사용하여 VBO에서 포인터를 저장하고 있습니다. VAIO를 바인딩하고 그리기 전에 내 데이터 버퍼 (vbo, ibo 등)를 삭제하면 어떻게되는지 테스트하고 싶습니다. VAO는 해당 데이터 버퍼의 데이터에 대한 포인터를 저장하므로 렌더러가 충돌 할 것으로 예상됩니다. 그러나 모든 것은 계속 작동합니다. 이것이 어떻게 가능한지? WebGL 2.0 컨텍스트를 사용하고 있습니다. 설명서에는 OpenGL 설명서에 따라 VAO가 구현되어 있다고 나와 있습니다. 이 작업은 JavaScript가 객체와 함께 작동하는 방식과 관련이 있습니까? 어쩌면 내 vbo가 deleteBuffer를 호출하기 전에 어딘가에 (알지 못하게) 캐시 될 수 있습니다. 이것이 가능한가? 여기서 무슨 일이 일어나고있는거야? 버퍼 개체 gl.DeleteBuffers 의해 삭제되도록 시도되면WebGL 2.0 : VBO가 삭제 되어도 Draw call이 성공적으로 처리됩니다.

답변

3

후 버퍼 개체는 언 바운드 정점 어레이 오브젝트에 연결된 경우 하지가 삭제된다. 이 경우, 오브젝트의 이름이 유효하게하며 미사용 표시된 :

gl.bindVertexArray(vao); 
gl.bindBuffer(gl.ARRAY_BUFFER, vbo); 
gl.vertexAttribPointer(...); 
..... 
gl.bindVertexArray(0); 
gl.deleteBuffers(1, vbo); 


그러나 정점 배열 객체가 결합되면, 상기 버퍼 객체 분리 삭제 :

gl.bindVertexArray(vao); 
gl.bindBuffer(gl.ARRAY_BUFFER, vbo); 
gl.vertexAttribPointer(...); 
..... 
gl.deleteBuffers(1, vbo); 
gl.bindVertexArray(0); 


OpenGL ES Specification 3.2 - 5.1.3 Deleted Object and Object Name Lifetimes, page 45 참조 :

때 버퍼, 텍스처, 변환 피드백 또는 renderbuffer 객체가 성공적으로 삭제되면 현재 컨텍스트에서 바인드 된 모든 바인딩 포인트에서 바인딩 해제되고 현재 컨텍스트에 바인딩 된 컨테이너 객체의 첨부 파일에서 분리됩니다.

첨부 파일 컨텍스트에 바인딩되지 않은 버텍스 배열 객체에 첨부 된 버퍼 삭제와 같은 언 바인드 컨테이너 객체는 영향을받지 않고 삭제 된 객체에 대한 참조로 계속 작동합니다 ....

버퍼, 쿼리 , renderbuffer, sampler, sync 또는 texture 객체가 삭제되면 그 이름은 즉시 무효화됩니다 (예 : 사용되지 않는 것으로 표시됨), 더 이상 사용되지 않을 때까지 기본 객체가 삭제되지 않습니다.

+0

또한 참고로, OpenGL ES의 객체 삭제 동작은 대부분의 드라이버에서 테스트되지 않은 부분입니다. WebGL은 쉐이더/프로그램에 대해 더 잘 수행되고, 삭제 된 쉐이더 및 프로그램의 동작에 대해 광범위한 테스트가 수행되었습니다. VAOs의 경우 테스트를 거쳐야하지만 WebGL1의 경우 테스트를 거치지 않았습니다. 우리는 잊었습니다. WebGL2의 경우 테스트를 거쳤지만 Chrome은 아직 테스트를 통과하지 못했습니다 (https://www.khronos.org/registry/webgl/sdk/tests/conformance2/vertex_arrays/vertex-array-object.html). 문제를 추적하는 [버그] (https://bugs.chromium.org/p/chromium/issues/detail?id=739604)가 있습니다. – gman

+2

@gman 오, 나는 WebGL 태그를 읽지 않았고, 나는 단지 그 질문을 읽었다. 나의 잘못. 코드를 변경하고 지금 OpenGL ES에 대해 언급합니다. – Rabbid76

+0

그게 분명하지 않다면 죄송합니다 ... 젠장, 나는 크롬에서 테스트 중이지만 webgl 2.0 컨텍스트를 사용하고 있습니다. 입력에 감사드립니다. – SuperTasche

관련 문제