그래서 VAO를 사용하여 VBO에서 포인터를 저장하고 있습니다. VAIO를 바인딩하고 그리기 전에 내 데이터 버퍼 (vbo, ibo 등)를 삭제하면 어떻게되는지 테스트하고 싶습니다. VAO는 해당 데이터 버퍼의 데이터에 대한 포인터를 저장하므로 렌더러가 충돌 할 것으로 예상됩니다. 그러나 모든 것은 계속 작동합니다. 이것이 어떻게 가능한지? WebGL 2.0 컨텍스트를 사용하고 있습니다. 설명서에는 OpenGL 설명서에 따라 VAO가 구현되어 있다고 나와 있습니다. 이 작업은 JavaScript가 객체와 함께 작동하는 방식과 관련이 있습니까? 어쩌면 내 vbo가 deleteBuffer를 호출하기 전에 어딘가에 (알지 못하게) 캐시 될 수 있습니다. 이것이 가능한가? 여기서 무슨 일이 일어나고있는거야? 버퍼 개체 gl.DeleteBuffers
의해 삭제되도록 시도되면WebGL 2.0 : VBO가 삭제 되어도 Draw call이 성공적으로 처리됩니다.
2
A
답변
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 객체가 삭제되면 그 이름은 즉시 무효화됩니다 (예 : 사용되지 않는 것으로 표시됨), 더 이상 사용되지 않을 때까지 기본 객체가 삭제되지 않습니다.
관련 문제
- 1. WebGL 2.0 Occlusion Query
- 2. OpenGL Es 2.0 GLKit Draw Pixel
- 3. Android OpenGL ES 2.0 : 사용하기 전에 VBO가 지원되는지 확인해야합니까?
- 4. Webgl GLSL/Open GL ES 2.0
- 5. gradle 빌드가 성공적으로 완료 되어도 Android APK에 오류가 발생합니다.
- 6. setneedsdisplay do draw draw
- 7. Matrix VBO가 버텍스 쉐이더
- 8. drawRect - Draw Star
- 9. OAuth 클라이언트 2.0 효과 삭제
- 10. VBO가 Python과 PyOpenGL을 사용하는 방법
- 11. OpenGL : 많은 작은 VBO가 괜찮습니까?
- 12. VBO가 QGLBuffer를 사용하여 업데이트되지 않습니다.
- 13. OpenGL VBO가 제대로 업데이트되지 않습니다.
- 14. requestAnimationFrame으로 인해 효율적인 webgl 루프에서 프레임이 삭제 될 수 있습니까?
- 15. WebGL : gl.copyTexImage2D 경쟁 조건
- 16. SurfaceView draw 성능
- 17. VBO가 표시되지 않습니다 (glew와 함께 sdl)
- 18. WebGL 쉐이더의 const float 배열
- 19. 변환 후 NSImage가 흐리게 처리됩니다.
- 20. WebGL 역 FFT 구현
- 21. CakePHP 2.0 loginRedirect 문제 - https 삭제
- 22. 인증되지 않은 사용자 요청 2.0 삭제
- 23. 서버 삭제 : 잘못된 요청시 HTTPAPI/2.0 헤더
- 24. 2.0
- 25. WebGL 셰이더를 최적화 하시겠습니까?
- 26. WebGL drawElements 오프셋은 어떻게 사용합니까?
- 27. 사운드가로드 되어도 SoundEffect.Play()가 NullReferenceException을 던지고 있습니다.
- 28. 요청을 성공적으로 보낸 후 2.0, 빈 데이터 그래프에
- 29. VBO가 작동하지 않습니다. 동적 (메모리 할당)
- 30. OpenGL VBO가 무언가를 그려 내지 못함
또한 참고로, 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
@gman 오, 나는 WebGL 태그를 읽지 않았고, 나는 단지 그 질문을 읽었다. 나의 잘못. 코드를 변경하고 지금 OpenGL ES에 대해 언급합니다. – Rabbid76
그게 분명하지 않다면 죄송합니다 ... 젠장, 나는 크롬에서 테스트 중이지만 webgl 2.0 컨텍스트를 사용하고 있습니다. 입력에 감사드립니다. – SuperTasche