Các cảnh 3D sẽ trở nên sống động khi độ đệm đôi được dùng. Và trong trường hợp này, stack ma trận đặc biệt hữu dụng.
a. Giới thiệu bộ đệm đôi
Việc thiết kế ảo giác chuyển động nhịp nhàng luôn là sự thách thức đối với người lập trình. Trước tiên, chương trình phải có khả năng vẽ 30 hình (hay "khung") trong một giây, để tạo sự chuyển động uyển chuyển. Điều này đòi hỏi phần cứng có tốc độ cao và chương trình được thiết kế tốt. Kế tiếp, mọi việc phải vẽ khuất, và mỗi khung hình phải được sự chuyển động đối với mắt người dùng. May thay, vấn đề tốc độ ngày càng trở nên Ýt quan trọng khi máy tính ngày càng nhanh hơn. Còn giải pháp cho vấn đề thứ hai là sử dụng bộ đệm đôi.
Với bộ đệm đôi, hai vùng nhớ được sử dụng để tạo ảo giác chuyển động. Một vùng chứa ảnh trên màn hình. Trong thời gian vùng bộ đệm này đang được thể hiện, không lệnh vẽ nào được dùng để sửa đổi nó. Vùng thứ hai được sử dụng để chương trình vẽ vào vùng đệm này. người dùng không
thấy các thao tác vẽ. Sau khi việc vẽ hoàn tất, con người chỉ đơn giản hoán đổi các bộ đệm.
b. Bộ đệm đôi trong Open GL
Trong Open GL, các bộ đệm trong bộ đệm đôi được gọi là bộ đệm trước (bộ đệm không thấy được). Khi thiết lập bộ đệm đôi Open GL, mọi lệnh vẽ sẽ luôn luôn đến bộ đệm sau hiện hành, nh vậy người dùng sẽ không thấy thao tác vẽ. Khi Chương trình vẽ xong ảnh, nó hoán đổi bộ đệm trước và sau để làm xuất hiện ảnh mới trên màn hình. Sau đó chương trình tạo khung hình kế tiếp trong bộ đệm sau mới, rồi lại hoán đổi các bộ đệm. Quá trình này tiếp diễn trong suốt toàn bộ thời gian ảo giác chuyển động được thực hiện, và việc hoán đổi giữa các bộ đệm được thực hiện nhiều lần trong giây.
c. Sử dụng bộ đệm đôi
Mặc dù việc quản lý bộ đệm đôi là kỹ thuật khó trong lập trình đồ họa thông thường Open GL thực hiện điều đó chỉ với hai thay đổi nhỏ trong chương trình. Trước tiên Open GL phải được thông báo thiết lập môi trường bộ đệm đôi. Việc này được thực hiện bằng cách thêm cờ
PFD_DOUBLEBUFFER vào thành phần dwFlags của cấu trúc
PIELFORMATDESCRIPTOR nh sau:
PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // kích thước cấu trúc.
1, // sè version của cấu trúc. PFD_DRAW_TO_WINDOW | // các cờ thuộc tính PFD_SUPPORT_ONPENGL | PFD_DOUBLEBUFFER. PFD_TYPE_RGBA, 24, // 24 bit màu 0,0,0,0,0,0, // không chọn lựa các chế độ 0,0,0,0,0,0,0,0
0,0, // không dung fbộ đệm stencil hay bộ đệm phụ trợ
PFD_MAIN_PLANE, // kiểu lớp chủ yếu
0, 0,0,0 0,0,0
};
Nh vậy, ta chỉ đơn giản sử dụng phép toán OR cờ PFD_DOUBLEBUFFR
với các cờ khác trong thành phần cấu trúc dwFlags.
Mét thay đổi khác cần có lời gọi hàm SwapBuffers () sau khi chương trình vẽ xong hình mới. Lời gọi này đổi bộ đệm sau (là bộ đệm vừa được vẽ vào) thành bộ đệm trước, và nh vậy người dùng thấy được hình mới. Còn bộ đệm trước trở thành bộ đệm sau, và mọi lệnh vẽ trước lời gọi SwapBuffers ()
kế tiếp sẽ có tác dụng với nó.