2017-11-14 7 views
0

작은 WebGL 엔진을 작성 중이며 작성되어 버퍼링되거나 다른 객체에 저장되고 저장되는 컨텍스트 리소스를 유지할 좋은 이유가 있는지 궁금합니다. 예 : 위치, 법선, uv 및 인덱스에 대한 버퍼를 만든 다음 VAO에 버퍼링합니다. VAO에 저장된 후 (즉, 초기화 후) 버퍼를 삭제하거나 다른 지점에서 버퍼를 사용할 수 있습니까? (그리고 해당 객체가 명시 적으로 삭제되면 리소스를 삭제할 수 있습니까?) createShader 및 deleteShader 호출에 대해서도 동일합니다 : 컴파일 후 프로그램 객체에 저장하면 vsh, fsh Shaders를 안전하게 삭제할 수 있습니까? 아니면 다른 지점에서 다시 사용할 수 있습니까?WebGL : 초기화 후 컨텍스트 리소스를 처리하는 방법

답변

1

VAO에는 꼭지점 데이터가 포함되어 있지 않으므로 바운드 버퍼의 포인터 구성 상태 만 저장됩니다. 하지만 소스가 해제 될 필요가 있기 때문에 자원 소스 삭제는 다소 퍼지기 쉽습니다. 어쨌든 그리기 위해 꼭지점 데이터가 필요할 때까지 이러한 데이터는 메모리에 있어야하며 이러한 데이터는 VAO에서 (개념적으로) 참조하지 않고 VBO에서 참조합니다. "최악"의 경우 (내가 테스트 한 적이없는), VAO가 여전히 사용 중일 때 VBO 삭제를 요청하면 VBO에 대한 액세스 권한을 잃을 수도 있지만 여전히 메모리에있는 데이터는 잃어 버릴 수 있습니다. 논리적 인 방법은이 데이터를 사용하여 뭔가를 그리는 동안 VBO 참조를 유지하는 것입니다. 이렇게하면 데이터에 대한 액세스와 제어를 유지할 수 있습니다. 모든 항목을 삭제하려면 먼저 VAO를 삭제 한 다음 관련 VBO (들)을 삭제하십시오.

쉐이더의 경우 이것은 같지 않습니다. 셰이더 프로그램이 링크되면 셰이더 개체를 분리하고 삭제할 수 있습니다. 동일한 셰이더 개체로 다른 프로그램을 연결할 필요가 없으므로 저장할 수 있습니다 기억. 다음은 OpenGL을 기준으로 한 설명이지만 WebGL에서도 똑같이 적용됩니다. Proper way to delete GLSL shader?

+0

VAO를 바인딩하고 그리기 전에 VBO를 삭제했는지 테스트했습니다. 지금은 아무 것도 나쁜 일이 없습니다. 그러나 나는 VAO가 WebGL에서 얼마나 정확하게 구현되는지를 읽을 것입니다. – SuperTasche

+0

OpenGL과 같이 주로 구현되는 것으로 가정 할 수 있습니다 ... VAO와 VBO의 용도와 용도는 OpenGL과 WebGL에서 동일합니다. https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object – dest1