- GPU의 데이터가 CPU에 필요한 경우
- 예를 들어 collision detection의 경우, 모든 버텍스의 updated position을 사용해 매 프레임마다 추가적인 계산이 필요 -> CPU에서 계산해야함
- GPU의 데이터를 버퍼 등에 저장해서 CPU 전달해줘야함
GL-POINTS
를 사용glDrawArrayInstanced
로 그 버퍼가 파티클 개수만큼 반복해서 그려지도록 한다
- 근데 강노에서는 버텍스 버퍼가 필요업다하고, 저 함수는 버퍼를 반복해서 그린다하고... 모르겠음!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
glVertexAttribDivisor
로 divisor값을 설정
glDrawArrayInstanced
와glVertexAttribDivisor
의 예시
gl-VertexID
를 통해 알아낸 뒤, 해당하는 index의 offset과 texcoord 정보를 적용
- 시간에 따라 파티클에 주어지는 힘이 달라진다면 운동 방정식에서의
a
에 변화가 생기는 것으로, 직전 프레임의 데이터가 필요하다
-> Transform feedback
glTransformFeedbackVarying
: (numbering된) 각 attribute에 해당하는 buffer와 shader의 output을 연결glBindBase
로 설정glBeginTransformFeedback
과 glEndTransformFeedback
사이에 shader input으로 사용할 vertex array 바인딩해서 point primitive를 그림
- shader output을 저장하기 위해 image load/store 또는 shader storage buffer objects 등을 사용할 수도 있다
- compute shader를 사용하면 1pass로도 가능하다
glBeginQuery
로 어떤걸 쿼리할지 지정 glEndQuery
glDrawArraysInstance
대신 glDrawElementsInstanced
Attributes | data | Divisor |
---|---|---|
0 | Mesh vertex position | 0 |
1 | Mesh vertex normal | 0 |
2 | texture coordinate (필요한 경우) | |
3 | particle position | rendering때는 1, update때는 0 |
4 | particle velocity | rendering때는 1, update때는 0 |
5 | particle age | rendering때는 1, update때는 0 |
6 | particle rotation | rendering때는 1, update때는 0 |
- gl_InstanceID라는 빌트인 변수를 사용하여 각 인스턴스마다 다른 값을 부여할 수 있다
- ex) 각 인스턴스마다 랜덤값
- 바람이 불어 불꽃이 다른 방향으로 움직이게 하려면
- 가속도 값을 다른 방향으로 조절하면 됨