9/7/15

Một số khái niệm cơ bản về 3D trong lập trình đồ họa với OpenGL

Đây là bài mở đầu cho loạt bài viết về lập trình game 3D với OpenGL ES. Trước tiên chúng ta khái quát về OpenGL. OpenGL (tiếng Anh Open Graphics Library) là một tiêu chuẩn kỹ thuật đồ họa có mục đích định ra một giao diện lập trình ứng dụng (tiếng Anh: API) đồ họa 3 chiều. OpenGL cũng có thể được dùng trong các ứng dụng đồ họa 2 chiều. Giao diện lập trình này chứa khoảng 250 hàm để vẽ các cảnh phức tạp từ những hàm đơn giản. Nó được dùng rộng rãi trong các trò chơi điện tử. Ngoài ra nó còn dùng trong các ứng dụng CAD, thực tế ảo, mô phỏng khoa học, mô phỏng thông tin, phát triển trò chơi. OpenGL còn có một đối thủ cạnh tranh là DirectX của Microsoft.[1]. OpenGL ES(Open Graphics Library for Embedded System) là phiên bản giành cho hệ thống nhúng mà tiêu biểu là các thiết bị điện thoại, phiên bản này được lượt bớt 1 số thành phần làm cho nó trở nên gọn nhẹ và phù hợp với các thiết bị có cấu hình thấp.

Bên trên là sơ bộ về OpenGL nói chung và OpenGL ES nói riêng, tiếp theo chúng ta sẽ tìm hiểu 1 số khái niệm cơ bản về 3D trong OpenGL.

Hệ tọa độ 3D

Có 2 loại hệ tọa độ 3D là left handright hand như hình.
Hai loại hệ tọa độ này cơ bản giống nhau chỉ khác chiều trục z hướng ra ở right hand và ngược lại ở left hand. Trong OpenGL sử dụng hệ tọa độ right hand còn DirectX sử dụng hệ tọa độ left hand.
Trong OpenGL, 1 điểm 3D được xác định trong 1 vùng không gian lập phương NDC(Normal Device Coordination) được giới hạn từ [-1, -1, -1] tới [1, 1, 1], tất cả mọi thứ nằm ngoài giới hạn này sẽ không được hiển thị và tính toán. NDC sử dụng hệ tọa độ left hand để xác định vị trí của 1 điểm 3D như dưới hình:

Vertex

Vertex là 1 điểm trong không gian 3D, nó chứa Position, Normal, Color và Texture coord. Position là tọa độ vị trí của vertex trong không gian 3D, Normal sẽ tìm hiểu sau, Color là màu của điểm và texture coord là tọa độ texture. Các vertex sẽ được nạp vào GPU và từ đó vẽ ra màng hình, kích thước vertex phải tối ưu đến nhỏ nhất có thể để khi dữ liệu vertex từ RAM đẩy ra GPU được nhanh chóng. Hình bên dưới thể hiện 3 vertex được khoanh tròn màu xanh tạo thành 1 tam giác.
Edge là 1 đường được tạo ra từ 2 vertex, như hình bên dưới là đường màu đỏ.

Triangle

Là nền tảng cơ bản để vẽ các vật thể phức tạp trong OpenGL, 1 triangle được vẽ từ 3 vertex. Mọi hình khác như đa giác, lập phương,...đến nhà cửa, cây cối đều được vẽ từ hai hay nhiều triangles. Ví dụ để vẽ 1 hình chữ nhật ta sử dụng 1 tam giác(triangle)...sử dụng các triangle để ghép nối tạo ra các hình phức tạp hơn từ nó.

Normal vector

Là vector vuông góc với mặt phẳng face. Chiều của vector được xác định theo quy tắt bàn tay phải: chiều nắm tay là thứ tự các đỉnh(hoặc là chiều ngón trỏ), chiều của ngón cái là chiều vector normal.
Với thứ tự các đỉnh theo chiều kim đồng hồ thì vector normal sẽ là màu xanh như hình bên dưới.
Normal thường sử dụng trong việc tính toán ánh sáng của vật thể.

Pixel

Đơn giản nó là 1 điểm trên màng hình, màu của nó được xác định bằng cách phối 3 kênh màu là Red, Green và Blue.

Texel

Là các pixel trong texture.

Fragment

Là các phần trung gian giữa vertex và pixel. Để phân biệt rỏ hơn về vertex, fragment và pixel ta có ví dụ như sau: 2 hình tam giác màu xanh và màu đỏ như bên dưới.
Các vertex là các điểm màu xanh lá cây của 2 tam giác(6 đỉnh). Các fragment là vùng màu xanh và màu đỏ(2 tam giác). Các pixel là màu xanh, đỏ và hồng(phần giao giữa 2 tam giác).

Phép chiếu song song và phép chiếu phối cảnh

Phép chiếu song song thường sử dụng trong hiển thị 2D, không thể hiện được chiều sâu cũng như tính chất 3D của vật thể.
Phép chiếu phối cảnh sử dụng để thể hiện các vật thể 3D, càng xa thì các kích thước càng giảm và tỉ lệ kích thước trên hình của các vật thể như nhau sẽ khác nhau nếu khoản cách đến mắt khác nhau.
Bên dưới là ví dụ về 2 phép chiếu:

Kênh màu

Mỗi pixel được tạo ra bằng cách kết hợp các màu cơ bản được gọi là các kênh màu gồm Red, Green bà Blue đối với 24bit color và có thêm kênh Alpha nếu là 32bit color.
Mỗi kênh màu có 1 giá trị từ 0 đến 255(1 byte), trong GLSL thì giá trị của nó là 1 số float nằm từ 0.0f đến 1.0f(sẽ gặp trong lập trình các shader).

References

1. https://vi.wikipedia.org/wiki/OpenGL

0 nhận xét :

Post a Comment