1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Group 7 graphic final report : Drawing Pixels, Bitmaps, Fonts, and Images

45 19 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Group 7 Graphic Final Report: Drawing Pixels, Bitmaps, Fonts, and Images
Tác giả Hàn T
Trường học OpenGL Programming Guide
Chuyên ngành Computer Graphics
Thể loại final report
Năm xuất bản 2022
Thành phố Thành phố
Định dạng
Số trang 45
Dung lượng 2,27 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

OpenGL 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 2

8.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 3

Bitmap 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 5

8.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 7

Mộ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 8

OpenGL 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 11

glClear(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 12

lý 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 13

Hì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 14

bộ đệ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 15

cù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 18

như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 19

cá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 20

số 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 22

1 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

Ngày đăng: 07/02/2022, 14:35

TỪ KHÓA LIÊN QUAN

w