OPENGL LÀ GÌ

     

Rất vui vì ai đang đọc loạt bài hướng dẫn này. Đây là loạt bài về thế giới 3D. Cụ thể là OpenGL. Tôi đang tập trung toàn thể thời gian trong 6 tháng vừa rồi để tìm hiểu về công nghệ 3D, Tôi đang xong Engine 3 chiều của tôi (dường như là một trong dự án lớn số 1 mà tôi đã từng làm) và bây chừ là thời gian tôi chia sẻ với bạn về những gì nhưng tôi đang thu lặt được - toàn bộ tài liệu, tất cả sách, hướng dẫn, với tất nhiên bao hàm cả những chủ ý phản hồi của những bạn.

Bạn đang xem: Opengl là gì

Loạt bài xích này tất cả 3 phần:

Phần 1 - khái niệm cơ bạn dạng về 3d và OpenGLPhần 2 - Đi sâu vào OpengGL ES 2.0Phần 3 - kĩ năng Jedi trong OpenGL ES 2.0 và giao diện 2D

Nếu mình muốn xem code luôn luôn thì hãy ngó qua phần 2/3 trước bởi vì trong phần đầu tôi chỉ trình bày về những khái niệm thôi.

Nào, bắt đầu thôi.

Tổng quan

Có ai trước đó chưa từng nghe về OpenGL không? OpenGL là viết tắt mang lại "Open Graphics Library" với nó được dùng tương đối nhiều trong ngôn ngữ máy tính. OpenGL là nơi gần nhất giữa CPU (cái mà chúng ta - đầy đủ developer - chạy những ứng dụng trên các ngôn ngữ lập trình) cùng GPU (chip cách xử trí đồ họa). Vì chưng vậy OpenGL cần được được cung ứng bởi những nhà cung cấp card giao diện (vd: NVidia) và được thiết lập bởi những công ty đối tác phát triển hệ điều hành (giống như táo khuyết hay Microsoft) và sau cuối OpenGL cho họ một API thống nhất để gia công việc. API này là những "Ngôn ngữ miễn phí" (hoặc hầu như miễn phí). Việc này quá tiện lợi vì nếu như bạn sử dụng C hoặc C++ hay thậm chí là là Objective-C, Perl, C# tuyệt Javascript hay bất kỳ ngôn ngữ nào bạn muốn, API của OpenGL luôn giống nhau, cách xử lý giống nhau, phổ biến chức năng, chiếc lệnh với là vị trí mà loạt bài hướng dẫn này bắt đầu!

Trước khi nói về OpenGL API họ cần phải có kiến thức và kỹ năng về 3D. Lịch sử hào hùng của 3d trong ngôn ngữ máy tính được gói trong lịch sử của OpenGL. Do vậy hãy cùng tò mò qua một chút ít về lịch sử dân tộc của nó.

Một mẩu truyện nhỏ

*

Khoảng 20 thời gian trước có một người tên là Silicon Graphics (SGI) tạo thành một các loại thiết bị nhỏ. Trang bị này rất có thể hiện ra những ảo hình ảnh rất thực tế. Với ảnh 2D, thiết bị đó dám hiện tại được các ảnh kiểu 3D, mô rộp cái nhìn và chiều sâu theo đôi mắt của nhỏ người. Thiết bị này được gọi là IrisGL (có lẽ do nó cố kỉnh thử mô bỏng theo đôi mắt của nhỏ người).

Ghê chưa, thiết bị đó là thư viện giao diện đầu tiên. Tuy vậy nó bị tiêu diệt quá nhanh vì để gia công được như thế, anh ta yêu cầu điều khiển quá nhiều thứ trong máy tính xách tay như card đồ họa, hệ thống windows, các ngôn ngữ lập trình với giao diện liên hệ với người tiêu dùng cuối. Không ít thứ thậm chí để cho 1 công ty quản lí lý, chưa nói tới 1 người. Vì vậy SGI bước đầu chuyển qua 1 thứ giống hệt như "thẻ tạo thành đồ họa", "hệ thống làm chủ cửa sổ", "tạo giao diện bạn dùng" cho các công ty không giống và triệu tập vào phần đặc biệt nhất của thư viện thứ họa. Năm 1992 đã thành lập và hoạt động OpenGL thế hệ đầu tiên.

Vào năm 1995 Microsoft giới thiệu Direct3D, đối thủ cạnh tranh đáng ghờm cùng với OpenGL.Và chỉ tới năm 1997 OpenGL 1.1 đã có được tung ra. Nhưng tới tận năm 2004, OpenGL mới có thể thu hút được tôi, OpenGL 2.0 với những hào kiệt tuyệt vời. Tôi thực sự ham mê Shaders, lập trình sẵn pipeline (programmable pipeline).

Cuối cùng vào 2007 OpenGL ES 2.0 sẽ mang sức khỏe của Shader cùng Programmable pipeline cho tới các khối hệ thống nhúng.

Ngày nay, bạn có thể thấy logo của OpenGL (hoặc OpenGL ES) trong không ít trò chơi, ứng dụng 3D, 2 chiều và rất đa phần mềm không giống (đặc biệt là ứng dụng 3D). OpenGL ES được dùng bởi PlayStation, Android, Nintendo 3DS, Nokia, Samsung, Symbian và tất nhiên cả táo bị cắn dở với MacOS cùng iOS.

Đối thủ lớn số 1 của OpenGL

Vâng, bọn họ đang nhắc đến hệ quản lý điều hành Windows.

Bạn bao gồm nhớ tôi đã nói rằng bản đầu tiên của OpenGL là 1992? cùng thời gian đó, Microsoft đã gồm Windows 3. Như Microsoft luôn tin rằng "không gì được tạo nên ra, số đông thứ được copy", Microsot đã gồm gắng copy OpenGL trong số những gì họ call là DirectX với được giới thiệu lần đầu năm 1995 trong Windows 95 tương ứng.

Một năm sau, 1996, Microsoft reviews Direct3D, một phiên bạn dạng copy của OpenGL. Điểm đáng quan tâm là Microsoft đã sở hữu ưu vậy trên thị trường trong những năm liền, với DirectX hoặc (Direct3D) đã lấn vào các máy tính PCs cùng khi Microsoft bước đầu chuyển sang thị phần di cồn và đoạn phim Game, DirectX cũng lấn sảnh sang.

Ngày nay DirectX có cấu tạo rất giống như với OpenGL: dùng ngôn ngữ Shader, cũng đều có programmable pipeline, thậm chí là cũng hỗ trợ cả fix pipeline, không dừng lại ở đó là tên của các hàm trong API cũng giống như luôn. Sự không giống nhau chỉ là OpenGL là miễn phí, luôn luôn luôn mở, tuy nhiên DirectX là đóng. OpenGL đến iOS, MacOS, hệ thống Linux trong những lúc DirectX chỉ giành riêng cho hệ điều hành quản lý của Microsoft.

Giờ là lúc chúng ta cũng có thể bắt đầu tò mò thế giới lập trình 3d được rồi!

3D - Con góc nhìn thứ nhất

Từ cơ hội tôi mập lên, tôi đã đam mê technology 3D và những trò chơi game 3D. Tất cả các nhân thiết bị trong đó, con người, biết về mô phỏng nhân loại thực trong số hiệu ứng 3D tới từ một nơi duy nhất: nhỏ mắt.

Con đôi mắt là cơ phiên bản trong thế giới 3D. Tất cả những điều bọn họ làm là mô rộp nó, làm thế nào thật đẹp, thật cuốn hút giống tựa như các gì mắt nhỏ người hoàn toàn có thể thấy. Gần như khái niệm liên quan tới đôi mắt như góc nhìn, tầm nhìn, ống kính, thấu kính, những loại sự thứ là đang được nói tới nhiều khi các bạn làm quen với 3D.

Mọi thứ chúng ta làm là cố gắng tái chế tác từ mắt fan những thứ: góc nhìn, điểm mù, biến đổi dạng, độ sâu ảnh, tiêu cự, góc nhìn...

Không gian 3 chiều

Nghe có vẻ như ngớ ngẩn nhưng mà thực sự nên nói rằng: thế giới 3D là 3d vì nó có 3 chiều. Tôi nói chiếc này vì chưng nó rất đặc trưng để nói thêm rằng nó nhiều hơn thế 2D một chiều và tinh vi hơn rất rất nhiều so với 2D.

Hãy xem, trong nhân loại 2D khi họ cần con quay một hình vuông rất đối chọi giản: 45 độ luôn luôn là 45 độ. Nhưng với 3D, để quay một hình vuông yêu ước 3 trục X, Y, Z. Phụ thuộc trên máy tự của góc quay, kết quả cuối cùng rất có thể rất không giống nhau. đầy đủ thứ thông thường sẽ trở lên loạn xạ khi bọn họ thử con quay với những trục khác nhau. Ví dụ: cù x=25, y=20 là 1 kiểu, x=10, y=20 và tiếp đến x=10 lại tạo thành một kết quả mới.

Như vậy có thể nói rằng khi thêm 1 chiều khác làm cho công việc của chúng ta phức tạp lên gấp các lần.

Không phải 3 chiều mà phải là 4D

Hmmm, lại thêm 1 chiều nữa ư?

Chính xác, điểm cuối cùng tôi ý muốn nhắc đến đó là điều này. Chúng ta không chỉ thao tác trong nhân loại 3D, họ còn có chiều sản phẩm công nghệ 4: thời gian. Hầu hết sự vật trong quả đât 3D cần tác động lẫn nhau, rất cần phải di chuyển, va chạm, núm đổi. Và như tôi đã nói làm việc trên, việc thay đổi đó trong quả đât 3D tạo thành nhiều hiệu quả khác nhau.

Vậy đến hôm nay chúng ta đã có mang được 3d là: "việc mô phỏng mắt của con tín đồ và mô bỏng sự hoạt động của những sự vật".

Áp dụng OpenGL vào trái đất 3D

Bây giờ new là lúc nói đến cái thú vị của bài xích blog này: Hãy nói về OpenGL. Đầu tiên bọn họ cần cảm ơn những nhà toán học tập như Ơ-le, Hamilton, Pythago và không ít nhà khoa học khác. Nhờ gồm họ mà lại ngày nay bọn họ có vô số công thức và công cụ để làm việc với không khí 3 chiều. OpenGL vẫn sử dụng toàn bộ kiến thức đó để tạo nên một thế giới 3D ngay trước mặt bọn chúng ta. Tất cả hàng nghìn, thậm chí là hàng triệu phép tính toán trên một giây sử dụng các công thức toán học để mô phỏng lại vẻ đẹp nhưng mà mắt bạn trông thấy.

OpenGL là 1 MÁY TRẠNG THÁI (state machine) - điều này có nghĩa là toàn bộ OpenGL làm việc trên tế bào hình xây đắp theo trạng thái. Để minh họa mang lại OpenGL, hãy tưởng tượng một máy bắt buộc Trục cảng hải phòng chẳng hạn. Ở đó có khá nhiều các thùng mặt hàng (container) với không hề ít các kiện hàng nhỏ dại bên trong. OpenGL như thể như toàn bộ khu cảng đó bao gồm:

Các thùng sản phẩm (container) là các đối tượng trong OpenGL (Textures, Shaders, Meshes, và các thứ tương tự)Các khiếu nại hàng phía bên trong mỗi container là hầu như gì chúng ta tạo ra trong ứng dụng áp dụng OpenGL. Đó là hầu như thứ họ nhìn thấy.Máy yêu cầu trục là các OpenGL API, dòng mà họ sẽ sử dụng.

Vậy khi họ thực hiện tại một hàm trong OpenGL giống hệt như việc thực hiện cần trục. Chiếc cần trục lấy các container trong cảng, nâng nó lên, xử lý đông đảo gì bên phía trong và sau cùng thả xuống vào một trong những nơi vẫn định sẵn. Bạn chưa phải trực tiếp sử dụng cảng đó, không thể đổi khác nội dung các thùng hàng, ko thể sửa chữa chúng, chúng ta cũng cần yếu trực tiếp đụng chạm vào những thùng sản phẩm trong cảng. Toàn bộ chỉ là bạn ra lệnh mang lại chiếc nên trục thực hiện. Chỉ bao gồm chiếc phải trục đó mới hoàn toàn có thể tác động lên các thùng hàng trong container. Hãy lưu giữ điều này! Nó là rất là quan trọng về OpenGL cho tới bây giờ. Chiếc phải trục chỉ là 1 trong thứ bao gồm thể thống trị các thùng hàng trong cảng.

*

Có vẻ OpenGL bị số lượng giới hạn bởi những API? cơ mà không, các cần trục của OpenGL là rất là mạnh mẽ. Nó có thể lặp lại việc xử lý gắp-và-thả hàng nghìn cho tới hàng triệu những container vào một giây. Một vật dụng tuyệt với khác của OpenGL là sử dụng mô hình State Machine, kia là chúng ta không đề nghị lưu giữ ngẫu nhiên thể hiện tại nào, bọn họ không cần được tạo các đối tượng trực tiếp, chúng ta chỉ nên giữ những id, hoặc trong ví dụ trên: họ chỉ nên biết về id của những container.

Vậy OpenGL làm việc như cố nào?

Đi sâu vào cỗ xử lý đo lường và tính toán của OpenGL, ta thấy OpenGL sử dụng thống kê giám sát trực tiếp trên GPU - phần cứng xử lý đồ họa cho máy tính xách tay - và áp dụng dấu phảy rượu cồn (floating points). CPU (Central Processing Unit) là cpu xử lý của sản phẩm tính. Còn GPU (Graphics Processing Unit) là bộ xử lý đồ họa. Bộ xử lý đồ họa này giúp cho CPU giảm thiểu các quá trình nặng nhọc: nó có thể xử lý hình ảnh trước khi hiện ra màn hình. Giỏi sâu hơn, các gì OpenGL thực hiện chính là trên GPU, chũm vì đo lường và thống kê trên CPU. GPU nhanh hơn rất không ít với các số thực so với CPU. Đây là nguyên nhân cơ bản để những trò chơi 3d chạy cấp tốc hơn khi có card thứ họa. Đây cũng chính là lý vày cho các phần mềm xử lý 3D bài bản giúp bọn họ làm việc với "Software"s Render" (xử lý trên CPU) hoặc "Graphics Card"s Render" (xử lý trên GPU). Một vài phần mềm cũng cho họ một tùy chọn: gồm dùng OpenGL xuất xắc không? và đó, giờ chúng ta đã biết rồi. Tùy chọn đó đó là dành cho bài toán xử lý đã ở trên GPU tuyệt không. Bởi vậy, OpenGL sẽ hoàn toàn làm bài toán với GPU hay không? câu vấn đáp là ko chắc. Chỉ những thao tác xử lý hình ảnh và vài thứ khác thôi. OpenGL cho chúng ta rất nhiều tính năng để lưu trữ ảnh, dữ liệu, tin tức trong một định dạng cụ thể. Rất nhiều định dạng này được xử lý trực tiếp vì GPU. Do vậy OpenGL nhờ vào vào phần cứng. Nếu như phần cứng không cung ứng OpenGL, bọn họ không thể áp dụng nó. Quá buồn! các phiên bản mới của OpenGL thường xuyên xuyên có nhu cầu các tính năng bắt đầu của GPU. Tuy nhiên cũng đừng lo lắng, OpenGL luôn có nhu cầu các nhà tiếp tế tích vừa lòng vào, họ (những developer - coder) sẽ làm việc trên những phiên phiên bản OpenGL new chỉ khi thiết bị vẫn sẵn sàng. Vào thực tế, tât cả những chip đồ họa lúc này đều cung ứng OpenGL. Vì vậy bạn cũng có thể sử dụng OpenGL với không ít ngôn ngữ và thiết bị. Thậm chí là với Microsoft Windows.

Logic của OpenGL

OpenGL là thư viện giao diện khá ngắn gọn với súc tích. Hồ hết gì bạn thấy trong các phần mềm xử lý 3D chuyên nghiệp hóa là rất là phức tạp vận động trên OpenGL. Vì ngắn gọn xúc tích của OpenGL có những thứ sau:

Primitives (Các đối tượng người tiêu dùng cơ bản)Buffers (Lưu vào cỗ đệm)Rasterize (Xử lý trang bị họa)

OpenGL vận động xoay quanh 3 định nghĩa này. Mỗi định nghĩa ở trên hòa bình nhau với làm gắng nào nhằm cả 3 hoàn toàn có thể cùng nhau tạo ra các cảm giác 3D đẹp mắt (hay kể cả với các ảnh 2D do nó chỉ nên dạng 3d với độ sâu Z=0, bọn họ sẽ nói vấn đề này sau).

Primitives

Bao tất cả 3 nhiều loại đói tượng:

Các điểm vào hệ không khí 3 chiều (x, y với z)Các đường thẳng trong không gian (sự kết hợp của 2 điểm)về một tam giác trong không gian (sự phối hợp của 3 điểm)

Một điểm 3D có thể coi như một phân tử trong ko gian.Một con đường thẳng luôn hoàn toàn có thể coi như một vector.Một tam giác rất có thể coi là một trong những mặt trong 1 cái lưới với mặt hàng nghìn, triệu tam giác phối kết hợp lại.

Một vài ba phiên bạn dạng OpenGL cung ứng quads (hình tứ diện cùng với 4 điểm), cũng là một loại của tam giác, tuy vậy để OpenGL ES đạt hiệu quả tối đa thì cái này không được hỗ trợ.

Buffers

Nói một cách đối chọi giản, buffer là 1 trong vùng lưu giữ trữ tạm thời giúp cho việc tối ưu. Bao gồm 3 nhiều loại Buffer:

Frame BufferRender BufferBuffer Object

Frame Buffer là trừu tượng và khó hiểu độc nhất vô nhị trong cả 3 loại. Khi bạn tạo một cảnh, bạn có thể gửi hình ảnh trực tiếp tới screen của lắp thêm hoặc cho tới Frame Buffer. Về cơ phiên bản Frame Buffer là một vùng để lưu dữ liệu hình ảnh tạm. Rõ ràng hơn, bạn cũng có thể tưởng tượng nó như một áp ra output từ bộ render của OpenGL cùng gồm không hề ít ảnh, không hẳn chỉ gồm một. Những hình ảnh đó là gì? Đó là những hình ảnh về các đối tượng người tiêu dùng 3D, về độ gần/xa của các đối tượng trong không gian, các vùng giao nhau của các đối tượng người sử dụng và về những phần được hiện ra. Do vậy Frame Buffer giống hệt như một tập với nhiều ảnh. Toàn bộ đều được tàng trữ dưới dạng tin tức mảng các giá trị pixel.

Render Buffer là một trong vùng nhớ nhất thời của một ảnh duy nhất. Giờ chúng ta có thể rõ ràng hơn khi 1 Frame Buffer thiết yếu là bao gồm nhiều Render Buffer. Gồm vài nhiều loại Render Buffer: Màu, độ sâu, hình khối.

Màu: lưu trữ những màu sau cùng được sinh vì OpenGL render và lưu bên dưới dạng ảnh màu (RGB).Độ sâu lưu trữ giá trị Z của đối tượng. Nếu bạn đã quen thuộc với các ứng dụng 3D, các bạn sẽ biết về độ sâu của ảnh là gì. Nó là tỉ lệ độ color xám của ảnh phụ ở trong theo vị trí so với màn hình. Trong trường hợp không thiếu thốn độ white khi đối tượng người sử dụng ở sớm nhất và màu sắc đen hoàn toàn khi nó nghỉ ngơi xa nhất.Hình khối ám chỉ về thành phần chỉ ra của đối tượng. Y hệt như một lớp mask cho những vùng được quan sát thấy. Được lưu bên dưới dạn hình ảnh chỉ bao gồm 2 white color & đen.

Buffer Object là một trong vùng nhớ cơ mà OpenGL gọi là "server side" (hoặc ko gian showroom lưu trữ). Buffer Object cũng là 1 trong những vùng nhớ trợ thời thời, nhưng dường như lâu dài thêm hơn các các loại trước. Một Buffer Object có thể lưu trữ trong suốt quy trình sử dụng ứng dụng. Buffer Object có thể giữ các thông tin về đối tượng 3D bên dưới dạng đã được tối ưu. Những thông tin này rất có thể có 2 loại: Structure cùng Indice.

Xem thêm: Nghị Luận Về Bản Lĩnh Là Gì ? Định Nghĩa, Khái Niệm Bản Lĩnh Là Gì

Structure là mảng biểu hiện các đối tượng người dùng 3D, vd: một mảng những đỉnh, mảng những tọa độ texture hoặc một mảng của những gì chúng ta muốn. Indice thì ví dụ hơn, mảng này được dùng để làm xác định có bao nhiêu tam giác vào lưới đang được tạo nên dựa trên mảng structure.

Bạn vẫn cạnh tranh hiểu ư? Hãy xem ví dụ bên dưới đây:

Tưởng tượng một khối 3D. Khối này còn có 6 phương diện được sinh ra vày 8 đỉnh?

*

Mỗi mặt là 1 trong những hình vuông, nhưng chúng ta có đừng quên OpenGL chỉ biết về các tam giác đúng không? vị vậy chúng ta cần chuyển những hình vuông đó thành các tam giác để làm việc với OpenGL. Như vậy họ có 12 tam giác vớ cả!Ảnh sinh hoạt trên được tạo nên bởi ứng dụng Modo, hãy coi góc dưới bên phải. Bọn chúng là những thông tin về đồ thể của bọn chúng ta. Chúng ta cũng có thể thấy có 8 đỉnh với 12 khía cạnh (GL: 12).

Các tam giác trong OpenGL là sự phối kết hợp của các đỉnh 3D. Do vậy để sản xuất ra bề mặt của chiếc hộp, bọn họ cần OpenGL tạo theo cách như này: đỉnh 1, đỉnh 2, đỉnh 3, đỉnh 1, đỉnh 3, đỉnh 4.

Hay nói giải pháp khác, bọn họ cần tái diễn 2 đỉnh ở một mặt của hình vuông. Nếu cố hình hộp bằng một hình bao gồm 12 mặt thì từng đỉnh đề xuất lặp 4 lần, nếu như thay bằng một hình 16 mặt, bọn họ cần 6 lần lặp lại. Với cứ thế, việc tăng số lặp của các đỉnh lên nhanh chóng.

Vì vậy OpenGL đến phép bọn họ một biện pháp làm đơn giản và dễ dàng hơn: áp dụng một mảng các Indice. Ở lấy một ví dụ trên, chúng ta có thể có một mảng 8 đỉnh: đỉnh 1, đỉnh 2, đỉnh 3, đỉnh 4,... Cùng thay vì viết lại đa số thông tin cho từng mặt, chúng ta tạo một mảng các Indicate: 0,1,2,0,2,3,2,6,3,2,5,6,.... Mỗi sự phối hợp 3 thành phần trong mảng 0,1,2-0,2,3-2,6,3 màn trình diễn một mặt tam giác. Với tính chất này, bạn cũng có thể viết thông tin những đỉnh 1 lần với tái sử dụng nhiều lần trong mảng các indicate.

Giờ trở về với Buffer Object, loại đầu tiên là một mảng những structure, như đỉnh 1, đỉnh 2, đỉnh 3, đỉnh 4,... Với loại thứ hai là mảng các indice 0,1,2,0,2,3,2,6,3,2,5,6....

Lợi ích của Buffer Object là chúng được buổi tối ưu để triển khai việc thẳng với GPU và bạn không nên giữ mảng đó trong ứng dụng của bạn sau khi chế tạo một Buffer Object.

Rasterize

Rastersize là quá trình xử lý vị OpenGL nhận tất cả thông tin về đối tượng người sử dụng 3D (bao gồm đỉnh, tọa độ, tính toán...) để tạo ra một hình ảnh 2D. Ảnh này có khả năng sẽ bị một vài thay đổi và tiếp đến hiển thị trên màn hình hiển thị của thiết bị.

Nhưng ở bước ở đầu cuối này, việc kết nối giữa thông tin các pixel và thiết bị screen thuộc về các nhà phân phối thiết bị. Team Khronos cung ứng API khác gọi là EGL, tuy nhiên đây chỉ cần api của các nhà sản xuất. Chúng ta, các developer đã không thao tác trực tiếp cùng với Khronos EGL, cơ mà với phiên bản đã được chuyển đổi của những nhà cung cấp.

Vì vậy khi bạn tạo một OpenGL render, bạn cũng có thể chọn quy trình render thẳng lên màn hình, sử dụng EGL, hoặc render tới các Frame Buffer. Bài toán render tới các Frame Buffer, chúng ta vẫn sinh hoạt trong OpenGL API, tuy vậy nội dụng sẽ chưa được hiện ra trên màn hình. Việc hiển thị lên màn hình hiển thị nằm không tính phạm vi của OpenGL API, nó là của EGL API. Vì chưng vậy tại thời khắc render, chúng ta cũng có thể chọn 1 trong những 2 một số loại để xuất ra.

Nhưng chớ thử ngay, bởi như tôi vẫn nói, từng nhà cấp dưỡng tạo riêng mang đến họ các EGL API riêng. Ví dụ táo apple không cho phép bạn render trực tiếp tới màn hình thiết bị, bạn luôn luôn yêu cầu render cho tới Frame Buffer và kế tiếp dùng EGL (bởi Appple) nhằm hiện văn bản lên màn hình.

OpenGL pipelines

Như tôi đã nói đến "Programmable pipeline" cùng "fixed pipeline", Programmable pipeline là thư viện giao diện cho phép bọn họ làm phần lớn thứ tương quan tới Camera, Ánh sáng, gia công bằng chất liệu và hiệu ứng. Và chúng ta có thể làm bài toán này với Shader. Bởi vậy mỗi khi bạn nghe về "programmable pipeline" hãy nghĩ về Shader!

Thử cùng tò mò Shader là gì nhỉ.

Shader hệt như một đoạn code, phong cách như một lịch trình nhỏ, làm việc trực tiếp trong GPU để tiến hành các phép tính phức tạp. Nếu miêu tả một cách phức tạp thì như vậy này: màu sắc cuối cùng của bề mặt vật thể, chiếc mà gồm một texture là T, bị thay đổi khi đâm vào một trong những vật bao gồm texture là TB, áp dụng màu SC với phản chiếu nấc SL, dưới ánh sáng L với cường độ LP theo góc LA từ khoảng cách Z với độ rọi F và toàn bộ đang nhìn vì chưng mắt của Camera C tại vị trí phường với ống kính T.

Những điều này còn có nghĩa nó cực kỳ phức tạp để xử trí trên CPU và vô số thứ yêu cầu làm đẩy mang lại thư viện xử trí đồ họa. Vày vậy programmable pipeline chỉ cần cách họ quản lý phần lớn thứ đó như thế nào.

Còn fixed pipeline ngược với programmable pipeline! Fixed pipeline là thư viện giao diện xử lý về toàn bộ các một số loại và cho chúng ta api để setup Camera, Material, ánh sáng, hiệu ứng.

Để tạo nên Shader bọn họ dùng ngôn ngữ tương tự như như C, chính là OpenGL Shader Language (GLSL). OpenGL ES áp dụng với một chút ít giới hạn được hotline là OpenGL ES Shader Language (GLSL ES hoặc ESSL). Sự không giống nhau là bạn có thêm một số hàm và có thể viết thêm những biến trong GLSL rộng với GLSL ES, mà lại cú pháp là giống như nhau.

Điểm một ít về cơ chế làm việc của hầu như Shader này:

Bạn sản xuất chúng trong những file đơn lẻ hoặc viết trực tiếp vào code của bạn, miễn làm sao nội dung sau cùng chứa Shader Language sẽ tiến hành gửi mang đến OpenGL cùng biên dịch Shader cho chính mình (bạn thậm chí hoàn toàn có thể dùng tiền-biên-dịch dưới dạng mã nhị phân, tuy nhiên không ở trong trong nội dung bài viết này).

Shader làm việc theo cặp: Vertex Shader cùng Fragment Shader. Chủ đề này cần rất quan trọng, hãy xem chi tiết Vertex và Fragment như vậy nào. Để hiểu phần đông gì mỗi loại shader làm, hãy quay lại ví dụ hình vỏ hộp ở trên.

Vertex Shader

Vertex Shader cũng được biết đến như thể VS hoặc VSH là 1 trong chương trình bé dại sẽ được thực thi ở từng đỉnh của mesh (mỗi thứ thể được khiến cho bằng một lưới các tọa độ, điện thoại tư vấn là mesh). Hãy xem hình hộp ở trên, hộp này có 8 đỉnh (giờ trong ảnh chỉ có 5 đỉnh đang rất được hiện ra thôi), các bạn sẽ hiểu ngay tiếp sau đây thôi. Bởi vậy VSH sẽ được xử lý 8 lần vì chưng CPU.

Những gì Vertex Shader sẽ làm là xác xác định trí ở đầu cuối của đỉnh. Chúng ta có hãy nhờ rằng Programmable pipeline đến phép họ điều khiển camera? chính là ở đây, vị trí cùng độ mở của ống kính camera có thể đổi khác vị trí sau cùng của các đỉnh. Vertex Shader cũng có thể có trách nhiệm sẵn sàng và xuất ra vài ba variable (giá trị, biến) đến Fragment Shader. Trong OpenGL chúng ta định nghĩa những biến ở Vertex Shader, nhưng chưa phải cho Fragment Shader trực tiếp. Vì vậy, Vertex Shader phải gửi các biến tới Fragment Shader.

Nhưng trên sao họ không thể trực tiếp truy cập tới Fragment Shader?

Hãy coi FSH (Fragment Shader) và các bạn sẽ hiểu.

Fragment Shader

Giờ hãy xem lại hình lập phương một đợt nữa.

Bạn có thấy đỉnh số 5 bị ẩn giỏi không? vì chưng với vị trí gắng thể, góc quay thay thể, họ chỉ có thể nhìn thấy 3 phương diện được ra đời từ 7 đỉnh.

Đây là tất cả những gì Fragment Shader thực hiện! FSH sẽ tiến hành xử lý sinh hoạt mỗi khía cạnh được hiện của hình ảnh cuối thuộc (được hiện trên màn hình). Ở đây chúng ta có thể hiểu một fragment như là một trong pixel. Dẫu vậy nói thông thường không hẳn chính xác như pixel, vì giữa OpenGL render và câu hỏi hiện ra hình ảnh cuối cùng trên screen thiết bị sẽ bị giãn ra theo cả 2 chiều (ví dụ camera thu lại theo tỉ lệ thành phần 4:3 mà screen là tỉ lệ thành phần 16:9 vậy). Bởi vì vậy một fragment có thể có thấp hơn hoặc nhiều hơn thế nữa số px thực tế, nhờ vào trên đồ vật và thông số kỹ thuật việc render. Vào hình lập phương ngơi nghỉ trên, Fragment Shader sẽ tiến hành xử lý ngơi nghỉ mỗi pixel của bố mặt đã hiện lên từ bỏ 7 đỉnh đó.

Bên trong Fragment Shader, họ sẽ thao tác làm việc với đông đảo thứ liên quan tới bề mặt của vật thể, như chất liệu, hiệu ứng phản chiếu, đổ bóng, ánh sáng, tương phản, khúc xạ, tổ chức và bất kỳ các cảm giác khác mà chúng ta muốn. Sản phẩm sau cùng là màu sắc của các px dưới định hình RGBA.

Giờ thứ sau cuối mà bạn cần phải biết đó là về VSH và FSH làm việc với nhau như thế nào. Đó là cần phải có một Vertex Shader và chỉ 1 Fragment Shader, không rộng không kém, phải và đúng là 1-1. Để bảo đảm chúng ta ko phạm lỗi, OpenGL gồm một thứ hotline là Program. Một program vào OpenGL chỉ được biên dịch theo cặp 1 VSH và 1 FSH mà lại thôi.

Tổng kết

Đây là toàn bộ về tư tưởng OpenGL. Hãy nhớ phần nhiều điểm này:

OpenGL xúc tích và ngắn gọn được làm cho bởi 3 tư tưởng cơ bản: Primitive, Buffer với Rasterize.Primitives bao gồm điểm, đường, tam giácBuffer hoàn toàn có thể là Frame Buffer, Render Buffer hoặc Buffer Object.Rasterize là vượt trình thay đổi OpenGL tính toán ra các pixelOpenGL có tác dụng việc đối với tất cả Fixed hoặc Programmable pipeline.Fixed pipeline đang cũ, chậm, cồng kềnh. Có không ít hàm thao tác làm việc với Camera, ánh sáng, thứ liệu, hiệu ứngProgrammable pipeline dễ sử dụng hơn, cấp tốc và dễ hiểu hơn, bởi trong Programmable chất nhận được OpenGL xây dựng được với Camera, ánh sáng, vật tư và hiệu ứng.Programmable pipeline là y hệt như Shader: Vertex Shader, từng đỉnh của mesh, cùng Fragment Shader - làm việc mỗi phần hiện ra của mesh. Từng cặp Vertex Shader và Fragment Shader được biên dịch trong một thứ gọi là Program.

Hãy coi cả 3 bài, OpenGL dường như rất đơn giản và dễ dàng và dễ dàng hiểu. Đúng! nó đơn giản để hiểu tuy thế để học thì....haizzz3 điểm sống trên liệt kê ra những nhánh của OpenGL cùng để học tất cả chúng bạn có lẽ cần vài mon hoặc hơn.

Những gì tôi nỗ lực đề cập ở 2 phần tiếp sau của loạt bài xích này đó là tất cả rất nhiều gì tôi đang học được vào 6 tháng cực kỳ tập trung, đi sâu vào OpenGL. Vào phần tiếp theo tôi sẽ cho bạn xem các hàm cơ bản và cấu tạo của một ứng dụng 3d sử dụng OpenGL. Độc lập với ngôn từ lập trình mà bạn đang sử dụng hoặc với thiết bị bạn đang sử dụng.

Nhưng trước khi sang phần tiếp theo, tôi hy vọng nói với bạn thêm một vật dụng nữa:

OpenGL Error API

OpenGL là một máy trạng thái tuyệt đối hoàn hảo làm việc y như một phải trục nghỉ ngơi cảng tp. Hải phòng và bạn không cần thiết phải trực tiếp tiến hành những gì xẩy ra bên trong. Vậy nếu gồm lỗi xẩy ra thì sao? không tồn tại gì xảy ra với vận dụng vì OpenGL hoàn toàn là ở bên ngoài.

Nhưng làm cố gắng nào để biết khi shader của chúng ta có lỗi? Làm thế nào để hiểu nếu tiệm trình render vào các buffer không hoạt động đúng như ao ước muốn?

Để bắt được những lỗi đó, OpenGL cho bọn họ Error API. Đây là API rất là đơn giản, nó có vài hàm cung ứng sẵn theo từng cặp. Một chiếc kiểm tra đối chọi giản, có/không, chỉ để hiểu nếu bao gồm thứ nào đấy chạy đúng tốt không. Cặp khác là để lấy ra được thông báo lỗi ráng thể. Vị vậy cực kỳ đơn giản. Đầu tiên các bạn kiểm tra, rất nhanh, nếu tất cả một lỗi, bạn lấy thông tin ra.

Nói chung họ đặt vài điểm kiểm tra ở hồ hết nơi có thể xảy ra lỗi, gioogns như việc biên dịch Shader hoặc thông số kỹ thuật Buffer nhằm tránh các lỗi cơ bản.

Xem thêm: Amazon Ses Là Gì ? Hướng Dẫn Tổng Hợp Về Dịch Vụ Amazon Ses Những Hiệu Quả Mà Nó Mang Lại Cho Doanh Nghiệp

Phần tiếp theo

Ở phần tiếp theo, chúng ta hãy xem đưa ra tiết phía bên trong đoạn code thực tế, các bạn sẽ đươc code khôn xiết nhiều.