3D그래픽2014. 6. 21. 16:48

OpenGL ES 3.0에서 추가되었다는 Vertex Array Object는, 원래는 OpenGL 에서는 vertex array와 vertex buffer object를 모두 사용할 수 있게 되어 있다고 하는데, OpenGL ES 3.0에서는 vertex buffer object하고만 엮어서 사용할 수 있다고 한다.

 

그런데, instanced rendering을 테스트를 해 보다가 한 가지 궁금했던게, GL Context상에서 VAO와 VBO의 관계이다.

 

먼저 VAO와 VBO를 만들어서 엮어놓은 상태에서, 그리기 직전에 VBO에 저장된 instance 별 translation/rotation data를 업데이트 하려고 했다. (glBindBuffer / glBufferData)

 

instance 별 translation/rotation data에 animation을 적용해, 데이터 자체를 매 프레임 변경했기 때문에 각각의 instance들이 회전/이동을 해야 하는데, 화면만 번쩍번쩍 거리고 업데이트 데이터가 적용이 되지 않았다. 그래서 뭐가 문제인지를 확인하기 위해, 아래의 순서대로 하나씩 확인을 해 봤다.

 

 

1. 애니메이션 코드를 제거 했더니 정지화면은 문제없이 렌더링이 되는 것이다.

 

2. 다음으로 애니메이션은 적용을 하지 않고, 단순히 기존의 instance별 translation/rotation data를 업데이트 해 보았더니, 화면이 번쩍번쩍거리는 현상이 발생!

 

3. 그래서, "혹시나 VBO의 데이터를 업데이트 하기 전에 vertex array object를 binding 해 줘야 하는건가"라는 생각에, vertex array object를 binding 해 주었더니 문제가 해결 되었다.

 

4. 당연히 animation 데이터를 적용하니, animation rendering이 잘 되더라.

 

 

난 그리기 직전에 VAO를 binding 해 주기 때문에 별 상관이 없을거라 생각을 했었고, VBO는 VAO와 엮어 주기는 하지만 생성은 어짜피 각자 하고 초기 데이터도 VAO에 엮어주기 전에,VAO와 binding 되지 않은 상태에서 전송을 하기 때문에, 당연히 문제가 없다고 생각을 했었는데 말이지...;;

 

우선 Qualcomm의 OpenGL ES 3.0 implementation이 정확하게 어떻게 구현되어 있는지 알 수 없으니 유추만 해 볼 수 있겠지만, 일단 VAO에 묶인 VBO는 VAO binding context 상에서만 데이터를 업데이트 할 수 있는건가?

나중에 Spec.을 보던 공개된 implementation이 있으면 좀 찾아봐야 겠다.

'3D그래픽' 카테고리의 다른 글

visualizing eigenvectors  (0) 2016.06.28
Quaternion 사원수  (0) 2014.07.15
Unreal engine 4 - Interior level test WIP  (0) 2014.04.04
Android에서 Adreno Profiler 사용하기  (0) 2012.09.17
Shadow Mapping  (0) 2012.07.18
Posted by 세월의돌