Rất vui vì nhiều người đang đọc loạt bài bác hướng dẫn này. Đây là loạt bài về nhân loại 3D. Cụ thể là OpenGL. Tôi vẫn tập trung toàn bộ thời gian trong nửa năm vừa rồi để tìm hiểu về công nghệ 3D, Tôi đang hoàn thành Engine 3 chiều của tôi (dường như là 1 trong dự án lớn số 1 mà tôi đã từng có lần làm) và hiện giờ là thời gian tôi chia sẻ với các bạn về hầu hết gì mà lại tôi đang thu nhặt được - toàn bộ tài liệu, toàn bộ sách, phía dẫn, cùng tất nhiên bao gồm cả những chủ ý phản hồi của các 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 - tư tưởng 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 vào OpenGL ES 2.0 và bối cảnh 2D

Nếu mình muốn xem code 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ề các khái niệm thôi.

Nào, ban đầu thôi.

Tổng quan

Có ai chưa từng nghe về OpenGL không? OpenGL là viết tắt cho "Open Graphics Library" và nó được dùng tương đối nhiều trong ngôn ngữ máy tính. OpenGL là nơi sớm nhất giữa CPU (cái mà họ - hầu như developer - chạy những ứng dụng trên những ngôn ngữ lập trình) cùng GPU (chip cách xử lý đồ họa). Vì chưng vậy OpenGL rất cần phải được cung ứng bởi những nhà cấp dưỡng card hình ảnh (vd: NVidia) cùng được thiết lập bởi những công ty đối tác phát triển hệ quản lý (giống như táo bị cắn 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à các "Ngôn ngữ miễn phí" (hoặc số đông miễn phí). Vấn đề này quá dễ dàng vì nếu như bạn sử dụng C hoặc C++ hay thậm chí là là Objective-C, Perl, C# tốt Javascript hay bất kỳ ngôn ngữ nào bạn muốn, API của OpenGL luôn luôn giống nhau, giải pháp xử lý giống nhau, chung chức năng, dòng lệnh với là nơi mà loạt bài hướng dẫn này bắt đầu!

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

Một mẩu truyện nhỏ

*

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

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

Vào năm 1995 Microsoft trình làng Direct3D, đối thủ tuyên chiến đối đầu đáng ghờm với OpenGL.Và chỉ tới năm 1997 OpenGL 1.1 đã có được tung ra. Tuy nhiên tới tận năm 2004, OpenGL mới hoàn toàn có thể thu hút được tôi, OpenGL 2.0 cùng với những nhân kiệt tuyệt vời. Tôi thực sự phù hợp Shaders, xây dựng pipeline (programmable pipeline).

Cuối cùng vào 2007 OpenGL ES 2.0 đang mang sức mạnh của Shader với Programmable pipeline cho tới các hệ thống nhúng.

Ngày nay, chúng ta có thể thấy hình ảnh của OpenGL (hoặc OpenGL ES) trong rất nhiều trò chơi, áp dụng 3D, 2d và rất nhiều phần mềm khác (đặ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 yếu cả apple với MacOS cùng iOS.

Đối thủ lớn nhất của OpenGL

Vâng, chúng ta đang nhắc tới hệ quản lý và điều hành Windows.

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

Một năm sau, 1996, Microsoft trình làng Direct3D, một phiên phiên bản copy của OpenGL. Điểm nên nói là Microsoft đã chiếm ưu chũm trên thị trường trong những năm liền, và DirectX hoặc (Direct3D) đã lấn sâu vào các laptop PCs với khi Microsoft bắt đầu chuyển sang thị phần di đụng và video clip Game, DirectX cũng lấn sảnh sang.

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

Giờ là lúc bạn có thể bắt đầu khám phá thế giới lập trình 3 chiều được rồi!

3D - Con mắt nhìn thứ nhất

Từ thời điểm tôi phệ lên, tôi vẫn đam mê technology 3D và những trò chơi game 3D. Tất cả các nhân đồ gia dụng trong đó, nhỏ người, biết về mô phỏng quả đât thực trong số hiệu ứng 3D tới từ một vị trí duy nhất: nhỏ mắt.

Con đôi mắt là cơ bạn dạng trong trái đất 3D. Toàn bộ những điều họ làm là mô bỏng nó, làm sao thật đẹp, thật hấp dẫn giống tựa như những gì mắt bé người rất có thể thấy. đông đảo khái niệm liên quan tới đôi mắt như góc nhìn, khoảng nhìn, ống kính, thấu kính, các loại sự thứ là vẫn được nhắc tới nhiều khi chúng ta làm quen với 3D.

Mọi thứ chúng ta làm là nỗ lực tái tạo thành từ mắt tín đồ những thứ: góc nhìn, điểm mù, vươn lên là dạng, độ sâu ảnh, tiêu cự, góc nhìn...

Không gian 3 chiều

Nghe có vẻ ngớ ngẩn nhưng thực sự đề xuất nói rằng: thế giới 3D là 3d vì nó gồm 3 chiều. Tôi nói loại này do nó rất đặc biệt quan trọng để nói thêm rằng nó nhiều hơn thế nữa 2D một chiều và tinh vi hơn rất không hề ít so với 2D.

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

Như vậy nói theo cách khác khi thêm một chiều khác làm cho công việc của chúng ta phức tạp lên gấp những 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 sau cuối tôi mong muốn nhắc đến đó là điều này. Họ không chỉ thao tác trong thế giới 3D, bọn họ còn có chiều sản phẩm 4: thời gian. Rất nhiều sự đồ gia dụng trong thế giới 3D cần cửa hàng lẫn nhau, cần phải di chuyển, va chạm, cầm đổi. Cùng như tôi sẽ nói làm việc trên, việc đổi khác đó trong nhân loại 3D tạo ra nhiều tác dụng khác nhau.

Vậy đến bây giờ chúng ta đã có mang được 3 chiều 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 quả đât 3D

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

OpenGL là một MÁY TRẠNG THÁI (state machine) - điều này tức là toàn cỗ OpenGL làm việc trên tế bào hình xây dựng theo trạng thái. Để minh họa đến OpenGL, hãy tưởng tượng một máy phải Trục cảng hải phòng chẳng hạn. Ở đó có rất nhiều các thùng sản phẩm (container) với tương đối nhiều các khiếu nại hàng nhỏ dại bên trong. OpenGL tương tự như toàn cục khu cảng kia bao gồm:

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

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

*

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

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

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

Logic của OpenGL

OpenGL là thư viện bối cảnh khá ngắn gọn và súc tích. Hồ hết gì các bạn thấy vào các ứng dụng xử lý 3D chuyên nghiệp hóa là cực kỳ phức tạp chuyển động trên OpenGL. Vì xúc tích của OpenGL bao hàm thứ sau:

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

OpenGL vận động xoay quanh 3 định nghĩa này. Mỗi định nghĩa ở trên tự do nhau và làm nạm nào nhằm cả 3 rất có thể cùng nhau tạo thành các hiệu ứng 3D đẹp mắt (hay bao gồm cả với các ảnh 2D vị nó chỉ nên dạng 3d với độ sâu Z=0, 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à z)Các đường thẳng trong không khí (sự kết hợp của 2 điểm)về một tam giác trong không khí (sự kết hợp của 3 điểm)

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

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

Buffers

Nói một cách solo giản, buffer là một vùng lưu lại trữ tạm thời giúp cho việc tối ưu. Tất cả 3 một số loại Buffer:

Frame BufferRender BufferBuffer Object

Frame Buffer là trừu tượng và khó hiểu độc nhất trong cả 3 loại. Khi bạn tạo một cảnh, bạn cũng có thể gửi ảnh trực tiếp tới màn hình của thiết bị hoặc cho tới Frame Buffer. Về cơ phiên bản Frame Buffer là 1 trong những vùng nhằm lưu dữ liệu hình ảnh tạm. Cụ thể hơn, bạn có thể tưởng tượng nó như một áp ra output từ bộ render của OpenGL cùng gồm rất nhiều ảnh, không hẳn chỉ tất cả một. Những ả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 người tiêu dùng trong ko gian, những vùng giao nhau của các đối tượng người dùng và về những phần được hiện nay ra. Vị vậy Frame Buffer giống hệt như một tập gồm nhiều ảnh. Toàn bộ đều được lưu trữ dưới dạng tin tức mảng các giá trị pixel.

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

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

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

Structure là mảng trình bày các đối tượng người tiêu dùng 3D, vd: một mảng các đỉnh, mảng các tọa độ texture hoặc một mảng của rất nhiều gì bạn muốn. Indice thì rõ ràng hơn, mảng này được dùng làm xác định gồm bao nhiêu tam giác trong lưới sẽ được tạo nên dựa bên trên mảng structure.

Bạn vẫn khó khăn hiểu ư? Hãy coi 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ì 8 đỉnh?

*

Mỗi mặt là một trong hình vuông, nhưng chúng ta có hãy nhớ là OpenGL chỉ biết về các tam giác đúng không? do vậy chúng ta cần đưa những hình vuông đó thành những tam giác để triển khai việc cùng với OpenGL. Như vậy bọn họ có 12 tam giác tất cả!Ảnh ở trên được tạo thành bởi ứng dụng Modo, hãy xem góc dưới bên phải. Bọn chúng là những thông tin về đồ gia dụng thể của bọn chúng ta. Chúng ta có thể thấy bao gồm 8 đỉnh và 12 phương diện (GL: 12).

Các tam giác trong OpenGL là sự phối kết hợp của những đỉnh 3D. Vì vậy để chế tác ra bề mặt của mẫu hộp, 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 cách khác, chúng ta cần tái diễn 2 đỉnh ở 1 mặt của hình vuông. Nếu cố gắng hình hộp bởi một hình tất cả 12 phương diện thì từng đỉnh yêu cầu lặp 4 lần, giả dụ thay bởi một hình 16 mặt, chúng ta cần 6 lần lặp lại. Và cứ thế, việc tăng số lặp của những đỉnh lên cấp tốc chóng.

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

Giờ trở lại với Buffer Object, loại đầu tiên là một mảng các structure, như đỉnh 1, đỉnh 2, đỉnh 3, đỉnh 4,... Cùng 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 về tối ưu để gia công việc trực tiếp với GPU và các bạn không cần giữ mảng đó trong ứng dụng của công ty sau khi tạo nên một Buffer Object.

Rasterize

Rastersize là quá trình xử lý bởi vì OpenGL nhận tất cả thông tin về đối tượng người sử dụng 3D (bao có đỉnh, tọa độ, tính toán...) để tạo thành 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 của thiết bị.

Nhưng sinh sống bước ở đầu cuối này, việc kết nối giữa tin tức các px và thiết bị screen thuộc về những nhà cấp dưỡng thiết bị. Nhóm Khronos hỗ trợ API khác hotline là EGL, dẫu vậy đây chỉ nên api của những nhà sản xuất. Chúng ta, những developer vẫn không thao tác trực tiếp với Khronos EGL, cơ mà với phiên bản đã được đổi khác của các nhà cung cấp.

Vì vậy khi bạn tạo một OpenGL render, bạn cũng có thể chọn quá trình render thẳng lên màn hình, áp dụng EGL, hoặc render tới những Frame Buffer. Việc render tới các Frame Buffer, chúng ta vẫn làm việc trong OpenGL API, tuy nhiên nội dụng sẽ không được hiện ra bên trên màn hình. Câu hỏi hiển thị lên screen nằm xung quanh phạm vi của OpenGL API, nó là của EGL API. Bởi vì vậy tại thời điểm render, chúng ta cũng có thể chọn một trong các 2 các loại để xuất ra.

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

OpenGL pipelines

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

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

Shader giống như một đoạn code, thứ hạng như một công tác nhỏ, thao tác trực tiếp trong GPU để thực hiện 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 mặt phẳng vật thể, chiếc mà có một texture là T, bị đổi khác khi đâm vào một vật có texture là TB, sử dụng màu SC với phản nghịch chiếu mức SL, dưới ánh sáng L với độ mạnh LP theo góc LA từ khoảng cách Z với độ rọi F và tất cả đang nhìn vị mắt của Camera C tại vị trí p. Với ống kính T.

Những điều này có nghĩa nó rất là phức tạp để xử lý trên CPU và quá nhiều thứ bắt buộc làm đẩy cho thư viện xử trí đồ họa. Bởi vì vậy programmable pipeline chỉ cần cách chúng ta quản lý các thứ đó như vậy nào.

Còn fixed pipeline ngược với programmable pipeline! Fixed pipeline là thư viện đồ họa xử lý về tất cả các các loại và cho chúng ta api để thiết lập Camera, Material, ánh sáng, hiệu ứng.

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

Điểm một chút ít về cơ chế thao tác của hầu hết Shader này:

Bạn sản xuất chúng trong các file đơn nhất hoặc viết trực tiếp trong code của bạn, miễn làm sao nội dung ở đầu cuối chứa Shader Language sẽ tiến hành gửi cho OpenGL cùng biên dịch Shader cho mình (bạn thậm chí rất có thể dùng tiền-biên-dịch bên dưới dạng mã nhị phân, nhưng lại không trực thuộc 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 yêu cầu rất quan trọng, hãy xem chi tiết Vertex và Fragment như thế nào. Để hiểu đầy đủ gì mỗi loại shader làm, hãy quay trở về 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 những chương trình nhỏ dại sẽ được thực hiện ở từng đỉnh của mesh (mỗi thứ thể được làm cho bằng một lưới những tọa độ, gọi là mesh). Hãy xem hình vỏ hộp ở trên, hộp này còn có 8 đỉnh (giờ trong ảnh chỉ bao gồm 5 đỉnh đang rất được hiện ra thôi), bạn sẽ hiểu ngay sau đây thôi. Do vậy VSH sẽ được xử lý 8 lần bởi vì CPU.

Những gì Vertex Shader sẽ có tác dụng là xác định vị trí ở đầu cuối của đỉnh. Các bạn có nhớ rằng Programmable pipeline mang đến phép chúng ta điều khiển camera? đó là ở đây, vị trí với độ mở của ống kính camera gồm thể thay đổi vị trí ở đầu cuối của những đỉnh. Vertex Shader cũng có thể có trách nhiệm chuẩn bị và xuất ra vài variable (giá trị, biến) đến Fragment Shader. Trong OpenGL họ đị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à bạn sẽ hiểu.

Fragment Shader

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

Bạn có thấy đỉnh số 5 bị ẩn xuất xắc không? vị với vị trí cụ thể, góc quay núm thể, bọn họ chỉ rất có thể nhìn thấy 3 khía cạnh được hiện ra từ 7 đỉnh.

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

Bên vào Fragment Shader, họ sẽ thao tác với số đông thứ liên quan tới mặt phẳng của đồ thể, như hóa học liệu, cảm giác phản chiếu, đổ bóng, ánh sáng, tương phản, khúc xạ, tổ chức triển khai và ngẫu nhiên các hiệu ứng khác mà chúng ta muốn. Sản phẩm sau cùng là color của các pixel dưới định dạng RGBA.

Giờ thứ ở đầu cuối mà bạn nên biết đó là về VSH cùng FSH thao tác với nhau như vậy nào. Đó là buộc phải phải có một Vertex Shader còn chỉ 1 Fragment Shader, không rộng không kém, phải chính xác là 1-1. Để đảm bảo chúng ta không phạm lỗi, OpenGL tất cả một thứ hotline là Program. Một program vào OpenGL chỉ được biên dịch theo cặp 1 VSH cùng 1 FSH mà lại thôi.

Tổng kết

Đây là tất cả về định nghĩa OpenGL. Hãy nhớ đều điểm này:

OpenGL súc tích được tạo nên bởi 3 khái niệm cơ bản: Primitive, Buffer và Rasterize.Primitives bao gồm điểm, đường, tam giácBuffer có thể là Frame Buffer, Render Buffer hoặc Buffer Object.Rasterize là quá trình đổi khác OpenGL đo lường và 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 sẽ 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, vật dụng liệu, hiệu ứngProgrammable pipeline dễ sử dụng hơn, cấp tốc và dễ hiểu hơn, vị trong Programmable được cho phép OpenGL lập trình sẵn được cùng với Camera, ánh sáng, vật tư và hiệu ứng.Programmable pipeline là y hệt như Shader: Vertex Shader, mỗi đỉnh của mesh, cùng Fragment Shader - sinh hoạt mỗi phần hiển thị của mesh. Từng cặp Vertex Shader cùng Fragment Shader được biên dịch trong một thứ gọi là Program.

Hãy xem cả 3 bài, OpenGL hình như rất đơn giản dễ dàng và dễ hiểu. Đúng! nó đơn giản để hiểu dẫu vậy để học tập thì....haizzz3 điểm làm việc trên liệt kê ra các nhánh của OpenGL với để học tất cả chúng bạn chắc hẳn rằng cần vài tháng 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ả phần đông gì tôi vẫn học được vào 6 tháng rất là tập trung, đi sâu vào OpenGL. Trong phần tiếp sau tôi sẽ cho chính mình xem những hàm cơ bạn dạng và cấu trúc của một ứng dụng 3 chiều sử dụng OpenGL. Độc lập với ngôn ngữ lập trình mà ai đang sử dụng hoặc với thiết bị bạn đang sử dụng.

Nhưng trước lúc sang phần tiếp theo, tôi muốn nói với các bạn thêm một thiết bị nữa:

OpenGL Error API

OpenGL là 1 trong những máy trạng thái tuyệt đối hoàn hảo làm việc giống như một buộc phải trục làm việc cảng hải phòng đất cảng và bạn không nhất 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 có gì xẩy ra với vận dụng vì OpenGL trọn vẹn là ở mặt ngoài.

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

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

Nói chung họ đặt vài ba điểm khám nghiệm ở đa số nơi có thể xảy ra lỗi, gioogns như vấn đề biên dịch Shader hoặc cấu hình Buffer nhằm tránh các lỗi cơ bản.

Xem thêm: Lý Thuyết Địa 11 Bài 8 Tiết 1 1, Địa Lí 11 Bài 8: Liên Bang Nga

Phần tiếp theo

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