Grafika 3D
 
  Zarejestruj się
::  Newsy  ::  Pliki  ::  Twoje Konto  ::  Forum  ::
Menu
· Strona główna
· Forum
· Linki
· Lista u?ytkowników
· O nas...
· Pliki
· Statystyki
· Twoje Konto
Tutoriale
· API
· Matematyka
· Teoria
· Direct3D
· OpenGL
· Techniki
Kto Jest Online
Aktualnie jest 44 gość(ci) i 0 użytkownik(ów) online.

Jesteś anonimowym użytkownikiem. Możesz się zarejestrować za darmo klikając tutaj
Tutoriale - OpenGL - Wstęp

Witam w dziale poświęconym drugiej, z aktualnie najpopularniejszych bibliotek do tworzenia grafiki 3D czasu rzeczywistego. Wielu Czytelników tej strony długo domagało się uruchomienia działu OpenGL, więc w końcu się złamałem i taki dział powstaje właśnie z tym artykułem. Czegóż takiego nauczymy się w tym miejscu. Otóż wielu z Was na pewno miało do czynienia ze stroną umieszczoną pod adresem http://nehe.gamedev.net. Znajdują się tam znakomite tutoriale, które umożliwiają naukę OpenGL-a praktycznie od samych podstaw a na skomplikowanych efektach kończąc. Nasz kurs będzie miał na celu to samo. Rozpoczniemy od podstaw, prostych figur, przekształceń i będziemy kontynuować aż nam się znudzi, co mam nadzieję, nigdy nie nastąpi. Przy opisie OpenGL-a, jak pewnie wielu z Was słusznie zauważy, będziemy się posługiwać bardzo dobrą i bardzo znaną książką. Będzie to osławiona "Czerwona Księga" (The Red Book), bez której nie może się obejść nikt, kto programuje za pomocą OpenGL. Książkę tę można znaleźć w Internecie w wielu miejscach, no ale tutaj musicie liczyć na własne siły :-).

A przechodząc do sedna sprawy - czym jest OpenGL?
Jest dokładnie tym samym, czym jest DirectX. Jest programowym interfejsem do naszego urządzenia graficznego. Co to znaczy powinniśmy już doskonale wiedzieć, ale dla tych odpornych na wiedzę powtórzę. Jest to zestaw funkcji, które pozwolą nam wycisnąć z naszego akceleratora jego wszystkie możliwości i w pewnym momencie nawet stwierdzenie, że czas kupić nową kartę grafiki :-). Ale zanim do tego dojdzie, będziemy musieli przejść długą drogę, między innymi za pomocą tego właśnie kursu. O czym będzie mowa? W zasadzie o tym samym co w przypadku DirectX-a. Poznamy od początku podstawy przygotowania okna do renderingu, otrzymywania podstawowych figur, brył, używania tekstur i tak dalej. W zasadzie postaramy się dokładnie odzwierciedlić to, z czym mieliśmy do czynienia w przypadku DirectX-a.
Cóż możemy zatem napisać o OpenGL-u. Jak wspomniałem, jest to interfejs programowy a więc zawiera funkcje, które my możemy wykorzystać. Funkcji tych nie jest wiele - podstawowych jest około 150. Mowa będzie o OpenGL-u w wersji 1.1 a więc już nie najnowszej daty, ale dostępnym dla nas na platformie Windows od 95 w górę. Czym charakteryzuje się ta biblioteka? Przede wszystkim jest niezależna od platformy sprzętowej czy systemowej. Jest to osiągalne dzięki temu, że nie zawiera ona żadnych specyficznych funkcji do zarządzania oknami i obsługi wejścia/wyjścia. Znajdziemy tam tylko funkcje, które umożliwią nam rysowanie i obsługę wszystkich bajerów graficznych i będziemy mieć gwarancję, że ten fragment kodu, który napiszemy z wykorzystaniem tylko tych funkcji, będzie działał wszędzie tam, gdzie obsługiwany jest OpenGL. Ponieważ jednak bez tego byłby bardzo marnym pakietem, pomimo swoich niebanalnych możliwości, do każdej implementacji dołączany jest pewien dodatek, który nieco umili nam życie. Jest to biblioteka nazywana GLU (GL Utilities). Jest to coś jak odpowiednik biblioteki D3DX, znanej nam z DirectX. Zawiera ona pewne pożyteczne funkcje, między innymi do ustawiania macierzy, rysowania prymitywów itp. Jest oczywiście o wiele uboższa od D3DX, ale dla naszych potrzeb zupełnie wystarczy na początek. Główną zaletą biblioteki, podnoszoną w wielu dyskusjach i wojnach o wyższości OpenGL-a nad DirectX (i odwrotnie) jest ogromna prostota w posługiwaniu się nią. I w zasadzie jest to prawda. Kiedy popatrzeć na najprostszy program korzystający z OpenGL-a i DirectX-a, to wszystko przemawia na korzyść tego pierwszego. Wystarczy zwykła funkcja main() i kilka linii kodu, aby zacząć zabawę. No ale oczywiście nie ma róży bez kolców. Prostota pakietu została okupiona jego zbyt małą funkcjonalnością jak na dzisiejsze czasy. Mówiąc o funkcjonalności mam na myśli możliwości współczesnych akceleratorów, dla których podstawowy zestaw funkcji OpenGL-a to zaledwie ułamek wszystkiego co potrafią. Dlatego też niezbędne staje się korzystanie z tak zwanych rozszerzeń biblioteki (OpenGL Extensions). Czym są rozszerzenia będzie jeszcze okazja powiedzieć, dodam tylko, że wiele z nich zostaje wprowadzonych w nowych wersjach biblioteki jako jej standardowe elementy. Dzisiaj mamy wersję 2.0 pakietu OpenGL. Ponieważ on sam istnieje o wiele, wiele dłużej od bibliotek DirectX-a, może powstać pytanie dlaczego teraz mamy już wersję 9 DirectX-a, natomiast OpenGL doszedł dopiero do wersji 2.0. Ustalaniem standardu OpenGL-a zajmuje się pewna komisja - ARB, czyli Architecture Review Board. W jej skład wchodzą czołowi producenci sprzętu i oprogramowania na świecie tacy jak: SGI, IBM, Intel, Microsoft i kilku innych. To dzięki niej OpenGL ma dzisiaj takie oblicze a nie inne, ona zatwierdza i ustala, co ma być w kolejnej wersji obecne i tym podobne, standaryzuje wszelkie rozszerzenia. Ona też akceptuje większość rozszerzeń obecnych na większości akceleratorów i standaryzuje je, aby każdy przeciętny zjadacz chleba mógł z nich korzystać. Sama biblioteka wywodzi się z firmy SGI i jej pakietu do grafiki 3D nazywanego IRIS GL. Był to pakiet dla stacji roboczych o nazwie Iris i stanowił on podstawę do opracowania OpenGL, który w krótkim czasie stał się standardem przemysłowym i znalazł bardzo szerokie zastosowanie w grafice czasu rzeczywistego. Pierwsza wersja pochodzi z roku 1992 i została w całości opracowana przez SGI. W 1995 roku komisja ARB opracowała wersję 1.1 standardu, którym posługiwano się wiele, wiele lat aż do czasu, kiedy na rynek weszły procesory graficzne serii GeForce firmy nVidia. Wtedy też zaczęła się prawdziwa rewolucja w świecie komputerowej grafiki 3D a OpenGL został zmuszony do szybszego rozwoju.

Teraz nadszedł czas na ten trudny moment :-) a więc... Czym różni się OpenGL od DirectX-a? Wiele już było wojen na ten temat i wiele przetoczyło się argumentów. Jednym z najważniejszych jest oczywiście przenośność OpenGL-a na inne systemy operacyjne. Możemy więc korzystać sobie z funkcji biblioteki zarówno w Windowsie, Linuksie, Uniksie i wielu, wielu innych. Pozwala to tworzyć w pełni przenośne aplikacje, szczególnie na poziomie kodu obsługującego samą grafikę. Inicjalizacją okien i tego typu rzeczami niestety musimy zająć się sami. Dla wielu jest to argument zupełnie wystarczający, aby zupełnie odrzucić DirectX-a. Ale popatrzmy dalej. OpenGL, jak wspomniałem wyżej, zawiera tylko ok. 150 funkcji podstawowych. Czy to wystarczy do wyciśnięcia z naszej karty wszystkiego, co się da? Na pewno nie. Przy takich możliwościach, jakie oferują nam dzisiejsze akceleratory, te funkcje to zaledwie cząstka tego, co one potrafią. Ma to i zalety i wady. Zaleta jest niewątpliwie taka, że początkujący nie będą gubić się w gąszczu interfejsów, metod i funkcji, tak jak to jest w przypadku DirectX-a. Opanowanie 150 funkcji, które dodatkowo są napisane w konwencji czystego języka C, znacznie ułatwia nam sprawę. Zupełnie banalna jest inicjalizacja pakietu, przygotowanie okna do renderingu i czynności inicjalizacyjne. Wiele kontrowersji budzi także porównanie wydajnościowe obu naszych pakietów do generowania grafiki 3D. Tak szczerze mówiąc, przy możliwościach współczesnego sprzętu różnice te są praktycznie niezauważalne. Fanatycy na pewno będą wytykać różnice w poszczególnych klatkach czy to w Quake'u czy Unrealu, będą porównywać jakość obrazu i tym podobne. Nam na tym nie będzie zależało. My tylko chcemy się nauczyć jak ruszyć do przodu, jak nauczyć się korzystać zarówno z jednego jak i drugiego. Wracając jednak do różnic pomiędzy obydwoma pakietami, na pewno DirectX przeważa pod względem kompleksowej obsługi aplikacji. Obsługa kart dźwiękowych, wszelkiego rodzaju sprzętu sterującego począwszy od klawiatury, myszki a skończywszy na najnowszych joystickach i kierownicach z technologią Force Feedback, kart sieciowych i tym podobnych jest z wykorzystaniem DirectX banalnie prosta, czego nie można powiedzieć już o OpenGL-u. On był od samego początku projektowany jako API do obsługi grafiki 3D. Skoro już powyżej wspomniałem o wydajności, to wspomnieć należy, że jednak OpenGL dysponuje nieco lepszą jakością generowanej grafiki, ale dzięki temu DirectX nadrabia niekiedy szybkościowo. Ogólnie jednak biorąc, prawie każdy współczesny akcelerator obsługuje zarówno jedną jak i drugą bibliotekę i naprawdę różnice są zupełnie do pominięcia i zależą przede wszystkim od budowy poszczególnych procesorów graficznych.

Wiemy już zatem mniej więcej z czym to się je, po co nam to potrzebne, więc co my z tym teraz zrobimy... Oczywiście mógłbym od razu w tym tutorialku omówić przykładowy kod programu korzystającego z OpenGL, ale nie zrobię tego, żeby nie mieszać. Otóż główne zamieszanie będzie wokół tego, w jaki sposób będziemy pisać aplikację. Ja preferowałbym pisanie pod Windows, bez użycia programów konsolowych. Programy konsolowe, zawierające funkcję main() są krótkie i przejrzyste. Dlaczego więc upieram się, aby z nich nie korzystać? Zawsze przy odpalaniu programu konsolowego oprócz właściwego okienka z grafiką otwierałoby się nam okienko z konsolą. Może i niewiele ono przeszkadza, ale wiem, że większość z Was ono po prostu drażni. Po drugie chciałbym też Wam pokazać, jak tworzyć programy korzystające z OpenGL-a w jednym okienku pod Windows. Ci, którzy znają się trochę na innych systemach, na pewno nie będą mieli problemów z przeniesieniem kodu na inne platformy, natomiast my, skoro już zaczęliśmy się bawić w Windows, to będziemy robić to dalej. Ponieważ już zacząłem wspominać o konkretnych systemach, więc trzeba jeszcze powiedzieć o czymś takim jak rozszerzenia pod konkretny system operacyjny. Nie jest to jednak to samo, o czym była mowa powyżej! Rozszerzenia, o których wspominałem powyżej, dotyczą samych technik generowania określonego efektu - na przykład wielokrotnego teksturowania. Rozszerzenia, o których mowa teraz, dotyczą konkretnego systemu operacyjnego. Cóż one będą zawierać? W Windowsowej wersji biblioteki OpenGL-a Microsoft był nam uprzejmy dodać kilka specyficznych funkcji do zarządzania kontekstami rysowania, przełączania buforów i tym podobnych. Innymi słowy przydatnych raczej przy tworzeniu okna a nie przy samym rysowaniu. To rozszerzenie nosi nazwę "wgl". My w swoich programach będziemy często z nich korzystać, dlatego o nim wspominam. Oczywiście rozszerzeń tych nie będzie na takich systemach jak Linux czy Unix. Na pewno w następnej lekcji będziemy już mieli okazję z tego skorzystać.

No i cóż. To chyba tyle, ile chciałem Wam przekazać dzisiaj, kilka słów na początek no a w następnej lekcji zaczniemy już tworzyć pierwsze okienka i będziemy próbować coś rysować. Do zobaczenia więc.

©Copyright by Robal   



Tutoriale - OpenGL
Nasze newsy s� w RSS: backend.php
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Tworzenie strony: 0.06 sekund

:: Layout strony został stworzony przez www.nukemods.com w oparciu o styl phpbb2 Helius, którego autorem jest Cyberalien ::