Retained Mode Graphics 는 그래픽 요소를 메모리에 저장하고 관리하는 방식이다. 이 모드는 객체 지향적인 접근 방식을 사용하여 그래픽 요소의 상태를 유지한다.
#include <vgl.h>
const int NUM_POINT = 5000;
// Retained Mode
// 데이터(vertex)를 미리 생성하고 display에 줌
struct vec2 {
float x;
float y;
};
vec2 points[NUM_POINT];
void initialize() {
for (int i = 0; i < NUM_POINT; i++) {
points[i].x = (rand() % 1000) / 500.0f - 1;
points[i].y = (rand() % 1000) / 500.0f - 1;
}
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
for (int i = 0; i < NUM_POINT; i++) {
glVertex2f(points[i].x, points[i].y);
}
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(512, 512);
glutCreateWindow("Hello GL");
initialize();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
initialize
함수에서는 NUM_POINT
개의 랜덤한points
데이터를 생성하여 전역으로 저장한다.
display
함수에서는 initialize
함수에서 초기화 한 전역 points
데이터를 가져와 vertex를 생성하고 렌더링 한다.initialize
함수에서 points
를 한 번만 생성하고 display
에서 렌더링 하기 때문에 display
를 다시 호출하여도 points
를 수정하지 않는 이상 같은 화면을 보여준다. 이러한 방식 때문에 Retained Mode는 Immediate Mode 보다 효율적이다.
그러나 CPU에 특성 때문에 병렬 계산을 수행하지 않아 다수의 vertex에 대한 수정을 할 시 비효율 적이다. 예를 들어 3차원 를 평행 이동할 떼 모든 vertex에 대해 순차 접근을 하여 평행 이동을 수행한다.
또한 CPU-GPU 사이의 느린 BUS 속도 때문에 병목 현상이 발생할 수 있다. Retained Mode 에서는 CPU 메모리에 points
정보를 가지고 있고 이를 display
콜백 함수에서 CPU-GPU 사이의 BUS를 통해 vertex 정보를 넘긴다. 그러나 느린 BUS 속도 때문에 병목 현상이 발생할 수 있다.