nhằm mục đích tạo đồ họa cho nền tảng smartphone vì một số hàm trong OpenGL gốc không còn thích hợp với cấu hình phần cứng của các dòng smartphone.. Primitives của OpenGL được giới hạn t
Trang 1-
BÁO CÁO
MÔN: CÁC VẤN ĐỀ HIỆN ĐẠI CÔNG NGHỆ PHẦN MỀM
NGÀNH: CÔNG NGHỆ THÔNG TIN
ĐỀ TÀI: TÌM HIỂU OPENGL ES 2.0
GV đánh giá: TS.Võ Đình Hiếu
Sinh viên: Lê Thái Hòa Nhóm:
Hà Nội, tháng 12 năm 2013
Trang 2Mục Lục
I GIỚI THIỆU ĐỀ TÀI 3
1 Nội dung đề tài 3
2 Lý do chọn đề tài 3
II.PHÂN TÍCH ĐỀ TÀI 5
Phần 1 - Các khái niệm cơ bản của thế giới 3D và OpenGL 5
1 Đối thủ lớn nhất của OpenGL 6
2 OpenGL làm việc như thế nào? 6
3 Logic của OpenGL 7
3.1 Primitives 7
3.2 Bộ đệm (Buffers) 8
3.3 Rasterize 8
4 Đường ống dẫn của OpenGL 9
4.1 Vertex Shader 9
4.2 Fragment Shader 9
Phần 2: Đi xâu vào OpenGL ES 2.0 10
1 Các kiểu dữ liệu OpenGL và đường ống dẫn lập trình 10
2 Primitives 12
3 Bộ đệm (Buffers) 14
3.1 Khung đệm (Frame Buffers) 14
3.2 Làm đệm (Render Buffers) 15
4 Kết cấu (Texture) 19
5 Rasterize 24
6 Shaders 28
7 Rendering 38
Trang 37.1 Pre-Render 38
7.2 Bản vẽ (Drawing) 39
7.3 Render 41
Phần 3: Đồ họa 2D với OpenGL ES 2.0 41
TÀI LIỆU THAM KHẢO 43
Books 43
Trang 4I GIỚI THIỆU ĐỀ TÀI
1 Nội dung đề tài
Tên đề tài: Nghiên cứu về OpenGL ES 2
Đề tài được triển khai qua 3 phần
Phần 1: Các khái niệm cơ bản của thế giới 3D và OpenGL
Phần 2: Đi xâu vào OpenGL ES 2.0
Phần 3: Đồ họa 2D với OpenGL ES 2.0
2 Lý do chọn đề tài
Game là một lĩnh vực giải trí hiện đang được coi là HOT cho tất cả các nền tảng hiện nay, đặc biệt nói đến là smartphone Khi nói tới giải trí, chúng ta thường nghĩ tới game Đôi khi game cũng được sử dụng như một công cụ giáo dục Game được phát triển cho nhiều thiết bị như PC, smartphone, các thiết bị cầm tay hoặc chạy ngay trên chính trình duyệt web Các nền tảng cho phép phát triển game có thể kể đến là các hệ điều hành cho máy tính: Windows, Linux, Mac, ,hệ điều hành smartphone: iOS, Android, WindowsPhone, Symbian, Bada, Game được phát triển bởi hầu hết các ngôn ngữ lập trình tùy thuộc độ mềm dẻo và yêu cầu của game Ngoài ra trong cuộc sống cần sử dụng tới rất nhiều ứng dụng như CAD, thực tế ảo, mô phỏng khoa học, mô phỏng thông tin
Khi nhắc tới game và các ứng dụng kể trên chúng ta nghĩ ngay tới đồ họa của
nó như thế nào? Vậy tại sao lại cần đồ họa và cái gì làm nên đồ họa? OpenGL sẽ trả lời câu hỏi này cho chúng ta OpenGL (tên 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 hoặc 2 chiều OpenGL còn có đối thủ cạnh tranh là DirectX của Microsoft
OpenGL ES là một sản phẩm miễn phí bao gồm các hàm API cho phép tạo các ứng dụng 2D, 3D trên các ứng dụng nhúng – bao gồm các thiết bị cầm tay Nó được định nghĩa như là một tập con của OpenGL, tạo ra tính linh hoạt, mạnh mẽ trên giao diện cấp thấp giữa phần mềm và đồ họa OpenGL ES được phát triển
Trang 5nhằm mục đích tạo đồ họa cho nền tảng smartphone vì một số hàm trong OpenGL gốc không còn thích hợp với cấu hình phần cứng của các dòng smartphone OpenGL ES2.0 là phiên bản 2.0 của OpenGL ES Được cải tiến so hơn so với phiên bản trước là OpenGL ES1.0 và OpenGL ES1.1
Smartphone hiện đang là xu thế công nghệ hiện nay về tính tiện dụng Vì vậy việc phát triển đồ họa trên smartphone là rất cần thiết Nói tới đây chúng ta cũng
dễ hiểu được tầm quan trọng của OpenGL ES trong công nghiệp đồ họa hiện nay
Trang 6II.PHÂN TÍCH ĐỀ TÀI
Phần 1 - Các khái niệm cơ bản của thế giới 3D và OpenGL
OpenGL có nghĩa là mở cửa thư viện đồ họa và nó được sử dụng rất nhiều hiện nay trong ngôn ngữ máy tính OpenGL là điểm gần nhất giữa CPU (mà các nhà phát triển chạy các ứng dụng dựa trên một ngôn ngữ) và GPU (bộ xử lý đồ họa của tồn tại trong tất cả các card đồ họa) Vì vậy, OpenGL cần phải được hỗ trợ bởi các nhà cung cấp của card đồ họa (như NVIDIA) và được thực hiện bởi các nhà cung cấp của hệ điều hành (như Apple trong hệ điều hành MacOS và iOS) và cuối cùng
là cung cấp cho OpenGL, các nhà phát triển, một API thống nhất để làm việc API này là "ngôn ngữ miễn phí" (hoặc gần như miễn phí) Điều này là tuyệt vời, bởi vì nếu bạn sử dụng C, C++, hoặc Objective-C, hoặc Perl, hoặc C #, hoặc JavaScript, bất cứ nơi nào sử dụng, API sẽ luôn luôn được hỗ trợ tương đương, sẽ trình bày các hành vi tương tự, các chức năng tương tự, với cùng lệnh! Để đối phó với API OpenGL của các nhà phát triển
Trước khi bắt đầu nói về OpenGL API tôi xin trình bày một chút kiến thức về thế giới 3D, lịch sử 3D
Khoảng 20 năm trước có 1 người tên là Silicon Graphics (SGI) đã làm 1 loạt các thiết bị Các thiết bị đó có thể thể hiện 1 ảnh ảo của thực tế trong thế giới hình ảnh 2D Thiết bị này còn thể hiện hình ảnh 3D, mô phỏng các nhìn và chiều sâu của mắt người Thiết bị này gọi là IrisGL (Có lẽ thiết bị này bởi vì nó sẽ cố gắng
để mô phỏng mống mắt của mắt)
Vâng thiết bị trên là thư viện đồ họa vĩ đại đầu tiên Nhưng nó biến mất rất nhanh, bởi vì để thực hiện những gì mà nó làm thì cần phải điều khiển nhiều thứ trong CPU như card đồ họa, hệ thống Windows, ngôn ngữ Nó là quá nhiều để 1 công ty quản lý Vì vậy SGI để lại một số thứ như "Tạo ra card đồ họa", "Quản lý windows." cho các công ty khác và SGI tập chung vào phần quan trọng nhất của thư viện đồ họa Trong năm 1992 khởi chạy lần đầu tiên
Trang 7Trong năm 1995 Microsoft phát hành Direct3D, đối thủ cạnh tranh của OpenGL Và năm 1997 Opengl 1.1 ra đời Nhưng thực sự thú vì là năm 2004 với
sự ra đời của OpengL 2.0 với nhiều thay đổi lớn, Shaders, Programable Pipeline Vào năm 2007 chúng ta gặp được Opengl es2.0 nó mang đến cho chúng ta sức mạnh thực sự của Shaders, Programable pipeline và hệ thống nhúng
(Embedded Systems)
Chúng ta có thể nhìn thấy logo của OpenGL (hoặc OpenGL ES) trong nhiều trò chơi, các ứng dụng 3D, các ứng dụng 2D và rất nhiều phần mềm đồ họa (đặc biệt trong các phần mềm 3D) OpenGL ES được sử dụng bởi PlayStation, Android, Nintendo 3DS, Nokia, Samsung, Symbian và dĩ nhiên bởi Apple với hệ điều hành MacOS và iOS
1 Đối thủ lớn nhất của OpenGL
Opengl ra đời 1992, tại thời điểm đó Microsoft (MS) có window 3.1 MS tin rằng không có gì được tạo ra, mọi thứ được sao chép MS cố gắng sao chép tất cả của Opengl và họ có Direct3D và giới thiệt nó vào năm 1995 trên Windows 95 Một năm sau đó 1996 MS giới thiệu Direct3D là 1 bản sao đen của Opengl,
ưu điểm lại là MS thống trị thị trường thông tin trong nhiều năm liền, và Direct3D
đã có được lợi thế và nó lây lan như là bệnh dịch của máy tính và sau đố MS cung cấp các hệ điều hành cho Mobile và các trò chơi, tất nhiên là đi cùng với Direct3D
Ngày nay Direct3D tương tự như Opengl Có HLSL, cũng có programable pipeline, và fixed pipeline, và thậm chí các tên Hàm cũng tương tự Nhưng sự khác biệt rất lớn là OpengL là mã nguồn mở, còn Direct3D thì không Opengl dành cho mọi hệ điều hành, trong khi Direct chỉ WinDows
2 OpenGL làm việc như thế nào?
Sâu vào cốt lõi của OpenGL các tính toán được thực hiện trực tiếp trong các GPU sử dụng tăng tốc phần cứng đến các điểm nổi
CPU (Central Processing Unit) là bộ xử lý của một máy tính hoặc thiết
bị GPU (Graphics Processing Unit) là card đồ họa của một máy tính hoặc thiết
bị Card đồ họa đi kèm để giảm bớt cuộc sống của bộ xử lý vì nó có thể làm cho rất nhiều tính toán để đối phó với hình ảnh trước khi mặt nội dung ra màn hình
Trang 8Vì vậy, trong sâu thẳm, những gì OpenGL làm là để cho tất cả các tính toán khối lượng cho GPU, thay vì để tính toán tất cả trong CPU GPU nhanh hơn nhiều
để đối phó với số point nổi hơn CPU Đây là lý do cơ bản để một trò chơi 3D chạy nhanh hơn với card đồ họa tốt hơn Điều này thậm chí còn có lý do vì phần mềm chuyên nghiệp 3D cung cấp cho bạn một tùy chọn để làm việc với "phần mềm của Render" (xử lý CPU) hoặc "Card đồ họa của Render" (xử lý của CPU) Một số phần mềm cũng cung cấp một tùy chọn "OpenGL" Lựa chọn đó là xử lý của GPU! Nhưng OpenGL không hoàn toàn làm việc trong GPU Chỉ cần một xử lý hình ảnh cứng và vài thứ khác OpenGL cho chúng ta rất nhiều tính năng để lưu trữ hình ảnh, dữ liệu và thông tin trong một định dạng được tối ưu hóa Những dữ liệu được tối ưu hóa sẽ được xử lý sau trực tiếp bởi GPU
Nếu phần cứng (card đồ họa) không hỗ trợ OpenGL, chúng ta không thể sử dụng nó Phiên bản mới OpenGL thường cần các tính năng GPU mới Trong thực tế, tất cả các chip card đồ họa ngày nay có thực hiện với OpenGL Vì vậy, bạn có thể sử dụng OpenGL trong nhiều ngôn ngữ và các thiết bị Ngay cả trong Microsoft Windows
3 Logic của OpenGL
OpenGL là một thư viện đồ họa rất ngắn gọn và tập trung
Primitives của OpenGL được giới hạn trong 3 loại đối tượng:
Về một điểm trong không gian 3D (x, y, z)
Về Dòng 3D trong không gian (tạo bởi hai điểm 3D)
Về một Tam giác 3D trong không gian (tạo bởi ba điểm 3D)
Một điểm 3D có thể được sử dụng như một hạt trong không gian
Một dòng 3D luôn luôn là một dòng đơn và có thể được sử dụng như một vector 3D
Một Tam giác 3D có thể là một khuôn mặt của một lưới trong đó có hàng ngàn, có
lẽ hàng triệu mặt
Một số phiên bản OpenGL cũng hỗ trợ Quads (tứ) Nhưng như OpenGL ES đã được thực hiện để đạt được hiệu suất tối đa, Quads không được hỗ trợ, tất cả được quy về tam giác
Trang 9về phần nhìn thấy được của các đối tượng Vì vậy, khung đệm giống như một bộ sưu tập các hình ảnh Tất cả các lưu trữ như là một mảng nhị phân của thông tin của điểm ảnh
Làm đệm là một lưu trữ tạm thời của một hình ảnh duy nhất Có thể thấy rõ hơn rằng một khung đệm là một bộ sưu tập của Render đệm Tồn tại vài loại
Render đệm: Màu sắc, độ sâu và Stencil
Đệm đối tượng (Object Buffers) là một lưu trữ mà OpenGL gọi là
"server-side" (hoặc không gian địa chỉ của máy chủ) Các đệm đối tượng cũng là một lưu trữ tạm thời, nhưng không vì thế tạm thời như những người khác Một đối tượng đệm có thể kéo dài suốt việc thực hiện ứng dụng Đệm đối tượng có thể chứa thông tin về các đối tượng 3D của bạn trong một định dạng được tối ưu
hóa Những thông tin có thể được của hai loại: cấu trúc hoặc chỉ số
Cấu trúc là mảng mô tả đối tượng 3D của bạn, giống như một mảng của đỉnh, một loạt các tọa độ kết cấu hoặc một mảng của bất cứ điều gì bạn muốn Các chỉ
số có nhiều chi tiết cụ thể Mảng của các chỉ số được sử dụng để cho biết bao khuôn mặt của lưới của bạn sẽ được xây dựng dựa trên một mảng của cấu trúc
3.3 Rasterize
Các rasterize là quá trình mà OpenGL có tất cả các thông tin về các đối tượng 3D (tất cả những tọa độ, đỉnh, toán học, ) để tạo ra một hình ảnh 2D Hình ảnh này sẽ bị một số thay đổi và sau đó nó sẽ được trình bày trên màn hình của thiết bị (thường)
Nhưng bước cuối cùng này, là cầu nối giữa thông tin pixel và màn hình của thiết bị, đó là trách nhiệm của nhà cung cấp
Trang 104 Đường ống dẫn của OpenGL
Các đường ống dẫn lập trình là thư viện đồ họa ủy thác cho các nhà phát triển, trách nhiệm của tất cả mọi thứ liên quan đến máy ảnh, ánh sáng, vật liệu và các hiệu ứng Và có thể làm việc với Shaders Vì vậy, mỗi khi bạn nghe về "đường ống dẫn lập trình" thì nghĩ tới Shaders!
Shaders là những mảnh nhỏ của mã, giống như các chương trình nhỏ, làm việc trực tiếp trong các GPU để thực hiện tính toán phức tạp Điều này có nghĩa bất cứ điều gì, nó rất phức tạp được xử lý bởi CPU và quá nhiều phức tạp để thư viện đồ họa tiếp tục quan tâm Vì vậy, các đường ống dẫn lập trình chỉ là chúng ta quản lý các làm việc của GPU
Đường ống cố định là thư viện đồ họa quan tâm đến tất cả các loại của sự vật
và đưa cho chúng tôi một API để thiết lập Máy ảnh, vật liệu, ánh sáng và các hiệu ứng
Để tạo các bóng đổ, có thể sử dụng một ngôn ngữ tương tự như C, sử dụng OpenGL ngôn ngữ Shader (GLSL) OpenGL ES sử dụng một phiên bản ít nghiêm ngặt hơn được gọi là OpenGL ES Shader Ngôn ngữ (còn gọi là GLSL ES hoặc Essl) Sự khác biệt là bạn có nhiều chức năng cố định và có thể viết các biến hơn trong GLSL hơn trong GLSL ES, nhưng sintax là như nhau
Các shaders làm việc theo cặp: Vertex Shader và Fragment Shader Đường ống dẫn lập trình OpenGL của sử dụng một Shader Vertex và một Fragment Shader
4.1 Vertex Shader
Vertex Shader, còn được gọi là VS hay VSH là một chương trình nhỏ mà sẽ được thực hiện tại mỗi Vertex của một lưới
Những gì Vertex Shader sẽ làm là xác định vị trí cuối cùng của một Vertex
Vị trí và ống kính của một máy ảnh có thể can thiệp vào vị trí cuối cùng của một đỉnh Vertex Shader cũng chịu trách nhiệm chuẩn bị và đầu ra một số biến vào Fragment Shader Trong OpenGL chúng ta có thể định nghĩa biến cho Vertex Shader, nhưng chưa tính đến Fragment Shader Bởi vì đó, các biến Fragment phải
đi qua Vertex Shader
4.2 Fragment Shader
Bên trong Fragment Shader làm việc với tất cả mọi thứ liên quan đến "bề mặt lưới, như nguyên vật liệu, hiệu ứng, bóng và hiệu ứng ánh sáng, phản xạ, khúc xạ,
Trang 11kết cấu và các loại khác của hiệu ứng Kết quả cuối cùng để các Fragment Shader
là một màu của điểm ảnh trong các định dạng RGBA
Về cách VSH và FSH làm việc với nhau Nó bắt buộc một Vertex Shader để làm việc với một Fragment Shader, không nhiều thì ít, phải được chính xác 1-1
Phần 2: Đi xâu vào OpenGL ES 2.0
1 Các kiểu dữ liệu OpenGL và đường ống dẫn lập trình
OpenGL phục vụ đa nền tảng và phụ thuộc vào việc thực hiện các nhà cung cấp, nhiều kiểu dữ liệu có thể thay đổi từ một ngôn ngữ lập trình khác Ví dụ, một float trong C++ có thể đại diện cho 32 bit, nhưng trong JavaScript một float có thể
là chỉ 16 bit Để tránh những loại xung đột, OpenGL luôn luôn làm việc với các kiểu dữ liệu riêng của nó Kiểu dữ liệu của OpenGL có tiền tố "GL",
như GLfloat hoặc GLint Dưới đây là một danh sách đầy đủ các kiểu dữ liệu của
OpenGL:
OPENGL’S
DATA TYPE SAME AS C DESCRIPTION
GLboolean (1 bits) unsigned char 0 to 1
GLbyte (8 bits) char -128 to 127
GLubyte (8 bits) unsigned char 0 to 255
GLchar (8 bits) char -128 to 127
GLshort (16 bits) short -32,768 to 32,767
GLushort (16 bits) unsigned short 0 to 65,353
GLint (32 bits) int -2,147,483,648 to
2,147,483,647
GLuint (32 bits) unsigned int 0 to 4,294,967,295
GLfixed (32 bits) int -2,147,483,648 to
2,147,483,647
Trang 12GLsizei (32 bits) int -2,147,483,648 to
GLbitfield (32
GLfloat (32 bits) float -2,147,483,648 to
GLintptr int pointer *
GLsizeiptr int pointer *
GLvoid void Can represent any data type Một thông tin rất quan trọng về các loại dữ liệu là OpenGL ES không hỗ trợ 64 bit kiểu dữ liệu, bởi vì các hệ thống nhúng thường cần hiệu suất và một số thiết bị không hỗ trợ bộ vi xử lý 64 bit Bằng cách sử dụng các kiểu dữ liệu OpenGL, bạn
có thể dễ dàng và an toàn di chuyển ứng dụng OpenGL của bạn từ C ++ JavaScript với những thay đổi ít hơn
Đây là một minh họa trực quan về các đường ống dẫn trong OpenGL:
Trang 13OpenGL đường ống dẫn lập trình
2 Primitives
Khi nói rằng Primitives tức là nhắc tới điểm, đường và tam giác
Tất cả đều sử dụng một hoặc nhiều điểm trong không gian được xây dựng, còn được gọi là đỉnh
Một đỉnh có 3 thông tin, vị trí X, Y và Z Một điểm 3D được xây dựng bởi một đỉnh, một dòng 3D được tạo bởi hai đỉnh và một hình tam giác được hình thành bởi ba đỉnh Như OpenGL luôn luôn muốn tăng hiệu suất, tất cả các thông tin phải là một mảng chiều duy nhất, cụ thể hơn là một mảng các giá trị nổi Như thế này:
1 GLfloat Point3D = {1.0,0.0,0.5};
Trang 14Các tọa độ trên sẽ xây dựng một cái gì đó như thế này:
Bây giờ, tất cả những gì chúng ta cần phải biết là 3D phức tạp nhất sẽ được thực hiện với một loạt các hình tam giác Gọi những hình tam giác của "khuôn mặt" Vì vậy, tạo ra một khối lập phương 3D ta sử dụng một loạt các đỉnh
Trang 1511
12
-0.50,0.50,0.50 / / đỉnh 8
}
Thông thường mắt lưới có ba thông tin lớn: verticex, tọa độ kết cấu và pháp
tuyến Đây được gọi là mảng của cấu trúc Một ví dụ ngắn:
3.1 Khung đệm (Frame Buffers)
Một Frame Buffers là một lưu trữ tạm thời để cho đầu ra Có thể chọn hiện nó vào màn hình điện thoại hoặc lưu nó như một tập tin hình ảnh hoặc hoặc sử dụng đầu ra như là một ảnh chụp
Đây là cặp chức năng liên quan đến bộ đệm khung hình:
GLvoid glGenFramebuffers (GLsizei n, GLuint * framebuffers)
n : Số lượng đại diện cho bao nhiêu tên / id khung đệm sẽ được tạo ra
cùng một lúc
framebuffers : Một con trỏ tới một biến để lưu trữ các tạo ra tên /
id Nếu có nhiều hơn một tên / id được tạo ra, con trỏ này sẽ trỏ đến đầu của một mảng
GLvoid glBindFramebuffer (Glenn target, GLuint framebuffer)
target: Mục tiêu sẽ luôn luôn được GL_FRAMEBUFFER, đây chỉ là
một ước nội bộ cho OpenGL
framebuffers : Tên / id của bộ đệm khung hình bị ràng buộc
Trang 163.2 Làm đệm (Render Buffers)
Render Buffers là một lưu trữ tạm thời cho hình ảnh đến từ một của OpenGL render Đây là cặp chức năng liên quan để làm cho bộ đệm:
GLvoid glGenRenderbuffers (GLsizei n, GLuint * làm bộ đệm)
n : Số lượng đại diện cho bao nhiêu làm cho tên / id bộ đệm sẽ
được tạo ra cùng một lúc
renderbuffers : Một con trỏ tới một biến để lưu trữ các tạo ra tên
/ id Nếu có nhiều hơn một tên / id được tạo ra, con trỏ này sẽ trỏ đến đầu của một mảng
GLvoid glBindRenderbuffer (GLenum target, GLuint renderbuffer)
target : Mục tiêu sẽ luôn luôn được GL_RENDERBUFFER, đây
chỉ là một ước nội bộ cho OpenGL
renderbuffer : render tên đệm / id bị ràng buộc
GLvoid glRenderbufferStorage (Glenum target, GLenum internalformat, GLsizei width, Glsizei height)
target : Mục tiêu sẽ luôn luôn được GL_RENDERBUFFER, đây
chỉ là một ước nội bộ cho OpenGL
internalformat : Điều này chỉ ra loại đệm và những gì màu định
dạng hình ảnh tạm thời này sẽ sử dụng Tham số này có thể là:
o GL_RGBA4 , GL_RGB5_A1 hoặc GL_RGB56 đến một bộđệm làm với màu sắc cuối cùng;
o GL_DEPTH_COMPONENT16 đến một bộ đệm làm với Z
chiều sâu;
o GL_STENCIL_INDEX hoặc GL_STENCIL_INDEX8 đến một
bộ đệm làm với thông tin giấy nến
width : chiều rộng cuối cùng của một bộ đệm làm
height : Chiều cao cuối cùng của một bộ đệm làm
Để đính kèm RenderBuffers làm vào một bộ đệm khung hình ta có chức năng sau:
GLvoid glFramebufferRenderbuffer (Glenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
target : Mục tiêu sẽ luôn luôn được GL_FRAMEBUFFER, đây
chỉ là một ước nội bộ cho OpenGL
Trang 17 attachment : này quy định những loại làm bộ đệm, chúng tôi
muốn đính kèm trong một bộ đệm khung hình, tham số này có thể là:
renderbuffertarget : Các renderbuffertarget sẽ luôn luôn được
GL_RENDERBUFFER, đây chỉ là một ước nội bộ cho OpenGL
renderbuffer : Tên / id của bộ đệm làm cho chúng tôi muốn đính
kèm
Mối quan hệ giữa Khung đệm và Render đệm
Trang 18Trong OpenGL luôn luôn làm việc với một bộ đệm khung Này được gọi là cửa sổ hệ thống cung cấp bộ đệm khung và khung đệm tên / id 0 được dành riêng cho nó Các bộ đệm khung hình mà chúng tôi kiểm soát được biết như khung ứng dụng tạo ra các vùng đệm
Để tối ưu hóa tất cả các State tùy chọn, OpenGL có một cách để bật và tắt State
GLvoid glEnable (GLenum capability)
capability : Các tính năng được bật Các giá trị có thể là:
GLvoid glDisable (GLenum capability)
capability : Các tính năng được tắt Các giá trị có thể được giống
như glEnable
Một khi chúng ta bật / tắt tính năng, hướng này sẽ ảnh hưởng đến toàn bộ bộ máy OpenGL Một số người thích để bật một tính năng chỉ trong một thời gian sử dụng nó và sau đó tắt, nhưng điều này là không nên Nó rất phức tạp Cách tốt nhất
là bật một lần và tắt một lần Hoặc nếu thực sự cần, giảm thiểu bật / tắt trong ứng dụng của
Như trong ví dụ khối của chúng ta, chúng ta chỉ cần một bộ đệm chiều sâu, chúng ta có thể viết:
glEnable (GL_DEPTH_TEST);
3.3 Đối tượng bộ đệm (Buffer Objects)
Các đối tượng bộ đệm được tối ưu hóa lưu trữ cho các mảng của Primitive.Có hai loại đối tượng bộ đệm, loại đầu tiên lưu trữ các mảng của đỉnh, bởi vì nó có các đối tượng bộ đệm còn được gọi là Vertex Buffer Object (VBO) Sau khi đã tạo
ra các đối tượng bộ đệm, có thể hủy các dữ liệu ban đầu, bởi vì các đối tượng bộ
Trang 19đệm (BO) thực hiện một bản sao từ nó Các loại khác của đối tượng đệm là đối tượng Index Buffer (nhà phân phối)
Cấu trúc:
GLvoid glGenBuffers (GLsizei n, GLuint * buffer)
n : Số lượng đại diện cho bao nhiêu tên / id đối tượng bộ đệm sẽ
được tạo ra cùng một lúc
buffer : Một con trỏ tới một biến để lưu trữ các tạo ra tên /
id Nếu có nhiều hơn một tên / id được tạo ra, con trỏ này sẽ trỏ đến đầu của một mảng
GLvoid glBindBuffer (GLenum target, GLuint buffer)
target : Mục tiêu sẽ xác định loại đối tượng bộ đệm sẽ được,
VBO hoặc nhà phân phối Các giá trị có thể là:
o GL_ARRAY_BUFFER : Điều này sẽ thiết lập một VBO (hoặc
ABO, bất cứ điều gì)
o GL_ELEMENT_ARRAY_BUFFER : Điều này sẽ thiết lập một
nhà phân phối
buffer : Tên / id của bộ đệm khung hình bị ràng buộc
Các BufferObject Hook trong thực tế là một cái móc đôi Bởi vì nó có thể giữ hai đối tượng bộ đệm, một trong mỗi
loại:GL_ARRAY_BUFFER và GL_ELEMENT_ARRAY_BUFFER
Cấu trúc:
GLvoid glBufferData (GLenum target, GLsizeiptr size, const GLvoid * data, Glenum usage)
target : Chỉ ra cho các loại đệm bạn muốn thiết lập các thuộc tính
cho Param điều này có
thểGL_ARRAY_BUFFER hoặc GL_ELEMENT_ARRAY_BUFFER
size : Kích thước của bộ đệm trong các đơn vị cơ bản (byte)
data : Một con trỏ tới dữ liệu
usage : Các loại sử dụng Điều này giống như một mẹo để giúp
OpenGL để tối ưu hóa dữ liệu.Điều này có thể của ba loại:
o GL_STATIC_DRAW : này biểu thị một dữ liệu không thay
đổi Bạn đặt nó một lần và sử dụng bộ đệm thường
o GL_DYNAMIC_DRAW : Đây có nghĩa là một dữ liệu có thể
thay đổi Bạn đặt nó một lần và cập nhật nội dung của nó nhiều lần bằng cách sử dụng nó thường xuyên
Trang 20thời Đối với người của bạn đó là quen thuộc với Objective-C, điều này giống như một autorelease Bạn đặt nó một lần và sử dụng vài lần.Sau OpenGL sẽ tự động làm sạch và phá hủy bộ đệm này
GLvoid glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)
target : Chỉ ra cho các loại đệm bạn muốn thiết lập các thuộc tính
cho Param điều này có
thểGL_ARRAY_BUFFER hoặc GL_ELEMENT_ARRAY_BUFFER
offset : Con số này đại diện cho bù đắp mà bạn sẽ bắt đầu thay đổi
vào đối tượng đệm được xác định trước đó Con số này được đưa ra là đơn
vị cơ bản (byte)
size : Con số này đại diện cho kích thước của những thay đổi vào
đối tượng đệm được xác định trước đó Con số này được đưa ra là đơn vị cơ bản (byte)
data : Một con trỏ tới dữ liệu
Sử dụng chức năng glBufferData để thiết lập nội dung cho đối tượng bộ đệm của bạn và thuộc tính của nó Nếu bạn chọn loại sử dụng GL_DYNAMIC_DRAW, nó có nghĩa là bạn muốn cập nhật đối tượng bộ đệm sau
đó và để làm điều này bạn cần phải sử dụng thứ hai, glBufferSubData
Khi bạn sử dụng glBufferSubData kích thước của đối tượng bộ đệm của bạn trước đây đã được xác định, vì vậy bạn không thể thay đổi nó Nhưng để tối ưu hóa các bản cập nhật, bạn có thể chọn chỉ là một phần nhỏ của đối tượng đệm toàn
bộ để được cập nhật
4 Kết cấu (Texture)
Kết cấu là chủ đề rất lớn trong OpenGL
Tất cả các kết cấu phải có chiều rộng và chiều cao Tính bằng pixel như 2, 4, 8,
16, 32, 64, 128, 256, 512 hoặc 1024 pixel Một kết cấu, 1024 là một kích thước lớn hơn và thường cho biết kích thước tối đa có thể của một kết cấu Vì vậy, tất cả các kết cấu sẽ được sử dụng trong OpenGL phải có kích thước như: 64 x 128 hoặc
256 x 32 hoặc 512 x 512, ví dụ Bạn không thể sử dụng 200 x 200 hoặc 256 x
100 Đây là một quy tắc để tối ưu hóa việc xử lý nội bộ OpenGL trong GPU Một điều quan trọng cần biết về kết cấu trong OpenGL là để đọc pixel Thường các định dạng tập tin ảnh lưu trữ các thông tin điểm ảnh bắt đầu từ góc trên bên trái và di chuyển qua từng dòng để góc dưới bên phải Định dạng tập tin như JPG, PNG, BMP, GIF, TIFF và để những người khác sử dụng điểm ảnh này Nhưng
Trang 21trong OpenGL thứ tự này là lộn ngược Các kết cấu trong OpenGL đọc các điểm ảnh bắt đầu từ góc dưới bên trái và đi vào góc trên bên phải
OpenGL đọc các điểm ảnh từ góc dưới bên trái vào góc trên bên phải
Trang 22Dữ liệu hình ảnh phải được lộn theo chiều dọc để phù hợp với quyền vào OpenGL
Bây giờ, về logic, các kết cấu trong OpenGL làm việc tại theo cách này: có một tập tin hình ảnh, vì vậy phải trích xuất các thông tin màu nhị phân từ nó, giá trị hexa Có thể trích xuất các thông tin alpha, OpenGL hỗ trợ RGB và định dạng RGBA Trong trường hợp này sẽ cần phải trích xuất các hệ hexa + giá trị alpha từ hình ảnh Lưu trữ tất cả mọi thứ vào một mảng các điểm ảnh
Với mảng này của điểm ảnh (còn gọi là texels, vì sẽ được sử dụng trong một kết cấu) OpenGL sẽ sao chép mảng của bạn và lưu trữ nó trong một định dạng tối
ưu hóa để sử dụng trong các GPU và bộ đệm khung hình, nếu cần thiết