Using Buffer Objects to Retrieve pixel data 26 Chương 8: Drawing Pixels, Bitmaps, Fonts, and Images Hai lớp dữ liệu quan trọng khác có thể được hiển thị bởi OpenGL: - Bitmap, thường được
Trang 1OpenGL Programming Guide
Chủ đề: Chapter 8: Drawing Pixels, Bitmaps, Fonts, and Images
Phân công công việc:
Hàn Tiến Khánh An Đọc và trình bày phần Bitmaps and
Fonts và ImagesNguyễn Đăng Hà Đọc và trình bày phần Imaging SubsetNguyễn Ngọc Tú Đọc và trình bày phần Imaging Pipeline
Nguyễn Mạnh Tuấn
Đọc và trình bày phần Reading andDrawing Pixel Rectangles và Using BufferObjects with Pixel Rectangle DataMạc Đình Minh Soạn documents và chuẩn bị slide
Trang 28.2 Images 8
8.2.2 Đọc dữ liệu pixel từ framebuffer tới bộ nhớ của bộ xử lý 98.2.3 Viết dữ liệu pixel từ framebuffer tới bộ nhớ của bộ xử lý 10
8.3.2 Magnifying, reducing or flipping an image 21
8.5.1 Using Buffer Objects to Transfer pixel data 258.5.2 Using Buffer Objects to Retrieve pixel data 26
Chương 8: Drawing Pixels, Bitmaps, Fonts, and Images
Hai lớp dữ liệu quan trọng khác có thể được hiển thị bởi OpenGL:
- Bitmap, thường được sử dụng cho các ký tự trong phông chữ
- Dữ liệu hình ảnh, có thể đã được quét hoặc tính toán
Cả bitmap và dữ liệu hình ảnh đều có dạng các mảng pixel hình chữ nhật
Trang 3Bitmap bao gồm một bit thông tin về mỗi pixel và dữ liệu hình ảnh thường baogồm một số phần dữ liệu trên mỗi pixel (ví dụ: các thành phần màu đỏ, xanh lácây, xanh lam và alpha hoàn chỉnh) Bitmap được sử dụng để phủ lên một hìnhảnh khác, nhưng dữ liệu hình ảnh chỉ đơn giản là ghi đè hoặc được kết hợp với bất
kỳ dữ liệu nào trong frame buffer
Chương này mô tả cách vẽ dữ liệu pixel (ảnh bitmap và hình ảnh) từ bộ nhớ của
bộ xử lý vào framebuffer và cách đọc dữ liệu pixel từ framebuffer vào bộ nhớ của
bộ xử lý Nó cũng mô tả cách sao chép dữ liệu pixel từ vị trí này sang vị trí khác,
từ bộ đệm này sang bộ đệm khác hoặc trong cùng một bộ đệm
8.1 Bitmaps and Fonts
● Bitmap là một mảng hình chữ nhật gồm 0 và 1 dùng làm mask để vẽ cho một phầnhình chữ nhật của window
- Các bit có giá trị là 1 thì sẽ hiển thị màu cho pixel đó
- Các bit có giá trị là 0 thì sẽ không hiển thị màu
Hình 8-1 cho thấy F dưới dạng một bitmap và dữ liệu bitmap tương ứng của nó
8.1.1 Vị trí raster
- Vị trí raster hiện tại là vị trí của màn hình mà bitmap (hoặc hình ảnh) tiếptheo sẽ được vẽ
Trang 4- Các biến x,y,z sẽ là vị trí tương ứng với các trục.
- Để lấy vị trí raster hiện tại, ta sẽ dùng câu lệnh glGetFloatv() với tham sốtruyền vào là GL_CURRENT_RASTER_POSITION và con trỏ tới mảng
chứa các biến x,y,z.
- Để kiểm tra xem vị trí raster có hợp lệ không thì sẽ dùng glGetBooleanv()với tham số GL_CURRENT_ RASTER_POSITION_VALID
8.1.2 Vẽ bitmap
Sau khi set được vị trí raster, sử dụng glBitmap() để vẽ.
- width và height là chiều dài và chiều rộng của bitmap.
- x bo , y bo là vị trí bắt đầu vẽ bitmap.
- x bi , y bi là vị trí nối tiếp để vẽ bitmap tiếp theo.
8.1.3 Chọn màu cho bitmap:
- Dùng câu lệnh glColor3f() trước câu lệnh vẽ bitmap
Trang 58.1.4 Phông và danh sách hiển thị
- Sử dụng câu lệnh: void glCallLists(GLsizei n, GLenum type,const GLvoid *lists
GLubyte letters[][13] = {
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18},
{0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
{0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
{0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e},
{0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06},
{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0},
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3},
Trang 6{0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
{0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c},
{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e},
{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}
Trang 7Một hình ảnh là một hình chữ nhật pixel tương tự như một bitmap Tuy nhiên, thay
vì chỉ chứa một bit duy nhất cho mỗi pixel trong một vùng hình chữ nhật của mànhình, một hình ảnh có thể chứa nhiều thông tin hơn Ví dụ: một hình ảnh có thểchứa một màu hoàn chỉnh (R, G, B, A) được lưu trữ tại mỗi pixel Hình ảnh có thểđến từ một số nguồn, chẳng hạn như:
• Một bức ảnh được số hóa bằng máy quét
• Hình ảnh được tạo trên màn hình bởi một chương trình đồ họa và sau đó đọc lạitừng pixel một
• Một chương trình phần mềm tạo ra hình ảnh trong bộ nhớ từng pixel
8.2.1 Đọc, viết, copy pixel data
Trang 8OpenGL cung cấp ba lệnh cơ bản để thao tác dữ liệu hình ảnh:
- glReadPixels (): Đọc một mảng pixel hình chữ nhật từ framebuffer và lưutrữ dữ liệu trong bộ nhớ bộ xử lý
- glDrawPixels (): Ghi một mảng pixel hình chữ nhật từ dữ liệu được lưutrong bộ nhớ bộ xử lý vào bộ đệm khung ở vị trí raster hiện tại
- glCopyPixels (): Sao chép một mảng pixel hình chữ nhật từ một phần của
bộ đệm khung sang phần khác
8.2.2 Đọc dữ liệu pixel từ framebuffer tới bộ nhớ của bộ xử lý.
- Đọc dữ liệu pixel từ framebuffer với tạo độ x,y từ góc bên trái dưới cửa sổ mànhình
- x, y là tọa độ bắt đầu để đọc pixel
- width và height là kích thước mảng pixel
Trang 9- format ảnh là kiểu dữ liệu của pixel.
- type kiểu dữ liệu tương ứng với format
8.2.3 Viết dữ liệu pixel từ framebuffer tới bộ nhớ của bộ xử lý.
- Vẽ một hình chữ nhật pixel data với kích thước chiều rộng và chiều cao.Hình chữ nhật pixel được vẽ với góc dưới bên trái của nó ở vị trí raster hiệntại
Trang 10- x, y là tọa độ bắt đầu để đọc pixel.
- width và height là kích thước mảng pixel
- format ảnh là kiểu dữ liệu của pixel
- type kiểu dữ liệu tương ứng với format
VD:
#define checkImageWidth 64
#define checkImageHeight 64
GLubyte checkImage[checkImageHeight][checkImageWidth][3];
Trang 11glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glDrawPixels(checkImageWidth, checkImageHeight,GL_RGB,
GL_UNSIGNED_BYTE, checkImage);
glFlush();
}
8.2.4 Sao chép pixel data trong framebuffer
- Sao chép dữ liệu pixel từ hình chữ nhật framebuffer đã đọc có góc dưới bên trái là(x, y) và có kích thước là chiều rộng và chiều cao Dữ liệu được sao chép sang một
vị trí mới trong framebuffer ghi có góc dưới bên trái được cung cấp bởi vị trí rasterhiện tại
8.3 Imaging Pipeline
Imaging Pipeline: các chế độ lưu trữ pixel và hoạt động truyền pixel, bao gồm
cách thiết lập ánh xạ tùy ý để chuyển đổi dữ liệu pixel
Khi glDrawPixels() được gọi, dữ liệu trước tiên được giải nén từ bộ nhớ bộ xử
Trang 12lý theo chế độ lưu trữ pixel đang được sử dụng, sau đó các hoạt động truyền pixelđược áp dụng Các điểm ảnh kết quả sau đó được phân loại (rasterized) Trong quátrình rasterization, cửa sổ hình chữ nhật có thể được phóng to hoặc thu nhỏ tùythuộc vào trạng thái hiện tại Cuối cùng, các hoạt động phân mảnh được áp dụng vàcác pixel được ghi vào bộ đệm khung
Khi glReadPixels() được gọi, dữ liệu được đọc từ bộ đệm khung, các hoạt
động truyền pixel được thực hiện và sau đó pixel data được đóng gói vào bộ nhớcủa bộ xử lý
glCopyPixels() áp dụng tất cả các phương thức truyền pixel trong quá trình gọi
hàm glReadPixels() Dữ liệu kết quả được ghi như nó được chạy bởiglDrawPixels(), nhưng các phép biến đổi này không được áp dụng lần thứ hai Hình8-6 cho thấy cách glCopyPixels() truyền pixel data từ bộ đệm khung
Trang 13Hình 8-7, có thể thấy rằng việc kết xuất(render) các ảnh bitmap đơn giản hơnviệc kết xuất(render) image Các phương thức truyền pixel hay thu phóng pixel đềukhông được áp dụng trong render bitmaps.
* Đóng gói và giải nén pixel Pixel Packing and Unpacking
Đóng gói và giải nén pixel đề cập đến cách thức mà dữ liệu pixel được ghi vào
và đọc từ bộ nhớ bộ xử lý(CPU)
Một hình ảnh được lưu trữ trong bộ nhớ có từ một đến bốn phần dữ liệu hayphần tử Dữ liệu có thể chỉ bao gồm chỉ số màu hoặc luminance (luminance là tổngtrọng số của các giá trị đỏ, lục và lam) hoặc có thể bao gồm các thành phần màu đỏ,xanh lục, xanh lam và alpha cho mỗi pixel Các sắp xếp có thể có của dữ liệu pixel(các định dạng) xác định số lượng phần tử được lưu trữ cho mỗi pixel và thứ tự củachúng
Một số phần tử (chẳng hạn như chỉ số màu hoặc chỉ mục stencil) là số nguyên
và những phần tử khác (chẳng hạn như thành phần màu đỏ, xanh lục, xanh lam,alpha hoặc thành phần độ sâu) là giá trị dấu phẩy động(th ực) , thường nằm trongkhoảng từ 0,0 đến 1,0 Các thành phần phẩy động(th ực) thường được lưu trữ trong
Trang 14bộ đệm khung với độ phân giải thấp hơn so với số phẩy động đầy đủ (ví dụ: cácthành phần màu có thể được lưu trữ trong 8 bit) Số lượng bit thực tế được sử dụng
để đại diện cho các thành phần phụ thuộc vào phần cứng cụ thể đang được sử dụng.Vậy nên, việc sử dụng 32-bit để lưu trữ một thành phần là rất lãng phí, đặc biệt khicác images có thể chứa hàng triệu pixel
*Kiểm soát các chế độ lưu trữ pixel Controlling Pixel-Storage Modes
Dữ liệu hình ảnh thường được lưu trữ trong bộ nhớ bộ xử lý(CPU) trong cácmảng hình chữ nhật hai hoặc ba chiều Thông thường chỉ hiển thị hoặc lưu trữ mộtsubimage tương ứng với một subrectangle của mảng
Pixel-storage modes là các quá trình quản lý việc căn chỉnh các byte trong quátrình truyền, nhận byte từ/đến framebuffer vào/từ CPU
Tất cả các chế độ lưu trữ pixel mà OpenGL hỗ trợ đều được điều khiển bằng
lệnh glPixelStore().
Các tên tham số có thể có cho pname được hiển thị trong Bảng 8-4 P.348 ,
Trang 15cùng với các kiểu dữ liệu, giá trị ban đầu và phạm vi giá trị hợp lệ của chúng
Các tham số GL_UNPACK * kiểm soát cách dữ liệu được giải nén từ bộ nhớ
Các tham số GL_PACK * kiểm soát cách dữ liệu được đóng gói vào bộ nhớ
GL_UNPACK_ SKIP_IMAGES và GL_PACK_SKIP_IMAGES chỉ ảnh hưởngđến kết cấu 3D (glTexImage3D (), glTexSubImage3D () và glGetTexImage (GL_TEXTURE) _3D,
Nếu tham số *SWAP_BYTES là FALSE (mặc định), thứ tự của các byte trong
bộ nhớ là default cho máy khách OpenGL; Ngược lại, các byte sẽ được đảo ngược.Việc đảo ngược byte áp dụng cho bất kỳ phần tử kích thước nào, nhưng chỉ có ýnghĩa đối với các phần tử nhiều byte
Hiệu quả của việc hoán đổi byte có thể khác nhau giữa các triển khai OpenGL.Nếu trong một triển khai, GLubyte có 8 bit, GLushort có 16 bit và GLuint có 32 bit
Trang 16( không ảnh hưởng đến dữ liệu đơn byte), thì Hình 8-10 minh họa cách hoán đổi cácbyte cho các kiểu dữ liệu khác nhau.
Tham số *LSB_FIRST chỉ áp dụng khi vẽ hoặc đọc hình ảnh 1-bit hoặcbitmap mà một bit dữ liệu được lưu hoặc khôi phục cho mỗi pixel Nếu
*LSB_FIRST là FALSE (mặc định), các bit được lấy từ các byte bắt đầu bằng bit cótrọng số lớn nhất; nếu không, thực hiện theo thứ tự ngược lại Ví dụ: nếu
*LSB_FIRST là FALSE và byte được đề cập là 0x31, các bit, theo thứ tự, là {0, 0,
1, 1, 0, 0, 0, 1} Nếu * LSB_FIRST là TRUE, thứ tự là {1, 0, 0, 0, 1, 1, 0, 0}
Khi chỉ vẽ hoặc đọc một hình chữ nhật con của 1 hình chữ nhật chứa dữ liệuhình ảnh được lưu trong bộ nhớ, nếu hình chữ nhật trong bộ nhớ lớn hơn hình chữnhật con đang được vẽ hoặc đọc, cần chỉ định chiều dài thực tế (tính bằng pixel) củahình chữ nhật lớn hơn bằng *ROW_LENGTH Nếu *ROW_LENGTH bằng 0 (theomặc định), chiều dài hàng được hiểu là giống với chiều rộng được chỉ định Tương
tự, cần chỉ định số hàng và số pixel cần bỏ qua trước khi bắt đầu sao chép dữ liệucho hình chữ nhật con Những con số này được thiết lập bằng cách sử dụng cáctham số * SKIP_ROWS và * SKIP_PIXELS Theo mặc định, cả hai tham số đềubằng 0, vì vậy bắt đầu ở góc dưới bên trái
Trang 17*Cơ chế pixel-transfer Pixel_Transfer Operations
Các chuyển đổi được thực hiện trong quá trình truyền các pixel đến và từ bộđệm khung được gọi là các hoạt động truyền pixel Khi dữ liệu hình ảnh đượctruyền từ bộ nhớ vào framebuffer hoặc từ framebuffer vào bộ nhớ, OpenGL có thểthực hiện một số thao tác trên đó Ví dụ: phạm vi của các thành phần có thể đượcthay đổi — thông thường, thành phần màu đỏ nằm trong khoảng từ 0,0 đến 1,0,
Trang 18nhưng có thể set nó sang một phạm vi khác; hoặc có lẽ dữ liệu đang sử dụng là từmột hệ thống đồ họa khác lưu trữ thành phần màu đỏ trong một phạm vi khác Được
điều khiển bằng các lệnh glPixelTransfer() và glPixelMap().
Các tham số sử dụng được trình bày trong bảng 8.5 P.352, 353
Nếu tham số GL_MAP_COLOR hoặc GL_MAP_STENCIL là TRUE, thì ánh
xạ được bật Tất cả các tham số khác ảnh hưởng trực tiếp đến các giá trị thành phầnpixel
Scale và bias có thể được áp dụng cho các thành phần màu đỏ, xanh lá cây,xanh lam, alpha và độ sâu Ví dụ: bạn có thể muốn chia tỷ lệ các thành phần màu
đỏ, xanh lục và xanh lam đã được đọc từ bộ đệm khung trước khi chuyển đổi chúngsang định dạng luminance trong bộ nhớ bộ xử lý Luminance được tính bằng tổngcác thành phần màu đỏ, xanh lục và xanh lam, vì vậy nếu sử dụng giá trị mặc địnhcho GL_RED_SCALE, GL_GREEN_SCALE và GL_BLUE_SCALE, tất cả cácthành phần đều đóng góp như nhau vào giá trị cường độ hoặc độ sáng cuối cùng
Chỉ số (màu và stencil) cũng có thể được chuyển đổi Điều này rất hữu ích nếucần kiểm soát phần nào của bảng màu được sử dụng trong quá trình kết xuất
*Pixel Mapping
Tất cả các thành phần màu, chỉ số màu và chỉ số stencil có thể được sửa đổibằng cách tra cứu bảng trước khi chúng được đưa vào bộ nhớ màn hình Lệnh để
điều khiển ánh xạ này là glPixelMap().
Tải các pixel map được ánh xạ với các entry trong bảng có kích thước map, có
Trang 19các giá trị được trỏ đến Bảng 8-6 (P.254) liệt kê các tên và giá trị map; tất cả cáckích thước mặc định đều là 1 và các giá trị mặc định đều là 0 Kích thước của mỗimap phải là lũy thừa của 2.
Kích thước tối đa của bản đồ phụ thuộc vào máy
glGetIntegerv(): tìm kích thước của pixel map được hỗ trợ trên máy của mình.
Sử dụng đối số truy vấn GL_MAX_PIXEL_MAP_TABLE để có được kích thướctối đa cho tất cả các bảng pixel map và sử dụng GL_PIXEL_MAP _ * _ TO _ * _SIZE để có được kích thước hiện tại của map cụ thể Sáu map có địa chỉ là chỉ mụcmàu hoặc chỉ mục stencil phải luôn được định kích thước bằng lũy thừa của 2 Bốnbản đồ RGBA có thể có kích thước bất kỳ từ 1 đến GL_MAX_PIXEL_MAP_TABLE
Ví dụ cách hoạt động của bảng: Giả sử tạo một bảng 256 entry ánh xạ các chỉ
Trang 20số màu với chỉ số màu bằng GL_PIXEL_MAP_I_TO_I, tạo một bảng với mỗi entrycho mỗi giá trị từ 0 đến 255 và khởi tạo bảng bằng glPixelMap()
Giả sử sử dụng bảng để lập ngưỡng và muốn ánh xạ các chỉ số dưới 101 (chỉ
số 0 đến 100) thành 0 và tất cả các chỉ số từ 101 trở lên thành 255 Trong trườnghợp này, bảng bao gồm 101 số 0 và 155 số 255 Pixel map được chạy bằng cách sửdụng glPixelTransfer() để đặt tham số GL_MAP_COLOR thành TRUE Sau khibản đồ pixel được tải và kích hoạt, các chỉ số màu dưới 101 sẽ hiển thị dưới dạng 0
và các pixel đến từ 101 đến 255 được ánh xạ thành 255 Nếu pixel đến lớn hơn 255,thì pixel đầu tiên sẽ được che đi bởi 255, loại bỏ tất cả bit trên thứ tám và giá trị bịche được tra cứu kết quả trong bảng Nếu chỉ mục đến là một giá trị phẩy động (giả
sử 88.14585), thì nó sẽ được làm tròn thành giá trị số nguyên gần nhất (cho 88) và
số đó được tra cứu trong bảng
Sử dụng bản đồ pixel có thể ánh xạ các chỉ số stencil hoặc chuyển đổi các chỉ
số màu thành RGB
*Phóng to, thu nhỏ, lật ảnh Magnifying, reducing or flipping an image
Sau khi áp dụng các chế độ lưu trữ pixel và hoạt động truyền pixel, hình ảnh
và bitmap sẽ được phân loại Thông thường, mỗi pixel trong một hình ảnh được ghivào một pixel trên màn hình Tuy nhiên, bạn có thể tùy ý phóng to, thu nhỏ hoặc
thậm chí lật (phản chiếu) hình ảnh bằng cách sử dụng glPixelZoom().
Trang 21Đặt hệ số phóng đại hoặc thu nhỏ cho các thao tác ghi pixel theo kích thước x
và y Theo mặc định, zoomx và zoomy là 1.0 Nếu cả hai đều là 2.0, mỗi pixel hìnhảnh được vẽ thành 4 pixel màn hình
Trong quá trình rasterization, mỗi pixel hình ảnh được coi như một hình chữnhật phóng to thu nhỏ và các phân mảnh được tạo cho tất cả các pixel có tâm nằmtrong hình chữ nhật Nếu một nhóm phần tử cụ thể là phần tử thứ n trong hàng vàthứ m thuộc cột, xét vùng trong tọa độ cửa sổ được giới hạn bởi hình chữ nhật vớicác góc ở:
(xrp + zoomx n, yrp + zoomy m)
và (xrp + zoomx (n + 1), yrp + zoomy (m + 1))
xrp, yrp là vị trí raster hiện tại
Bất kỳ mảnh nào có tâm nằm bên trong hình chữ nhật này (hoặc ở ranh giớibên dưới hoặc bên trái của nó) đều được tạo ra tương ứng với nhóm phần tử cụ thểnày
Zoom âm có thể hữu ích để lật ảnh OpenGL mô tả hình ảnh từ hàng pixeldưới lên trên và từ trái sang phải Nếu có hình ảnh “từ trên xuống dưới”, chẳng hạnnhư frame video, có thể sử dụng glPixelZoom (1.0, -1.0) để làm cho hình ảnh thànhphía bên phải
8.4 Reading and Drawing Pixel Rectangles
The pixel rectangle reading process
Trang 221 Nếu các pixel không phải là chỉ số (nghĩa là nếu định dạng không phải làGL_COLOR_ INDEX hoặc GL_STENCIL_INDEX), thì bước đầu tiên là chuyểnđổi các thành phần sang định dạng phẩy động nếu cần
2 Nếu định dạng là GL_LUMINANCE hoặc GL_LUMINANCE_ALPHA, phần
tử luminance được chuyển đổi thành R, G và B bằng cách sử dụng giá trịluminance cho từng thành phần R, G và B Ở định dạng GL_LUMINANCE_ALPHA, giá trị alpha trở thành giá trị A Nếu GL_LUMINANCEđược chỉ định, giá trị A được đặt thành 1.0
3 Mỗi thành phần R, G, B, A hoặc độ sâu được nhân với thang đo thích hợp và độchệch thích hợp được thêm vào Ví dụ: thành phần R được nhân với giá trị tươngứng với GL_RED_SCALE và được thêm vào giá trị tương ứng vớiGL_RED_BIAS