re-glBufferData () 'ing은 glVertexAttribPointer와 어떻게 상호 작용합니까?
기본 시퀀스를 이해합니다. glGenBuffers ()는 "버퍼 객체 이름"을 생성하고, glBindBuffer ()는 실제 버퍼 객체 (이름 바인딩)를 생성하고, glBufferData ()는 "버퍼 객체의 데이터 저장소를 생성하고 초기화합니다."및 glVertexAttribPointer () 버퍼 데이터의 형식을 설정하고 버퍼 객체 바인딩을 정점 속성 배열 상태의 일부로 저장합니다.
내가 확실하지 않은 까다로운 점은 glBufferData ()에 대한 새로운 호출에 의해 "버퍼 객체 데이터 저장소"(버퍼 객체 자체는 아님)가 날아 가면 glVertexAttribPointer () 항목이 유효한지 여부입니다. 나는 이것이 일반적으로 좋은 생각이 아니라는 것을 알고 있습니다-버퍼를 다시 쓸 때 glBufferSubData ()를 사용하십시오-그러나 glBufferData ()는 크기를 조정해야 할 경우 유일한 옵션으로 보입니다. 게다가 그냥 궁금합니다.
참조 페이지는 어느 쪽이든 갈 수있는 것처럼 들리게합니다. 특히 (https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glVertexAttribPointer.xhtml) :
경우 포인터가 NULL이 아닌 제로라는 버퍼 개체는 GL_ARRAY_BUFFER 타겟 (참조 바인딩되어야 glBindBuffer을 그렇지 않으면 에러가 발생된다). 포인터 는 버퍼 개체의 데이터 저장소에 대한 바이트 오프셋으로 처리됩니다. 버퍼 객체 바인딩 (GL_ARRAY_BUFFER_BINDING)은 인덱스 인덱스에 대한 일반 정점 속성 배열 상태 (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)로 저장됩니다 .
일반 정점 속성 배열이 지정되면 size , type , normalized , stride 및 pointer 는 현재 정점 배열 버퍼 객체 바인딩과 함께 정점 배열 상태로 저장됩니다.
데이터 저장소가 다른 것으로 대체 된 경우에도 바이트 오프셋과 버퍼 개체 바인딩이 모두 유효한 것으로 보입니다. 그러나 호출시 바인딩 이 데이터 저장소에 대한 특정 포인터를 캡처 하여 데이터 저장소가 교체되면 무효화 되도록 구현되는 것을 볼 수도 있습니다 . 어느 쪽도 표현에 의해 배제되지 않는 것 같습니다.
답변
glVertexAttribPointer () 바인딩은 glBufferData ()에 대한 후속 호출 후에도 유효한 상태로 유지됩니다. 나는 그것을 시도함으로써 이것을 결정했습니다. 이것은 100 % 증명이 아닙니다.이 구현에서만 작동 할 수 있습니다 (제 경우에는 NVidia 드라이버).
그러나 오류 메시지 콜백 및 디버그 모드가 켜진 상태에서 glBufferData ()에 대한 두 번째 호출에서 다음 메시지가 표시됩니다. 이는이 상황이 예상 / 설계되었음을 강력하게 제안합니다.
[LWJGL] OpenGL 디버그 메시지 아이디 : 0x20071 출처 : API 유형 : 기타 심각도 : 알림 메시지 : 버퍼 세부 정보 : 버퍼 개체 1 (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (0), GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB (1) 및 GL_ARRAY_BUFFER_ARB에 바인딩 됨), 사용 힌트는 GL_STATIC_DRAW입니다.
처음 두 바인딩은 glVertexAttribPointer ()에 대한 두 번의 호출을 나타내며 glBufferData ()를 처음 호출 할 때 기록되는 메시지에는 표시되지 않습니다.