OpenGL: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Nowa wersja stabilna - 4.6 (31 lipca 2017)
infobox, WP:SK+ToS+mSK
Linia 1:
{{Oprogramowanie infobox
|nazwa = OpenGL
|rodzaj = [[Biblioteka programistyczna]] / [[ApplicationInterfejs Programmingprogramowania Interfaceaplikacji|API]]
|logo = Opengl-logo.svg
|grafika =
Linia 14:
|licencja =
|wikibooks =
|commons = Category:OpenGL
|www = https://www.khronos.org/opengl
}}
'''OpenGL''' ([[język angielski|ang.]] ''Open Graphics Library'') – specyfikacja [[Otwarty standard|otwartego]] i [[Wieloplatformowość|uniwersalnego]] [[ApplicationInterfejs Programmingprogramowania Interfaceaplikacji|API]] do [[Renderowanie|tworzenia]] [[Grafika komputerowa|grafiki]]. Zestaw funkcji składa się z 250 podstawowych wywołań, umożliwiających budowanie złożonych trójwymiarowych scen z podstawowych figur geometrycznych.
 
== Cel ==
=== Główny ===
Głównym celem jest tworzenie grafiki. Dzięki temu, że polecenia są realizowane przez sprzęt ([[Procesor graficzny|procesor graficzny = GPU]]), tworzenie grafiki następuje szybciej niż innymi sposobami. Ten efekt nazywamy '''przyspieszeniem sprzętowym'''.
OpenGL wykorzystywany jest często przez gry komputerowe i wygaszacze ekranu, spełnia rolę analogiczną, jak konkurencyjny [[Direct3D]] (część [[DirectX]]) w systemie [[Microsoft Windows|Windows]] firmy [[Microsoft]]. Również programy do przedstawiania wyników badań naukowych, [[KomputeroweProjektowanie wspomaganiewspomagane projektowaniakomputerowo|CAD]], oraz [[rzeczywistość wirtualna|wirtualnej rzeczywistości]] używają OpenGL.
 
=== Dodatkowy ===
Linia 30:
OpenGL, podobnie jak np. [[X Window System]], działa w [[Architektura oprogramowania|architekturze]] [[klient-serwer]]. Klientem w tym przypadku jest aplikacja wykorzystująca OpenGL, która zleca operacje graficzne do wykonania, a serwerem – aktualnie używana implementacja OpenGL (np. w sterowniku karty graficznej). Zwykle klient i serwer znajdują się na tej samej maszynie, jednak nie jest to konieczne – biblioteka jest zaprojektowana tak, aby możliwe było np. wyświetlanie grafiki OpenGL na zdalnym terminalu. Jednocześnie dzięki zastosowaniu zunifikowanego protokołu komunikacji wyświetlanie może odbywać się na zupełnie innej platformie niż ta, na której działa aplikacja.
 
Jedną z podstawowych cech OpenGL jest to, że jest on [[maszynaAutomat stanuskończony|maszyną stanu]] (''ang. state machine''). Na stan OpenGL w danym momencie składa się szereg parametrów i trybów działania, które można ustawić lub zapamiętać na stosie i później odtworzyć. Ich konfiguracja będzie miała bezpośredni lub pośredni wpływ na otrzymany rezultat [[renderingRenderowanie|renderingu]]u. Raz ustawiony parametr lub tryb działania pozostaje zachowany aż do następnej zmiany. Przykładami takich parametrów mogą być kolor rysowania, aktualnie używana [[teksturowanie|tekstura]], sposób działania [[Bufor Z|bufora Z]], [[macierz]] na której wykonywane są aktualnie operacje, oraz wiele innych.
 
Część z parametrów może być włączana lub wyłączana w sposób bardzo oczywisty, tzn. poprzez wywołanie funkcji ''glEnable()'' lub ''glDisable()'' (w tłumaczeniu brzmiałoby to: ''glWłącz()'' oraz ''glWyłącz()''), a inne ustawiane są poprzez wykonanie powiązanych z tymi parametrami funkcji (np. ''glBindTexture()'' – ustawienie aktywnej tekstury).
Linia 37:
 
== Geneza OpenGL ==
Pierwotna wersja biblioteki wyewoluowała ze stworzonej przez firmę [[Silicon Graphics|Silicon Graphics Inc.]] dla jej systemów graficznych biblioteki [[IRIS GL]]. W chwili obecnej implementacje OpenGL można znaleźć w praktycznie wszystkich nowoczesnych platformach. W większości przypadków implementacje te rozwijane są przez producentów sprzętu graficznego. Istnieje również otwarta implementacja – [[Mesa (informatyka)3D|Mesa]], zgodna z OpenGL na poziomie kodu, która jednak ze względu na brak licencji określana jest jako "bardzo podobna".
 
Do połowy 2006 rozwój OpenGL był kontrolowany przez organizację [[OpenGL Architecture Review Board|ARB]] (Architectural Review Board), powołaną w 1992 i zrzeszającą 10 firm ([[3DLabs]], [[Apple ComputerInc.|Apple]], [[ATI Technologies|ATI]], [[Dell]], Evans & Sutherland, [[Hewlett-Packard]], [[IBM]], [[Intel]], [[Matrox]], [[Nvidia|NVIDIA]], [[Silicon Graphics|SGI]], [[Sun Microsystems]]), które spotykały się raz na 3 miesiące, aby głosować i podejmować decyzje. 31 lipca 2006 komitet standaryzacyjny ARB opowiedział się w głosowaniu za wcieleniem tej organizacji do grupy roboczej [[Khronos Group|Khronos]], która prowadzi prace nad wieloma pokrewnymi projektami w tym [[OpenGL ES]], co w założeniach miało uprościć formalności, przyspieszyć prace i ujednolicić dalszy rozwój tych standardów. Prawa do logo i nazwy OpenGL nadal jednak należą do [[Silicon Graphics|SGI]].
 
Prace nowej grupy roboczej pozytywnie wpłynęły na podejście do społeczności programistów OpenGL. Postawiono na intensywną współpracę, szeroki kontakt oraz częste informowanie o postępach w pracy nad nowymi rozwiązaniami. Na życzenie użytkowników zaczęto pracować nad jednolitym [[Software Developmentdevelopment Kitkit|SDK]], które ma ułatwić poznanie tej biblioteki nowym deweloperom oraz dostarczać narzędzia przydatne do analizy, budowania i optymalizacji aplikacji, które z niej korzystają.
 
We wrześniu 2004 ARB opublikowała specyfikację OpenGL w wersji 2.0. Kolejna wersja 2.1 ujrzała światło dzienne w sierpniu 2006 i jest już oficjalnie firmowana przez [[Khronos Group|Khronos]]. Na rok 2007 zapowiedziano premierę dwóch kolejnych wersji OpenGL o kodowych nazwach "Longs Peak" i "Mt. Evans". Pierwsza z nich miała być zgodna z dotychczasowymi akceleratorami wykorzystującymi standard ''Shader Model 3.0'', kolejna miała obsługiwać już tylko karty następnej generacji.
Linia 75:
 
== Biblioteki pomocnicze ==
Mimo dużych możliwości, samo OpenGL jest interfejsem niskopoziomowym. Oznacza to, że zawiera ono np. funkcje rysujące pojedyncze wielokąty lub serie wielokątów, albo funkcje operujące na [[macierz]]y widoku, ale już na przykład funkcje pozwalające na ustawienie obserwatora w pewnym punkcie patrzącego w inny punkt (''gluLookAt''), narysowanie całej sfery (''gluSphere''), bądź automatyczne wygenerowanie [[mipmapaMipmapping|mipmap]] dla danej [[teksturowanie|tekstury]] (''gluBuild2DMipmaps''), realizowane są za pomocą biblioteki pomocniczej '''[[GLU]]''' (ang. ''GL Utility Library'').
 
Poza GL i GLU do wykorzystania OpenGL w aplikacji potrzebne są zwykle również inne biblioteki. Wynika to z faktu, że OpenGL zajmuje się tylko renderingiem grafiki i nie zawiera funkcji związanych z tworzeniem kontekstu graficznego, obsługą środowiska okienkowego, czy obsługą zdarzeń takich jak naciśnięcie klawisza na klawiaturze lub ruch kursora myszy. Funkcjonalność tę można dodać poprzez biblioteki, jak '''[[GLUTOpenGL (informatyka)Utility Toolkit|GLUT]]''' (ang. ''GL Utility Toolkit''), '''GLUI''', czy przeznaczone dla poszczególnych platform '''GLX''' (w przypadku środowiska [[X Window System]]) lub '''WGL''' (w przypadku Windows).
 
Istnieje również biblioteka '''[[Simple DirectMedia Layer|SDL]]''' (ang. ''Simple DirectMedia Layer''), realizująca funkcje podobne jak DirectX i jednocześnie umożliwiająca łatwe użycie OpenGL z jej poziomu.
 
Zarówno SDL jak i GLUT dostępne są dla wielu platform, a zatem pozwalają na efektywne tworzenie przenośnych aplikacji. W przeciwieństwie do SDL klasyczny GLUT (dzieło Marka Kilgarda) nie jest już jednak rozwijany i choć pojawiają się nieoficjalne wersje typu [[freeglut]], to rozwiązują one bardziej kwestie licencyjne niż podtrzymują rozwój tego oprogramowania.
Linia 90:
== Przykładowy kod ==
[[Plik:Schemat blokowy protokołu programowalnego OpenGL 3.3.png|mały|Potok programowalny OpenGL 3.3]]
Najmniejszy, najprostszy program wykorzystując możliwości OpenGL składa się z pięciu plików. Głównego pliku programu - main.cpp, klasy wykorzystującej możliwości OpenGL(mainwindow.cpp) oraz nagłówka do tej klasy (mainwindow.h), a także dwóch plików z kodem shaderów.
[[Plik:Kolejność przekształceń punktów w Open GL3.3.png|mały|Kolejność przekształceń punktów/wierzchołków]]
Przykład został napisany w języku C++ z wykorzystaniem bibliotek Qt. Wykorzystuje on '''OpenGL w wersji 3.3'''.
Linia 119:
* glGetProgramiv();
 
3) Obiekty - przygotowanie:
* glGenVertexArray();
* glBindVertexArray();
* glEnableVertexAtribArray();
Linia 177:
 
Plik '''main.cpp'''<syntaxhighlight lang="cpp-qt" line="1">
# include "mainwindow.h"
# include <QApplication>
# include <QSurfaceFormat>
 
int main(int argc, char *argv[])
Linia 198:
 
Plik '''mainwindow.h'''<syntaxhighlight lang="cpp-qt" line="1">
# ifndef MAINWINDOW_H
# define MAINWINDOW_H
 
//#include <QMainWindow>
# include <QOpenGLFunctions_3_3_Core>
# include <QOpenGLWidget>
 
class MainWindow : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core //public QMainWindow,
Linia 225:
};
 
# endif // MAINWINDOW_H
</syntaxhighlight>
 
Plik '''mainwindow.cpp'''<syntaxhighlight lang="cpp-qt" line="1">
# include "mainwindow.h"
 
# include <QOpenGLFunctions_3_3_Core>
# include <QFile>
# include <Qdebug>
 
struct vec3 { float x,y,z; };
Linia 314:
{1,1,0}, {1,1,0},
{-1,1,0}, {-1,-1,0} };
 
ilWiesz = 6;
 
Linia 359:
void MainWindow::paintGL()
{
qDebug() << "PaintGL - rysuje";
 
GLuint polozenie;
Linia 387:
polozenie = glGetUniformLocation(uchwytProg1, "textura");
if(polozenie != -1) glUniform1i(polozenie, 0); else qDebug() << "Brak zmiennej Uniform textura";
 
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex0);
Linia 407:
</syntaxhighlight>
 
Plik vshader.glsl - '''Shader Vertexów - Shader wierzchołków:'''<syntaxhighlight lang="cpp-qt">
# version 330
 
layout (location=0) in vec3 VertexPosition; //atrybut zerowy,
Linia 424:
vec4 b = a * macierz;
 
// Macierz translacji - przesuwania
mat4 macierzTran = mat4( 1, 0, 0, 0,
0, 1, 0, 0,
Linia 432:
b = b * macierzTran;
 
gl_Position = b;
// lub:
//gl_Position = vec4(VertexPosition, 1); //-- wówczas będzie bez rotacji i bez translacji
Linia 439:
</syntaxhighlight>
 
Plik fshader.glsl - '''Shader Fragmentów:'''<syntaxhighlight lang="cpp-qt" line="1">
# version 330 //Dyrektywa informująca o wersji OpenGL'a
 
// Zmienne wbudowane shadera:
// in vec4 gl_FragCoord
// in bool gl_FrontFacing
// in vec2 gl_PointCoord
Linia 459:
 
FragColor = texture(tekstura, tc);
// discard; - spowoduje nie nadanie wartości danemu tekslowi, na danych współrzędnych
}
</syntaxhighlight>
 
== Zobacz też ==
* [[Mesa (informatyka)3D|Mesa]]
* [[Direct3D]]
* [[OpenGL Shading Language]]