Programowanie w systemie UNIX/c grafika/OpenGL: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m →Biblioteki: ref |
linki, interpunkcja, literówki |
||
Linia 1:
=Definicja=
==Ścisła==
OpenGL w ścisłym znaczeniu oznacza
* standard
** tworzenia grafiki (
** GPGPU - używając renderowania poza ekranem (
Modified from Dominik Göddeke]</ref>
* nie jest biblioteką lecz specyfikacją (API). Nie jest związane ze sprzętem i dzięki temu jest wieloplatformowe, uniwersalne i abstrakcyjne. Nie posiada kodu źródłowego
* działa w architekturze klient-serwer
* system graficzny czasu rzeczywistego
** programowaniu równoległemu (
** bezpośredniemu dostępowi do karty graficznej (z pominięciem systemu operacyjnego)<ref>[http://rmantiuk.zut.edu.pl/
==Praktyczna==
W potocznym i praktycznym
* sprzęt ( karta graficzna z procesorem GPU)<ref>[http://askubuntu.com/questions/72766/how-do-i-find-out-the-model-of-my-graphics-card askubuntu question: how-do-i-find-out-the-model-of-my-graphics-card]</ref>
* oprogramowanie
** sterownik karty graficznej
** biblioteki pomocnicze
Linia 22:
= Typy kodu OpenGL =
[[File:Linux Graphics Stack 2013.svg|thumb|
Typy kodu OpenGL, podział wg
* OS (
* język programowania
* środowiska (
* platforma (
* wersja OpenGL
** legacy = 1 lub 2
** modern = czyli 3 lub 4 (
* biblioteki podstawowe i ich wersje (
* GUI lub konsola
* sprzętu (
* [[Programowanie_w_systemie_UNIX/c_grafika/OpenGL#Sterowniki_karty_graficznej|sterownika karty graficznej]] (
Ponieważ prawie dowolnie można łączyć powyższe cechy (
Dostęp do GPU:
* z poziomu X-window
* z poziomu konsoli bez X-window
=Test=
==Konsolowe==
Sprawdzamy instalację za pomocą konsolowego programu glxinfo (
glxinfo
Linia 52:
lub
glxinfo | more
lub
glxinfo > gl.txt
otrzymujemy
<pre>
Linia 85:
glxinfo | grep "OpenGL version"
przykładowy wynik
OpenGL version string: 3.0 Mesa 10.3.2
▲lub :
sudo /usr/lib/nux/unity_support_test -p -f
Przykładowy wynik
<pre>
Linia 114 ⟶ 113:
Unity 3D supported: yes
</pre>
===Karta graficzna ===
Sprawdzamy kartę i jej sterownik używając '''lspci'''
lspci | grep VGA
przykładowy wynik
01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 770] (rev a1)
lub '''nvidia-smi'''
nvidia-smi<ref>[http://stackoverflow.com/questions/13125714/how-to-get-the-nvidia-driver-version-from-the-command-line How to get the nvidia driver version from the command line ? - stackoverflow]</ref>
Linia 153 ⟶ 148:
</pre>
Za pomocą '''cat''' otrzymujemy informacje o aktualnie załadowanym module jądra (ang. the version of the currently loaded NVIDIA kernel module
cat /proc/driver/nvidia/version
otrzymujemy
NVRM version: NVIDIA UNIX x86_64 Kernel Module 319.60 Wed Sep 25 14:28:26 PDT 2013
GCC version: gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
Za pomocą '''dkms'''
dkms status
otrzymujemy
nvidia-304-updates, 304.108, 3.11.0-15-generic, x86_64: installed
Program
===Przyspieszanie sprzętowe ===
Sprawdzamy czy mamy przyśpieszanie sprzętowe
glxinfo | grep renderer
otrzymujemy
OpenGL renderer string: GeForce GTX 770/PCIe/SSE2
to znaczy, że mamy przyspieszanie sprzętowe. Jeśli
Mesa GLX Indirect
to
== Graficzne==
Linia 201 ⟶ 187:
* strona Nvidia: Smart Scan <ref>[http://www.nvidia.com/Download/Scan.aspx?lang=en-us The NVIDIA Smart Scan page (requires the latest version of Java)]</ref>
* Gpu Test <ref>[http://www.geeks3d.com/20121113/gputest-0-2-0-cross-platform-opengl-benchmark-furmark-lands-on-linux-and-os-x/ Gpu test]</ref>
* LuxRender <ref>[http://www.luxrender.net/
* w przeglądarce chrome wpisz
=Błędy=
Linia 208 ⟶ 194:
== undefined reference to ==
Spróbujmy skompilować przeglądarkę dla programistów w Ubuntu używając komendy
gcc v.c -lm -lGLU -lglut -Wall
Otrzymamy
<pre>
v.c: In function ‘readPPM’:
Linia 224 ⟶ 208:
</pre>
Błąd. Kompilator nie widzi definicji procedury glDrawPixels. W
gcc v.c -lm -lGL -lGLU -lglut -Wall
v.c: In function ‘readPPM’:
Linia 234 ⟶ 216:
Czasem kolejność też ma znaczenie<ref>[http://stackoverflow.com/questions/8892251/undefined-reference-to-symbol-glulookat
==Różne wersje sterownika karty graficznej i modułu jądra==
=Elementy
Linia 253 ⟶ 235:
==Sterownik==
===wersje===
Wersje
* własnościowe sterowniki (
**Nvidia<ref>[http://www.nvidia.com/object/unix.html Nvidia Unix Driver Archive]</ref>
** AMD
* otwarte sterowniki (ang.
** Nouveau: Accelerated Open Source driver for nVidia cards. <ref>[
** MESA (
** Intel
** ATI/AMD (
Sterowniki własnościowe Nvidii powoduję konflikt ze sterownikami Nouvoux. <ref>[https://help.ubuntu.com/community/BinaryDriverHowto/Nvidia
===Etapy instalacji ===
* dodanie kodu do drzewa (ang. add)
* kompilacja (
* instalacja (
* ładowanie modułu do jądra
===Elementy===
====kod źródłowy====
* jądra
* modułu
====Moduł jądra====
Linia 286 ⟶ 266:
Moduł
/lib/modules/wersja_jadra/kernel/drivers/video/nvidia.ko
lsmod | grep nvidia
przykładowy wynik
nvidia 9430379 50
drm 297056 2 nvidia
Mamy więc próbujemy otrzymać więcej informacji o nim za pomocą [[Linux/modinfo|modinfo]]
modinfo nvidia
wynik
ERROR: Module nvidia not found.
Przyczyną tego jest alias<ref>[[
modprobe --resolve-alias nvidia
wynik
nvidia_319
i
modinfo nvidia_319
Wynik
<pre>
filename: /lib/modules/3.11.0-19-generic/updates/dkms/nvidia_319.ko
Linia 358 ⟶ 332:
==Biblioteki==
Pakiety
* freeglut3 freeglut3-dev
* libglew1.5 libglew1.5-dev
* libglu1-mesa, libglu1-mesa-dev, libgl1-mesa-glx , libgl1-mesa-dev
kompilacja
gcc -lglut -lGL -lGLU -lGLEW example.c
W kodzie
<source lang=c>
#include <GL/glew.h>
Linia 376 ⟶ 350:
</source>
Pliki nagłówkowe bibliotek
* gl.h
* glu.h
Linia 384 ⟶ 358:
==== GL ====
GL = Graphic Library (
Otrzymujemy dostęp do OpenGL-1.1. Na więcej potrzebujemy rozszerzeń, np. za pomocą biblioteki GLEW<ref>[http://stackoverflow.com/questions/12122631/difference-between-opengl-files-glew-h-and-gl-h-glu-h Różnice między bibliotekami]</ref>
====GLU ====
GLU = Graphics Library Utility (
===GUI===
Lekkie/ proste
* [[Programowanie_w_systemie_UNIX/c_grafika/OpenGL/glut|GLUT / freeglut]]
Złożone
* GLFW <ref>[http://www.glfw.org/ GLFW]</ref>
* GTK+
Linia 401 ⟶ 375:
* Qt
* GLUS <ref>[https://www.opengl.org/sdk/libs/GLUS/ GLUS]</ref>
====GLUT====
* GLUT
Linia 408 ⟶ 380:
====GLFW====
Wymagania
* gcc
*
* X11
* xorg-dev
Linia 417 ⟶ 389:
* cmake
Etapy
* ściągnięcie kodu źródłowego biblioteki<ref>[http://www.glfw.org/download.html
* kompilacja biblioteki <ref>[http://www.glfw.org/docs/latest/compile.html Kompilacja GLFW ]</ref>
Linia 427 ⟶ 399:
Sprawdzamy
sudo updatedb
locate glfw3.pc
przykładowy wynik
/home/a/cn/glfw-3.0.4/src/glfw3.pc
/home/a/cn/glfw-3.0.4/src/glfw3.pc.in
Linia 456 ⟶ 426:
====SFML====
SFML = Simple and Fast Multimedia Library (
===Rozszerzenia===
Biblioteki rozszerzeń (
* nieoficalny
* GLEW
* gl3w <ref>[http://github.com/shakesoda/gl3w gl3w]</ref>
Linia 467 ⟶ 437:
====GLEW====
GLEW = OpenGL Extension Wrangler Library (
GLEW jest napisany w ANSI C.
#include<GL/glew.h>
#include<GL/gl.h>
Linia 477 ⟶ 445:
#include<GL/glut.h>
Kompilacja
-lGLEW -lGLU -lGL - lglut
GLEW zawiera dodatkowe programy konsolowe, np.
glewinfo>i.txt
W pliku i.txt jest informacja
<pre>
---------------------------
Linia 498 ⟶ 466:
</pre>
Następnie jest lista rozszerzeń i informacja o dostępności (
===matematyczne===
* GLM is a C++ mathematics library (
===graficzne===
* GLI (
*
Linia 510 ⟶ 478:
==Pierwszy program ==
Konsolowy program korzystający z bibliotek GL, GLU i GLUT. Tworzy okno wypełnione czerwonym kolorem <ref>[http://
<source lang=c>
Linia 555 ⟶ 523:
==GLEW==
Konsolowy program korzystający z glew
<source lang="c">
//gcc c.c -lGLEW -lGL -lGLU -lglut
//./a.out
Linia 566 ⟶ 534:
#include<GL/glu.h>
{ ▲ glutInit(&argc, argv);
▲ glewInit();
▲ if ( GL_VERSION_4_0) printf("OpenGL 4.0 is supported\n");
}
</source>
Linia 621 ⟶ 587:
</source>
Sprawdzamy rozszerzenia
<source lang=c>
Linia 698 ⟶ 664:
}
</source>
==Zapisywanie obrazu==
* kod (paul bourke
==Przeglądarka obrazów dla programistów ==
Ten program
* działa tylko dla legacy OpenGL API !
* otwiera binarne pliki ppm (P6) i pgm (
* wyświetla je w nowym oknie (
* na konsoli tekstowej wyświetla
** typ pliku,
** szerokość, wysokość,
** komentarz,
** dane punktu nad którym znajduje się mysz (
Program służy do analizy plików graficznych.
Linia 1130 ⟶ 1094:
|}
Q
A
▲Q : Czego lepiej używać, wymiarów typu 1.0f, -2,0f, czy wartości w pixelach 100, 550 - przy rysowaniu ?
np: glVertex2i(x,y), glVertex2f(x,y), glVertex3d(x,y,z) itd." <ref>[http://cpp0x.pl/forum/temat/?id=3091
▲A : "Używaj tego co Ci wygodniej. Większość instrukcji operujących na wierzchołkach ma wersje dla liczb całkowitych - te z przedrostkiem i, jak i zmiennoprzecinkowych - te z przedrostkiem f(float) lub d(double)).
▲np: glVertex2i(x,y), glVertex2f(x,y), glVertex3d(x,y,z) itd." <ref>[http://cpp0x.pl/forum/temat/?id=3091 Forum Serwisu programistycznego C i C++ : [OPENGL] glViewport a gluOtrho2d] </ref>
Q
A
* w inicjalizacji
* w funkcji zmieniającej rozmiar okna (
===Typy===
====World====
Domyślnie współrzędne okna światowego (
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
Miejsce lewego dolnego rogu wyświetlanego obrazu
glRasterPos2i(-1.0, -1.0); // in Draw procedure
Linia 1158 ⟶ 1121:
====Screen====
W
* rozdzielczość ekranu (
* wielkość okna ekranu (ang.
* wielkość fragmentu okna ekranu gdzie jest wyświetlany obraz (
Współrzędne są liczbami całkowitymi
glutInitWindowSize(2560, 1440); // screen width, screen height in poixels
Linia 1178 ⟶ 1141:
===Przeliczanie===
Przeliczanie współrzędnych
* World window: W_L, W_R, W_B, W_T
* Viewport: V_L, V_R, V_B, V_T
* punkt
** współrzędne world
** współrzędne viewport
world_height=world_width*view_port_height/view_port_width
|