OpenGL: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
Usunięta treść Dodana treść
Nowa wersja stabilna - 4.6 (31 lipca 2017) |
Eurohunter (dyskusja | edycje) |
||
Linia 1:
{{Oprogramowanie infobox
|nazwa = OpenGL
|rodzaj = [[Biblioteka programistyczna]] / [[
|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]] [[
== 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, [[
=== 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 [[
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
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
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
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 [[
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 '''[[
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
[[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
* 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
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
# version 330
layout (location=0) in vec3 VertexPosition; //atrybut zerowy,
Linia 424:
vec4 b = a * macierz;
// Macierz translacji
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
# 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;
}
</syntaxhighlight>
== Zobacz też ==
* [[Mesa
* [[Direct3D]]
* [[OpenGL Shading Language]]
|