Immediate Mode Graphics 는 그래픽스를 그릴 때, 명령이 호출되면 즉시 화면에 렌더링되는 방식이다.
#include <vgl.h>
const int NUM_POINT = 5000;
// Immediate Mode
// display를 요청할 때마다 새롭게 계산(생성)하여 display 함
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
for (int i = 0; i < NUM_POINT; i++) {
float x = (rand() % 1000) / 500.0f - 1;
float y = (rand() % 1000) / 500.0f - 1;
glVertex2f(x, y);
}
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(512, 512);
glutCreateWindow("Hello GL");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
display
함수에서는 랜덤하게 NUM_POINT
개의 vertex를 생성하고 렌더링 한다.
이때display
는 콜백 함수로 등록되어 윈도우(프로그램 창)의 사이즈를 변경할 때 등 마다 호출된다. 문제는 display
함수가 호출 될 때마다 CPU에서는 NUM_POINT
만큼의 랜덤한 vertex를 생성하여 렌더링 한다. 때문에 윈도우 사이즈를 변경할 때마다 화면에 점이 랜덤하게 찍히는 것을 볼 수 있다.
이러한 방식 때문에 Immediate Mode 는 매우 비효율적이고, CPU의 vertex 계산 속도와 GPU 렌더링 속도 차이 및 BUS의 속도 문제로 병목 현상이 발생할 수 있다.