Nowoczesna OpenGL - rendering wielokątów Rendering wielokątów w kontekście biblioteki SFML

Wielkość: px
Rozpocząć pokaz od strony:

Download "Nowoczesna OpenGL - rendering wielokątów Rendering wielokątów w kontekście biblioteki SFML"

Transkrypt

1 Nowoczesna OpenGL - rendering wielokątów Rendering wielokątów w kontekście biblioteki SFML Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania Marzec 2017 Mirosław Głowacki (AGH, UJK) OpenGL / 79

2 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

3 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

4 Potok OpenGL Przetwarzanie strumienia grafiki komputerowej przy użyciu shaderów obejmuje następujące po sobie etapy przetwarzania danych wejściowych w celu uzyskania obrazu końcowego - poszczególne kroki ilustruje rysunek: Mirosław Głowacki (AGH, UJK) OpenGL / 79

5 Wierzchołki Tworzenie obrazu przy użyciu OpenGL zaczyna się od utworzenia zbioru wierzchołków (ang. vertex). Wierzchołkami nazywamy punkty, z których kształtuje się trójkąty i inne wielokąty. Każdy z tych punktów jest przechowywany z pewnymi atrybutami i to do programisty należy decydzja, jakie cechy należy przechowywać. Powszechnie stosowane są atrybuty pozycji 3D we współrzędnych świata oraz współrzędne tekstury. Wierzchołki są danymi wejściowymi shadera wierzchołków - części oprogramowania sprzętowego karty graficznej. Shader wierzchołków to niewielki program uruchamiony na karcie graficznej, który przetwarza każdy z wierzchołków indywidualnie Mirosław Głowacki (AGH, UJK) OpenGL / 79

6 Shader wierzchołków Shader wierzchołków to miejsce, gdzie odbywa się przekształcanie pozycji wierzchołków: z trójwymiarowego układu współrzędnych świata do znormalizowanego układu urządzenia NDC. Ważne atrybuty wierzchołków, takie jak kolor czy współrzędne zaczepienia tekstury, przechodzą dalej wzdłuż strumienia grafiki. Z tak przekształconych wierzchołków karta graficzna będzie tworzyć trójkąty, linie lub punkty w procesie zwanym shape assembly. Utworzone prymitywy stanowią podstawę złożonych kształtów. Do wyboru jest kilka dodatkowych trybów rysowania, takich jak: pasma trójkątów (ang. triangle strips ), i linii (ang. line strips ). Umożliwia to ograniczenie liczby przekazywanych wierzchołków dla obiektów, dla których każdy następny prymityw jest połączony z poprzednim - np. ciągła linia składająca się z kilku segmentów. Mirosław Głowacki (AGH, UJK) OpenGL / 79

7 Shader geomertii Kolejnym krokiem przetwarzania strumienia grafiki jest shader geometrii (ang. geometry shader ), który jest całkowicie opcjonalny i został wprowadzony do użytku dopiero niedawno. W przeciwieństwie do shadera wierzchołków shader geometrii może generować i przekazać dalej dodatkowe informacje. Wejściowe prymitywy z etapu shape assembly mogą być: przekazywane dalej w dół strumienia grafiki bez zmian, modyfikowane przed przekazaniem, w całości odrzucone, zastąpione innymi prymitywnami. Ponieważ komunikacja pomiędzy GPU a resztą komputera jest stosunkowo wolna, etap ten może zmniejszyć rozmiar danych, które muszą zostać przekazane dalej. Przykładowo kostki voxeli mogą być tworzone w shaderze geometrii na bazie wierzchołków punktowych i ich współrzędnych i atrybutów oraz przekazywane dalej zamiast wierzchołków. Mirosław Głowacki (AGH, UJK) OpenGL / 79

8 Shader fragmentów Po tym, jak ostateczna lista kształtów jest kompletna i dostosowana do współrzędnych ekranu, rasteryzator konwertuje widoczne elementy kształtów na zbiór fragmentów wielkości piksela. Atrybuty wierzchołków pochodzące z shadera wierzchołków lub shadera geometrii są interpolowane dla każdego fragmentu i przekazywane jako dane wejściowe do shadera fragmentów. Kolory są równomiernie interpolowane dla każdego z fragmentów, które tworzą trójkąt, choć zostały określone jedynie dla trzech punktów stanowiących wierzchołki trójkąta. Shader fragmentów przetwarza pojedynczo każdy fragment wraz z jego interpolowanymi atrybutami i określa jego ostateczny kolor poprzez: pobranie próbki z tekstury zaczepionej w wierzchołkach lub proste przekazanie koloru fragmentu. Mirosław Głowacki (AGH, UJK) OpenGL / 79

9 Mieszanie fragmentów i testowanie buforów W bardziej zaawansowanych scenariuszach, są również kalkulowane: oświetlenie i cieniowanie, efekty specjalne, możliwość opuszczenia fragmentu, co oznacza, że kształt będzie w tym miejscu przezroczysty. Ostatecznie, efekt końcowy jest budowany ze wszystkich fragmentów kształtu przez: mieszanie ich ze sobą, testowanie bufora głębokości dla każdego fragmentu, testowanie bufora szablonowego dla poszczególnych fragmentów. Negatywny wynik jednego z powyższych testów powoduje odrzucenie fragmentu. Na przykład, jeśli jeden trójkąt zasłonia inne trójkąty, to wynik testowania bufora głębokści jest dla fragmentów tych innych trójkątów negatywny. Mirosław Głowacki (AGH, UJK) OpenGL / 79

10 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

11 Obiekty sceny graficznej Na początek należy określić dane niezbędne do tego, aby karta graficzna zwróciła prawidłową scenę. Jak już wspomniano, te dane to atrybuty wierzchołka. Istnieje dowolność w przekazywaniu atrybutów, ale podstawowe i zawsze wymagane to pozycja we współrzędnych świata - niezależnie od tego czy tworzymy grafikę 2D czy 3D. Gdy wierzchołki zostaną przetworzone wg przedstawionego algorytmu, ich współrzędne zostaną przekształcone do współrzędnych urządzenia. Mirosław Głowacki (AGH, UJK) OpenGL / 79

12 Obiekty sceny graficznej Współrzędne urządzenia to x i y, odwzorowywane na ekranie w zakresie ( 1.0, 1.0). Umieśćmy na scenie trójkąt o wierzchołkach ulokowanych w punktach (0, 0.5), (0.5, 0.5) i ( 0.5, 0, 5) zgodnie z ruchem wskazówek zegara. Mirosław Głowacki (AGH, UJK) OpenGL / 79

13 Obiekty sceny graficznej Jedyną różnica między wierzchołkami przedstawionymi na rysunku jest pozycja, więc będzie to jedyny atrybut. Ponieważ definiujemy trójkąt bezpośrednio we współrzędnych urządzenia, to x i y są wystarczające. OpenGL oczekuje na wysyłanie wszystkich wierzchołków w postaci jednego wektora, co może na początku wydawać się mylące. Aby zrozumieć format tego wektora, zobaczymy jak będzie on wyglądał dla naszego przykładowego trójkąta. float vertices[] = { 0.0f, 0.5f, // Vertex 1 (X, Y) 0.5f, -0.5f, // Vertex 2 (X, Y) -0.5f, -0.5f // Vertex 3 (X, Y) }; Mirosław Głowacki (AGH, UJK) OpenGL / 79

14 Wektor wierzchołków Wektor powinien zawierać listę wszystkich wierzchołków z ich atrybutami spakowane razem. Kolejność w jakiej pojawiają się atrybuty, nie ma znaczenia tak długo, jak jest ona taka sama dla każdego wierzchołka. Kolejność wierzchołków nie musi być sekwencyjna - czyli nie muszą one występować koniecznie w kolejności, w której powstają kształty. Wymaga to jednak dostarczenia dodatkowych danych w postaci bufora elementów. Kwestia ta zostanie omówiona na końcu wykładu, ponieważ teraz byłoby to skomplikowane. Mirosław Głowacki (AGH, UJK) OpenGL / 79

15 Vertex Buffer Object - VBO Następnym krokiem jest przesłanie danych dotyczących wierzchołków do karty graficznej. Jest to ważne, ponieważ pamięć karty graficznej jest o wiele szybsza i nie ma wtedy potrzeby przesyłania danych za każdym razem, gdy scena musi być renderowana (około 60 razy na sekundę). Można to zrobić tworząc Vertex Buffer Object ( VBO ) GLuint vbo; glgenbuffers(1, &vbo); // Generate 1 buffer Pamięć jest zarządzana przez OpenGL, więc zamiast wskaźnika dodatnia liczba jest odniesieniem do bufora. GLuint vbo (substytut unsigned int vbo ) jest liczbą potrzebną do uaktywnienia VBO lub zniszczenia go, gdy przestaje być potrzebny. Mirosław Głowacki (AGH, UJK) OpenGL / 79

16 Vertex Buffer Object - VBO Aby przesłać aktualne dane do VBO trzeba najpierw uczynić go aktywnym obiektem wywołując glbindbuffer : glbindbuffer(gl_array_buffer, vbo); Oprócz GL_ARRAY_BUFFER typu wyliczeniowego istnieją inne rodzaje buforów, ale nie są one ważne w tej chwili. Dyskutowana instrukcja czyni właśnie utworzony VBO aktywnym, co pozwala na skopiowanie do niego danych wierzchołków instrukcją: glbufferdata(gl_array_buffer, sizeof(vertices), vertices, GL_STATIC_DRAW); Należy zauważyć, że funkcja nie odnosi się do ID naszego VBO, lecz do GL_ARRAY_BUFFER. Mirosław Głowacki (AGH, UJK) OpenGL / 79

17 Vertex Buffer Object - VBO Drugi parametr określa rozmiar wektora wierzchołków w bajtach. Wartość ostatniego parametru narzuca sposób wykorzystania danych wierzchołków - dane te są przesyłane raz, a następnie: używane wiele razy (GL_STATIC_DRAW), zmieniane od czasu do czasu i używane wiele razy (GL_DYNAMIC_DRAW), użyte raz (GL_STREAM_DRAW). Wartość ta określa w jakiej pamięci dane są zapisywane na karcie graficznej, aby najwyższą wydajność. Przykładowo, VBO z GL_STREAM_DRAW powoduje użycie pamięci, która umożliwia szybkie zapisywanie kosztem nieco wolniejszego rysowania. Mirosław Głowacki (AGH, UJK) OpenGL / 79

18 Przetwarzanie danych wierzchołkowych Wierzchołki i ich atrybuty zostały skopiowane do karty graficznej, ale nie są jeszcze gotowe do użytku - nadchodzi więc pora na wyjaśnienie jak karta graficzna radzi sobie z atrybutami. Jak wiemy, istnieją trzy etapy przetwarzania danych wymagające użycia shaderów - każdy z nich ma ściśle określony cel. W starszych wersjach OpenGL można było tylko w niewielkim zakresie modyfikować operacje wykonywane przez kartę graficzną. Nowoczesna OpenGL pozwala na instruowanie karty graficznej o sposobie postępowania z danymi. Aby uzyskać efekt na ekranie, należy zaimplementować zarówno shader wierzchołków, jak i shader fragmentów. Shader geometrii jest opcjonalny i zostanie omówiony później. Mirosław Głowacki (AGH, UJK) OpenGL / 79

19 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

20 Shadery Shadery są programowane w języku podobnym do C o nazwie GLSL (OpenGL Shading Language). OpenGL kompiluje kod źródłowy w trakcie wykonywania programu i kopiuje go do karty graficznej. Każda wersja OpenGL posiada własną wersję języka cieniującego z pewnym zestawem funkcji - wersje te stanowią parę. Dzieje się tak dlatego, że shadery zostały wprowadzone dopiero dla OpenGL 2.0 jako w wersja GLSL Następne pary (OpenGL, GLSL) to: (2.1, 1.20), (3.0, 1.30), (3.1, 1.40), a do wersji 3.2 OpenGL przypisana jest wersja 1.50 GLSL. Począwszy od wersji 3.3 OpenGL wersja GLSL jest taka sama jak wersja OpenGL. Mirosław Głowacki (AGH, UJK) OpenGL / 79

21 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

22 Shader wierzchołków Shader wierzchołków ( vertex shader ) jest programem karty graficznej, który przetwarza każdy wierzchołek i jego atrybuty w kolejności ich występowanie w wektorze wierzchołków. Jego obowiązkiem jest obliczenie końcowego położenia wierzchołków we współrzędnych urządzenia i przekazanie wymaganych danych do shadera fragmentów. Dlatego właśnie tutaj zachodzą wszelkie przekształcenia obiektów w przestrzeni 3D i ich rzutowanie do 2D. Shader fragmentów wymaga atrybutów, takich jak kolor czy współrzędne tekstury, które zwykle są przekazywane przez shader wierzchołków z wejścia na wyjście bez żadnych zmian. Mirosław Głowacki (AGH, UJK) OpenGL / 79

23 Shader wierzchołków W naszym przykładzie shader wierzchołków nie będzie miał wiele do roboty, gdyż: wierzchołki zostały określone we współrzędnych urządzenia, nie wprowadziliśmy żadnych atrybutów, const char* vertexsource = R"glsl( #version 150 in vec2 position; void main(){ gl_position = vec4(position, 0.0, 1.0); } )glsl"; dyrektywa preprocesora #version została użyta w celu określenia wersji GLSL ( 1.50 ). Następnie stwierdzono, że istnieje tylko jeden atrybut - pozycja. Mirosław Głowacki (AGH, UJK) OpenGL / 79

24 Shader wierzchołków Oprócz typów oferowanych przez język C, GLSL posiada wbudowane typy wektorowe i macierzowe identyfikowane przez vec* i mat*. Typ wartości wewnętrznych w tych konstrukcjach jest dla OpenGL 3.2 i 3.3 typem float. Liczba występująca po vec zamiast gwiazdki określa liczbę elementów ( x, y, z, w ), a liczba po mat określa liczbę wierszy/kolumn macierzy kwadratowych. Ponieważ atrybut position zawiera tylko dwie współrzędne - x i y - typ vec2 jest odpowiedni dla tego zestawu danych. Przedrostek in oznacza, że mamy do czynienia z danymi wejściowymi. Mirosław Głowacki (AGH, UJK) OpenGL / 79

25 Shader wierzchołków Końcowa pozycja wierzchołka jest przypisywana do specjalnej zmiennej gl_position, która będzie używana podczas łączenia prymitywów oraz wielu innych procesów. Aby te działały poprawnie, ostatnia wartość (tzn. w ) musi mieć wartość 1.0f. Poza tym istnieje duża dowolność w pracy z atrybutami i w dalszej części wykładu przedstawimy sposoby nadawania trójkątowi kolorów. Również praca z typami języka GLSL jest elastyczna. Mirosław Głowacki (AGH, UJK) OpenGL / 79

26 Shader wierzchołków W zprezentowanym przykładzie użyto skrótu, aby ustawić dwa pierwsze pola wektora vec4 przy użyciu pól wektora vec2. Można jednak inaczej - poniżesz dwie linie kodu powodują taki sam efekt: gl_position = vec4(position, 0.0, 1.0); gl_position = vec4(position.x, position.y, 0.0, 1.0); Podczas pracy z kolorami można uzyskać dostęp do poszczególnych składników modelu RGBA - tzn. r, g, b i a w sposób identyczny jak w przypadku x, y, z i w. Może to pomóc w przejrzystości. Mirosław Głowacki (AGH, UJK) OpenGL / 79

27 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

28 Shader fragmentów Dane wyjściowe z modułu shadera wierzchołków podlegają interpolacji do wszystkich pikseli ekranu pokrytych przez prymityw w procesie zwanym rasteryzacją. Piksele te są nazywane fragmentami i są obiektami, na których działa shader fragmentów. Podobnie jak shader wierzchołków generuje on na wyjściu jeden obowiązkowy atrybut - końcowy kolor fragmentu. Do programisty należy utworzenie kodu generującego ten kolor na podstawie: koloru wierzchołków, współrzędnych tekstury innych danych pochodzących z modułu shadera wierzchołków. Mirosław Głowacki (AGH, UJK) OpenGL / 79

29 Shader fragmentów Nasz trójkąt składa się tylko z białych pikseli, więc shader fragmentów po prostu generuje ten kolor dla każdego fragmentu: const char* fragmentsource = R"glsl( #version 150 out vec4 outcolor; void main(){ outcolor = vec4(1.0, 1.0, 1.0, 1.0); } )glsl"; Od razu zauważymy, że nie użyliśmy żadnej wbudowanej zmiennej do wyprowadzania koloru, takiej jak np. gl_fragcolor. To dlatego, że shader fragmentów może wygenerować wiele kolorów, a jak się takimi zmiennymi posługiwać zobaczymy podczas omawiania ładowania shaderów. Mirosław Głowacki (AGH, UJK) OpenGL / 79

30 Shader fragmentów Zmienna outcolor używa typu vec4, ponieważ każdy kolor składa się z kolorów podstawowych: czerwonego, zielonego, niebieskiego, oraz kanału alfa. Kolory w OpenGL są reprezentowane jako zmiennoprzecinkowe liczby z zakresu ( 0.0, 1.0 ) zamiast powszechnie używanego zakresu całkowitoliczbowego ( 0, 255 ). Mirosław Głowacki (AGH, UJK) OpenGL / 79

31 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

32 Kompilowanie kodu shaderów Kompilowanie kodu shaderów jest łatwe i następuje po załadowaniu kodu źródłowego z pliku lub z tablicy znakowej typu GLchar*. Proces zaczyna się od: utworzenia obiektu shadera oraz załadowania do niego kodu shadera, co dla shadera wierzchołków wygląda to tak: GLuint vertexshader = glcreateshader(gl_vertex_shader); glshadersource(vertexshader, 1, &vertexsource, NULL); W przeciwieństwie do VBO, zamiast aktywować kod shadera lub stosować podobne rozwiązania, należy jedynie przekazać funkcji glshadersource uchwyt do obiektu shadera ( vertexshader ) oraz wskaźnik do tablicy znakowej ( vertexsource ) zawierającej kod shadera. Mirosław Głowacki (AGH, UJK) OpenGL / 79

33 Kompilowanie kodu shaderów Prototyp funkcji glshadersource to: void glshadersource(gluint shader, GLsizei count, const GLchar **string, const GLint *length); Funkcja może zatem przyjmować nie jedną, ale wiele ( count ) tablic znakowych - zazwyczaj stosuje się jednak kod zawarty w jednej tablicy znakowej, tak jak w naszym przykładzie. Ostatni parametr może stanowić: count -elementowa tablica długości poszczególnych tablic znakowych ( *string ) - terminatorów null nie wlicza się wtedy do długości, NULL co oznacza, że każda tablica znakowa kończy się terminatorem null. Mirosław Głowacki (AGH, UJK) OpenGL / 79

34 Kompilowanie kodu shaderów Teraz pozostaje skompilowanie programu shadera na kod maszynowy, który może być wykonany przez kartę graficzną: glcompileshader(vertexshader); Należy pamiętać, że jeśli kompilacja się nie powiedzie, np. ze względu na błąd składni, funkcja glgeterror zwracająca błędy OpenGL nie odnotuje tego faktu! Aby sprawdzić poprawność kompilacji należy wykonać test: GLint status; glgetshaderiv(vertexshader, GL_COMPILE_STATUS, &status); Jeśli status jest równy wartości GL_TRUE, kod programu shadera został z powodzeniem skompilowany. Mirosław Głowacki (AGH, UJK) OpenGL / 79

35 Kompilowanie kodu shaderów W wypadku wystąpienia błędów można pobrać log kompilacji za pomocą instrukcji: char buffer[512]; glgetshaderinfolog(vertexshader, 512, NULL, buffer); Instrukcje te zapiszą pierwsze 511 bajtów logu kompilacji + terminator null do zadefiniowanego bufora znakowego buffer. Log kompilacji może również zawierać przydatne ostrzeżenia i to nawet wtedy, gdy kompilacja zakończyła się pomyślnie, więc warto sprawdzić go od czasu do czasu podczas kodowania shaderów. Trzeci parametr funkcji glgetshaderinfolog zachowuje się analogicznie jak ostatni parametr funkcji glshadersource. Mirosław Głowacki (AGH, UJK) OpenGL / 79

36 Kompilowanie kodu shaderów Postępowanie z shaderem fragmentów jest dokładnie takie samo jak postępowanie z shaderem wierzchołków. GLuint fragmentshader = glcreateshader(gl_fragment_shader); glshadersource(fragmentshader, 1, &fragmentsource, NULL); glcompileshader(fragmentshader); Poprawność kompilacji i jej log należy sprawdzić ponownie, tym razem zastępując vertexshader przez fragmentshader - może to oszczędzić w przyszłości sporo wysiłku. Mirosław Głowacki (AGH, UJK) OpenGL / 79

37 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

38 Łączenie shaderóww program Na razie wierzchołki i fragmenty są osobnymi obiektami. Mimo, że zostały zaprogramowane do współpracy, nie są jeszcze w rzeczywistości połączone. Odbywa się to poprzez utworzenie programu z obu shaderów. GLuint shaderprogram = glcreateprogram(); glattachshader(shaderprogram, vertexshader); glattachshader(shaderprogram, fragmentshader); Shader fragmentów może przekazywać dane do wielu buforów, należy więc jednoznacznie określić, które wyjście jest zapisywane do którego bufora i musi to nastąpić przed łączeniem programu. glbindfragdatalocation(shaderprogram, 0, "outcolor"); Mirosław Głowacki (AGH, UJK) OpenGL / 79

39 Łączenie shaderóww program Buforem domyślnym shadera fragmentów jest ten o numerze 0 i nasz shader zawiera tylko jedno wyjście, więc wywołanie funkcji glbindfragdatalocation nie jest konieczne Podczas renderowania wielu buforów można w razie potrzeby użyć funkcji gldrawbuffers, która wyspecyfikuje bufor dla shadera fragmentów - wyjście pierwsze jest wyjściem domyślnym. Po dołączeniu shaderów, należy dokonać linkowania programu. gllinkprogram(shaderprogram); Po tej operacji można zmieniać shadery, ale nie będzie to miało wpływu na program dopóki linkowanie nie zostanie powtórzone. Obiekt shadera może również zostać usunięty za pomocą funkcji gldeleteshader, ale funkcja nie da efektu, dopóki nie zostanie on odłaczony od wszystkich programów przy użyciu funkcji gldetachshader. Mirosław Głowacki (AGH, UJK) OpenGL / 79

40 Łączenie shaderóww program Aby zacząć używać shaderów w programie OpenGL, wystarczy odwołać się do funkcji: gluseprogram(shaderprogram); Podobnie jak to miało miejsce w przypadku bufora wierzchołków, tylko jeden program shadera może być aktywny równocześnie. Mirosław Głowacki (AGH, UJK) OpenGL / 79

41 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

42 Wiązanie wierzchołków z atrybutami Chociaż mamy teraz sprecyzowane dane wierzchołków i program shaderów, OpenGL nadal nie wie, jak sformatowane i uporządkowane są atrybuty. Aby rozwiązać problem najpierw należy pobrać uchwyt do wektora position w shaderze wierzchołków: GLint posattrib = glgetattriblocation(shaderprogram, "position"); Jego wartość jest liczbą zależną od kolejności definicji danych wejściowych - pierwsza i jedyna pozycja wejściowa w maszym przykładzie zawsze będzie miała wartość 0. Mirosław Głowacki (AGH, UJK) OpenGL / 79

43 Wiązanie wierzchołków z atrybutami Po ustaleniu uchwytu do danych wejściowych należy określić, w jaki sposób dane te będą pobierane z tablicy: glvertexattribpointer(posattrib, 2, GL_FLOAT, GL_FALSE, 0, 0); Pierwszy parametr odwołuje się do wejścia. Drugi parametr określa liczbę wartości tego wejścia, która jest taka sama jak liczba elementów vec2. Trzeci parametr określa typ każdego składnika, Czwarty parametr określa, czy wartości wejściowe powinny być normalizowane między -1.0 a 1.0 (lub 0.0 i 1.0 w zależności od formatu), jeśli nie są liczbami zmiennoprzecinkowymi. Mirosław Głowacki (AGH, UJK) OpenGL / 79

44 Wiązanie wierzchołków z atrybutami Ostatnie dwa parametry są dla nas najważniejsze, ponieważ określają, jak atrybut jest ulokowany w tablicy wierzchołków. Pierwsza liczba określa krok ( stride ), tzn. liczbę bajtów między poszczególnymi pozycjami wierzchołków w tablicy - wartość 0 oznacza, że nie ma między nimi innych danych. Dzieje się tak wtedy, gdy pozycja każdego wierzchołka następuje bezpośrednio po pozycji poprzedniego wierzchołka. Ostatni parametr określa przesunięcie ( offset ) atrybutów względem początku tablicy - tj. numer kolejny bajtu w tablicy, w którym atrybut się rozpoczyna - ponieważ nie ma innych atrybutów, wartość ta wynosi również 0. Mirosław Głowacki (AGH, UJK) OpenGL / 79

45 Wiązanie wierzchołków z atrybutami Należy pamiętać, że funkcja glvertexattribpointer wiąże nie tylko stride i offset, ale także VBO, który jest aktualnie przypisany do GL_ARRAY_BUFFER. Oznacza to, że: nie ma konieczności arbitralnego odwoływania się do odpowiedniego VBO podczas wywoływannia funkcji rysowania. można użyć różnych VBO dla różnych atrybutów. Na koniec wiązania wierzchołków z atrybutami tablica atrybutów wierzchołków musi zostać aktywowana. glenablevertexattribarray(posattrib); Mirosław Głowacki (AGH, UJK) OpenGL / 79

46 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

47 Vertex Array Objects Można się spodziewać, że prawdziwe programy graficzne używają wielu różnych shaderów i układów wierzchołków. Zmiana aktywnego programu shadera jest łatwa dzięki funkcji gluseprogram, ale ponowne ustawianie wszystkich atrybutów byłoby to dość niewygodne. Na szczęście OpenGL rozwiązuje ten problem przy pomocy obiektów Vertex Array Objects ( VAO ). VAO przechowują wszystkie powiązania między atrybutami a VBO zawierającym surowe dane wierzchołkowe. Obiekty VAO są tworzone w taki sam sposób jak obiekty VBO : GLuint vao; glgenvertexarrays(1, &vao); Mirosław Głowacki (AGH, UJK) OpenGL / 79

48 Vertex Array Objects Pracę z VAO należy rozpocząć przyłączając go instrukcję: glbindvertexarray(vao); Gdy tylko jakiś VAO zostanie przyłączony, każde wywołanie funkcji glvertexattribpointer spowoduje, że informacje będą przechowywane w tym VAO. Stąd przełączanie pomiędzy różnymi danymi i formatami wierzchołków jest proste i polega na wiązaniu różnych VAO! VAO nie przechowuje żadnych danych wierzchołkowych, a jedynie odwołuje się do utworzonych VBO i zawiera informacje o sposobach pobierania z nich atrybutów. Należy się upewnić, że VAO zostało utworzone i przywiązane na początku programu, gdyż wszystkie bufory wierzchołków przyłączone wcześniej niż VAO będą ignorowane. Mirosław Głowacki (AGH, UJK) OpenGL / 79

49 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

50 Obrazowanie Po załadowaniu danych wierzchołków, utworzeniu programów shaderowych i połączeniu danych z atrybutami, można już narysować trójkąt. Obiektr VAO przechowujący informacje o atrybutach został przyłączony, więc nie ma potrzeby się tym martwić. Pozostaje tylko proste wywołanie funkcji gldrawarrays w głównej pętli: gldrawarrays(gl_triangles, 0, 3); Pierwszy parametr określa typ prymitywu (zwykle punkt, odcinek lub trójkąt). Drugi określa, liczbę wierzchołków pomijanych na początku. Ostatni parametr określa liczbę wierzchołków do przetworzenia ( UWAGA: nie prymitywów! ). Mirosław Głowacki (AGH, UJK) OpenGL / 79

51 Obrazowanie Po uruchomieniu programu, na ekranie powinno się pokazać okno: Mirosław Głowacki (AGH, UJK) OpenGL / 79

52 Obrazowanie Jeśli po uruchomieniu programu nic nie widać, należy się upewnić, że zostały spełnione wszystkie warunki: shadery zostały poprawnie skompilowane, program został poprawnie zlinkowany, tablica atrybutów została przyłączona, VAO został przyłączony przed określeniem atrybutów, dane wierzchołkowe są prawidłowe, funkcja glgeterror z biblioteki OpenGL zwraca wartość 0. Jeśli błędy wystąpiły, to funkcja zwóci kod błędu ( GLenum errorcode ) - informacje o błędzie można uzyskać odwołując się do gluerrorstring(errorcode). Mirosław Głowacki (AGH, UJK) OpenGL / 79

53 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

54 Uniforms Dotychczasowy program ustalił biały kolor trójkąta w kodzie shadera fragmentów. Co jednak gdyby zaszła potrzeba zamiany tego koloru już po skompilowaniu tego modułu? Okazuje się, że atrybuty wierzchołków nie są jedynym sposobem przekazywania danych do programów cieniujących. Inny sposób przekazywania danych do shaderów wykorzystuje system tzw. uniforms. Uniforms to zasadniczo zmienne globalne, mające tę samą wartość dla wszystkich wierzchołków i/lub fragmentów. Aby zademonstrować, jak z nich korzystać, zmienimy kolor trójkąta w samym programie OpenGL. Mirosław Głowacki (AGH, UJK) OpenGL / 79

55 Uniforms Nadanie jednolitego koloru trójkątowi wymaga nstępującego (lub podobnego) kodu shadera fragmentów: #version 150 uniform vec3 trianglecolor; out vec4 outcolor; void main(){ outcolor = vec4(trianglecolor, 1.0); } Ostatnim parametrem koloru wyjściowego jest przeźroczystość, którą obecnie nie będziemy się zajmować i która ustalona została na 1 - brak przeźroczystości. Teraz program wygeneruje czarny (niewidoczny na czarnym tle) trójkąt, ponieważ wartość trianglecolor nie została jeszcze ustawiona. Mirosław Głowacki (AGH, UJK) OpenGL / 79

56 Uniforms Zmiana wartości zmiennych typu uniform przebiega tak samo jak zmiana atrybutów wierzchołków - na początek należy uchwycić lokalizację wektora trianglecolor : GLint unicolor = glgetuniformlocation(shaderprogram,"trianglecolor"); Wartości uniforms zmienia się przy użyciu jednej z funkcji gluniformxy, gdzie X oznacza liczbę elementów, a Y oznacza typ. Typowymi typami są f dla float, d dla double i i dla integer. gluniform3f(unicolor, 1.0f, 0.0f, 0.0f); Uruchomienie programu teraz spowoduje wyświetlenie czerwonego trojkata. Mirosław Głowacki (AGH, UJK) OpenGL / 79

57 Uniforms Aby utworzyć bardziej ekscytujący obraz, można zmieniać kolor w czasie za pomocą konstrukcji umieszczonej w pętli głównej: auto t_start = std::chrono::high_resolution_clock::now(); //... auto t_now = std::chrono::high_resolution_clock::now(); float time = std::chrono::duration_cast<std::chrono:: duration<float>>(t_now - t_start).count(); gluniform3f(unicolor, (sin(time * 4.0f) + 1.0f) / 2.0f, 0.0f, 0.0f); Chociaż powyższy przykład nie jest być może bardzo ekscytujący, to jednak pokazuje, że uniforms są niezbędne do kontrolowania zachowań shaderów w czasie wykonywania programu. Z drugiej strony do opisu pojedynczego wierzchołka bardziej nadają się atrybuty wierzchołków. Mirosław Głowacki (AGH, UJK) OpenGL / 79

58 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

59 Więcej kolorów Choć uniforms mają swoje zalety, to kolor jest czymś, co należy określać dla każdego wierzchołka trójkąta. Aby to osiągnąć należy dodać atrybut koloru do wierzchołków. W tym celu należy uzupełnić dane wierzchołkowe. Przejrzystość jest w zasadzie domeną całego trójkąta, więc dodamy tylko barwy - czerwoną, zieloną i niebieską: float vertices[] = { 0.0f, 0.5f, 1.0f, 0.0f, 0.0f, // Vertex 1: Red 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // Vertex 2: Green -0.5f, -0.5f, 0.0f, 0.0f, 1.0f // Vertex 3: Blue }; Mirosław Głowacki (AGH, UJK) OpenGL / 79

60 Więcej kolorów Teraz należy zmienić shader wierzchołków tak, aby pobierał nowe dane wejściowe i kierował część z nich do shadera fragmentów: #version 150 in vec2 position; in vec3 color; out vec3 Color; void main(){ Color = color; // input ---> output gl_position = vec4(position, 0.0, 1.0); } Wejściem ( in ) shadera są wektory: dwuelementowy position zawierający 2 współrzędne pozycji i trójelementowy color zawierający 3 wartości atrybutów koloru. Wyjściem ( out ) shadera jest trójelementowy wektor Color zawierający 3 wartości atrybutów koloru. Mirosław Głowacki (AGH, UJK) OpenGL / 79

61 Więcej kolorów Color stanowi dane wejściowe do shadera fragmentów: #version 150 in vec3 Color; out vec4 outcolor; void main(){ outcolor = vec4(color, 1.0); } Należy się upewnić, że wyjście shadera wierzchołków i wejście shadera fragmentów mają tę samą nazwę - inaczej nie można poprawnie powiązać shaderów. Mirosław Głowacki (AGH, UJK) OpenGL / 79

62 Więcej kolorów Należy również nieco zmienić kod wskaźnika atrybutów, aby uwzględnić nową kolejność atrybutów x, y, R, G, B. GLint posattrib = glgetattriblocation(shaderprogram, "position"); glenablevertexattribarray(posattrib); glvertexattribpointer(posattrib, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), 0); GLint colattrib = glgetattriblocation(shaderprogram, "color"); glenablevertexattribarray(colattrib); glvertexattribpointer(colattrib, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(2*sizeof(float))); stride w funkcji glvertexattribpointer jest ustawiony na 5*sizeof(float) - każdy wierzchołek to 5 wartości float. offset wynosi 2*sizeof(float) - przesunięcie atrybutów koloru to 2 wartości zmiennoprzecinkowe. Mirosław Głowacki (AGH, UJK) OpenGL / 79

63 Obrazowanie Tym razem na ekranie powinno się pokazać okno: Mirosław Głowacki (AGH, UJK) OpenGL / 79

64 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

65 Bufor elementów W obecnej wersji programu wierzchołki są określone w kolejności ich rysowania. Jeśli chcesz dodać kolejny trójkąt, musisz dodać 3 dodatkowe wierzchołki do tablicy wierzchołków. Istnieje sposób kontrolowania kolejności, co pozwala również na ponowne wykorzystanie istniejących wierzchołków - tablica elementów. Może to zaoszczędzić wiele pamięci podczas pracy z prawdziwymi modelami 3D w przyszłości, ponieważ każdy wierzchołek przynależy zazwyczaj do trzech trójkątów! Tablica elementów jest wypełniona liczbami całkowitymi bez znaku odnoszącymi się do wierzchołków związanych z GL_ARRAY_BUFFER. Mirosław Głowacki (AGH, UJK) OpenGL / 79

66 Bufor elementów Jeśli należy je narysować w dotychczasowej kolejności, będzie to wyglądać tak: GLuint elements[] = { 0, 1, 2 }; Elementy są ładowane do pamięci karty graficznej tak jak dane wierzchołkowe tworząc EBO (Element Buffer Object): GLuint ebo; glgenbuffers(1, &ebo); //... glbindbuffer(gl_element_array_buffer, ebo); glbufferdata(gl_element_array_buffer, sizeof(elements), elements, GL_STATIC_DRAW); Jedyną rzeczą, która różni bufor EBO od VBO jest argument GL_ELEMENT_ARRAY_BUFFER. Mirosław Głowacki (AGH, UJK) OpenGL / 79

67 Bufor elementów Aby skorzystać z tego bufora, należy zmienić polecenie rysuj na: gldrawelements(gl_triangles, 3, GL_UNSIGNED_INT, 0); Pierwszy parametr jest tu taki sam jak w przypadku gldrawarrays, ale wszystkie pozostałe odnoszą się do bufora elementów. Drugi parametr określa liczbę elementów do narysowania. Trzeci parametr określa typ danych elementu. Ostatni parametr określa przesunięcie. Jedyna różnica polega na tym, że teraz mówimy o elementach zamiast o wierzchołkach. Mirosław Głowacki (AGH, UJK) OpenGL / 79

68 Bufor elementów Zalety bufora elementów można zauważyć rysując prostokąt złożony z dwóch trójkątów. float vertices[] = { -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right }; 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, // Bottom-left -0.5f, 0.5f, 1.0f, 0.0f, 0.0f // Top-left Wywołując gldrawarrays zamiast gldrawelements tak jak przedtem, bufor elementów zostanie po prostu zignorowany: gldrawarrays(gl_triangles, 0, 6); Mirosław Głowacki (AGH, UJK) OpenGL / 79

69 Bufor elementów Prostokąt jest renderowany tak, jak powinien, ale powtórzenie danych wierzchołków to marnotrawstwo pamięci. Korzystanie z bufora elementów umożliwia ponowne użycie danych: float vertices[] = { -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // Top-left 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, // Top-right 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // Bottom-right -0.5f, -0.5f, 1.0f, 1.0f, 1.0f // Bottom-left }; //... GLuint elements[] = { 0, 1, 2, 2, 3, 0 }; //... gldrawelements(gl_triangles, 6, GL_UNSIGNED_INT, 0); Mirosław Głowacki (AGH, UJK) OpenGL / 79

70 Obrazowanie Teraz program powinien wygenerować okno: Mirosław Głowacki (AGH, UJK) OpenGL / 79

71 Spis treści 1 Potok grafiki OpenGL 2 Realizacja przedstawionego scenariusza 3 Shadery 4 Shader wierzchołków 5 Shader fragmentów 6 Kompilowanie kodu shaderów 7 Łączenie shaderów w program 8 Wiązanie wierzchołków z atrybutami 9 VAO - Vertex Array Objects 10 Obrazowanie 11 Uniforms 12 Więcej kolorów 13 Bufor elementów 14 Przykładowy program Mirosław Głowacki (AGH, UJK) OpenGL / 79

72 Kolorowy trojkąt 1/8 // Link statically with GLEW #define GLEW_STATIC // Nagłówki #include <GL/glew.h> #include <SFML/Window.hpp> // Kody shaderów const GLchar* vertexsource = R"glsl( #version 150 core in vec2 position; in vec3 color; out vec3 Color; void main(){ Color = color; gl_position = vec4(position, 0.0, 1.0); } )glsl"; Mirosław Głowacki (AGH, UJK) OpenGL / 79

73 Kolorowy trojkąt 2/8 const GLchar* fragmentsource = R"glsl( #version 150 core in vec3 Color; out vec4 outcolor; void main() { outcolor = vec4(color, 1.0); } )glsl"; int main() { sf::contextsettings settings; settings.depthbits = 24; settings.stencilbits = 8; Mirosław Głowacki (AGH, UJK) OpenGL / 79

74 Kolorowy trojkąt 3/8 // Okno renderingu sf::window window(sf::videomode(800, 600, 32), "OpenGL", sf::style::titlebar sf::style::close, settings); // Inicjalizacja GLEW glewexperimental = GL_TRUE; glewinit(); // Utworzenie VAO (Vertex Array Object) GLuint vao; glgenvertexarrays(1, &vao); glbindvertexarray(vao); // Utworzenie VBO (Vertex Buffer Object) // i skopiowanie do niego danych wierzchołkowych GLuint vbo; glgenbuffers(1, &vbo); Mirosław Głowacki (AGH, UJK) OpenGL / 79

75 Kolorowy trojkąt 4/8 GLfloat vertices[] = { 0.0f, 0.5f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f }; glbindbuffer(gl_array_buffer, vbo); glbufferdata(gl_array_buffer, sizeof(vertices), vertices, GL_STATIC_DRAW); // Utworzenie i skompilowanie shadera wierzchołków GLuint vertexshader = glcreateshader(gl_vertex_shader); glshadersource(vertexshader, 1, &vertexsource, NULL); glcompileshader(vertexshader); Mirosław Głowacki (AGH, UJK) OpenGL / 79

76 Kolorowy trojkąt 5/8 // Utworzenie i skompilowanie shadera fragmentów GLuint fragmentshader = glcreateshader(gl_fragment_shader); glshadersource(fragmentshader, 1, &fragmentsource, NULL); glcompileshader(fragmentshader); // Zlinkowanie obu shaderów w jeden wspólny program GLuint shaderprogram = glcreateprogram(); glattachshader(shaderprogram, vertexshader); glattachshader(shaderprogram, fragmentshader); glbindfragdatalocation(shaderprogram, 0, "outcolor"); gllinkprogram(shaderprogram); gluseprogram(shaderprogram); Mirosław Głowacki (AGH, UJK) OpenGL / 79

77 Kolorowy trojkąt 6/8 // Specifikacja formatu danych wierzchołkowych GLint posattrib = glgetattriblocation(shaderprogram, "position"); glenablevertexattribarray(posattrib); glvertexattribpointer(posattrib, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(glfloat), 0); GLint colattrib = glgetattriblocation(shaderprogram, "color"); glenablevertexattribarray(colattrib); glvertexattribpointer(colattrib, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(glfloat), (void*)(2 * sizeof(glfloat))); Mirosław Głowacki (AGH, UJK) OpenGL / 79

78 Kolorowy trojkąt 7/8 // Rozpoczęcie pętli zdarzeń bool running = true; while (running) { sf::event windowevent; while (window.pollevent(windowevent)) { switch (windowevent.type) { case sf::event::closed: running = false; break; } } // Nadanie scenie koloru czarnego glclearcolor(0.0f, 0.0f, 0.0f, 1.0f); glclear(gl_color_buffer_bit); Mirosław Głowacki (AGH, UJK) OpenGL / 79

79 Kolorowy trojkąt 8/8 // Narysowanie trójkąta na podstawie 3 wierzchołków gldrawarrays(gl_triangles, 0, 3); // Wymiana buforów tylni/przedni window.display(); } // Kasowanie programu i czyszczenie buforów gldeleteprogram(shaderprogram); gldeleteshader(fragmentshader); gldeleteshader(vertexshader); gldeletebuffers(1, &vbo); gldeletevertexarrays(1, &vao); // Zamknięcie okna renderingu window.close(); return 0; } Mirosław Głowacki (AGH, UJK) OpenGL / 79

Shadery. Artur Staszczyk Bartłomiej Filipek

Shadery. Artur Staszczyk  Bartłomiej Filipek Shadery Artur Staszczyk www.astaszczyk.com Bartłomiej Filipek www.bartlomiejfilipek.pl Bartlomiej.filipek@gmail.com Potok graficzny Vertex shader Fragment shader GLSL Przykłady Inne shadery? Vertex shader

Bardziej szczegółowo

OpenGL - tekstury Mapowanie tekstur

OpenGL - tekstury Mapowanie tekstur OpenGL - tekstury Mapowanie tekstur Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej

Bardziej szczegółowo

Programowanie Procesorów Graficznych

Programowanie Procesorów Graficznych Programowanie Procesorów Graficznych Wykład 1 9.10.2012 Prehistoria Zadaniem karty graficznej było sterowanie sygnałem do monitora tak aby wyświetlić obraz zgodnie z zawartościa pamięci. Programiści pracowali

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

1 Temat: Vertex Shader

1 Temat: Vertex Shader Instrukcja Architektura procesorów graficznych 1 Temat: Vertex Shader Przygotował: mgr inż. Tomasz Michno 1 Wstęp 1.1 Czym jest shader Shader jest programem (zazwyczaj krótkim), wykonywanym przez kartę

Bardziej szczegółowo

Janusz Ganczarski. OpenGL Pierwszy program

Janusz Ganczarski. OpenGL Pierwszy program Janusz Ganczarski OpenGL Pierwszy program Spis treści Spis treści..................................... 1 1. Pierwszy program.............................. 1 1.1. Rysowanie sceny 3D...........................

Bardziej szczegółowo

Potok graficzny i shadery. Hubert Rutkowski

Potok graficzny i shadery. Hubert Rutkowski Potok graficzny i shadery Hubert Rutkowski 1. Coś o mnie Zakład Technologii Gier Uniwerytetu Jagiellońskiego 2. Potok graficzny jak w OpenGL Cry Engine 3 (zródło: CryTek) Vertex specification

Bardziej szczegółowo

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

1. Prymitywy graficzne

1. Prymitywy graficzne 1. Prymitywy graficzne Prymitywy graficzne są elementarnymi obiektami jakie potrafi bezpośrednio rysować, określony system graficzny (DirectX, OpenGL itp.) są to: punkty, listy linii, serie linii, listy

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Plan wykładu. Akcelerator 3D Potok graficzny

Plan wykładu. Akcelerator 3D Potok graficzny Plan wykładu Akcelerator 3D Potok graficzny Akcelerator 3D W 1996 r. opracowana została specjalna karta rozszerzeń o nazwie marketingowej Voodoo, którą z racji wspomagania procesu generowania grafiki 3D

Bardziej szczegółowo

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski RENDERING W CZASIE RZECZYWISTYM Michał Radziszewski Plan wykładu Programy geometrii wprowadzenie Miejsce w potoku graficznym Wejścia i wyjścia programów geometrii Wierzchołki, prymitywy, ich nowe rodzaje

Bardziej szczegółowo

Języki i techniki programowania Ćwiczenia 2

Języki i techniki programowania Ćwiczenia 2 Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...

Bardziej szczegółowo

Bartłomiej Filipek www.ii.uj.edu.pl/~filipek

Bartłomiej Filipek www.ii.uj.edu.pl/~filipek Bartłomiej Filipek www.ii.uj.edu.pl/~filipek Nasz Cel Prehistoria krótki wstęp Nowa era! Vertex Shaders Fragment Shaders Podstawy GLSL Obsługa GLSL z API OpenGL Dodajmy parę efektów! Podsumowanie Dodatkowe

Bardziej szczegółowo

8 Przygotował: mgr inż. Maciej Lasota

8 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 8 1/6 Grafika Komputerowa Instrukcja laboratoryjna Temat: Listy wyświetlania i tablice wierzchołków 8 Przygotował: mgr inż. Maciej Lasota 1) Listy wyświetlania Listy wyświetlania (ang.

Bardziej szczegółowo

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23 OpenGL : mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski 1/23 Folder z plikami zewnętrznymi (resources) Po odpaleniu przykładowego projektu, nie uruchomi się on poprawnie. Powodem

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r Gry Komputerowe Laboratorium 4 Teksturowanie Kolizje obiektów z otoczeniem mgr inż. Michał Chwesiuk 1/29 Klasa Stwórzmy najpierw klasę TextureManager, która będzie obsługiwała tekstury w projekcie. 2/29

Bardziej szczegółowo

Biblioteka OpenGL: Wprowadzenie

Biblioteka OpenGL: Wprowadzenie Biblioteka OpenGL: Wprowadzenie Radosław Mantiuk Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie OpenGL - Koncepcja i architektura Aplikacja odwołuje się poprzez funkcje API

Bardziej szczegółowo

Programowanie w języku C++ Grażyna Koba

Programowanie w języku C++ Grażyna Koba Programowanie w języku C++ Grażyna Koba Kilka definicji: Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i zasad

Bardziej szczegółowo

Bartosz Bazyluk OpenGL Współczesne podejście do programowania grafiki Część II: Programy cieniujące (shadery)

Bartosz Bazyluk OpenGL Współczesne podejście do programowania grafiki Część II: Programy cieniujące (shadery) OpenGL Współczesne podejście do programowania grafiki Część II: Programy cieniujące (shadery) Programowanie Gier Komputerowych, Informatyka S, III Rok PLAN WYKŁADU Transformacje geometryczne Pożegnanie

Bardziej szczegółowo

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1 Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

3 Przygotował: mgr inż. Maciej Lasota

3 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 3 1/5 Grafika Komputerowa 3D Instrukcja laboratoryjna Temat: Rysowanie prymitywów 3 Przygotował: mgr inż. Maciej Lasota 1) Rysowanie prymitywów Podstawową rodziną funkcji wykorzystywanych

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

W dowolnym momencie można zmienić typ wskaźnika.

W dowolnym momencie można zmienić typ wskaźnika. c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Programowanie warstwy wizualnej gry

Programowanie warstwy wizualnej gry Programowanie warstwy wizualnej gry Krzysztof Gdawiec Instytut Informatyki Uniwersytet Śląski OpenGL (Open Graphics Library) jest wieloplatformową biblioteką pozwalającą na niskopoziomowy dostęp do karty

Bardziej szczegółowo

Bartosz Bazyluk OpenGL Programowalny potok renderowania, buforowanie geometrii (VBO, IBO, VAO).

Bartosz Bazyluk OpenGL Programowalny potok renderowania, buforowanie geometrii (VBO, IBO, VAO). OpenGL Programowalny potok renderowania, buforowanie geometrii (VBO, IBO, VAO). Algorytmy grafiki komputerowej czasu rzeczywistego, Informatyka S2 POTOK RENDEROWANIA Potok renderowania geometrii stosowany

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

Wprowadzenie do QT OpenGL

Wprowadzenie do QT OpenGL Wprowadzenie do QT mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski 1/21 - Open Graphics Library Open Graphics Library API pozwalające na wykorzystanie akceleracji sprzętowej do renderowania

Bardziej szczegółowo

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami: Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie

Bardziej szczegółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą

Bardziej szczegółowo

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie http://galaxy.agh.edu.pl/~mhojny Prowadzący: dr inż. Hojny Marcin Akademia Górniczo-Hutnicza Mickiewicza 30 30-059 Krakow pawilon B5/p.406 tel. (+48)12 617 46

Bardziej szczegółowo

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Jak napisać program obliczający pola powierzchni różnych figur płaskich? Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy

Bardziej szczegółowo

Programowanie w języku Python. Grażyna Koba

Programowanie w języku Python. Grażyna Koba Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i

Bardziej szczegółowo

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane

Bardziej szczegółowo

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import Fraction.h #import <stdio.h> #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

Podstawy programowania w C++

Podstawy programowania w C++ Podstawy programowania w C++ Strumienie wejścia cin>> i wyjścia cout

Bardziej szczegółowo

Zatem standardowe rysowanie prymitywów wygląda następująco:

Zatem standardowe rysowanie prymitywów wygląda następująco: Instrukcja laboratoryjna 10 Grafika komputerowa 3D Temat: Prymitywy Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny Prymitywy proste figury geometryczne,

Bardziej szczegółowo

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu

Bardziej szczegółowo

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje Podstawy informatyki Informatyka stosowana - studia niestacjonarne - Zajęcia nr 4 Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w

Bardziej szczegółowo

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38 Wykład 5 Potok Renderowania Oświetlenie mgr inż. 1/38 Podejście śledzenia promieni (ang. ray tracing) stosuje się w grafice realistycznej. Śledzone są promienie przechodzące przez piksele obrazu wynikowego

Bardziej szczegółowo

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków ZAWARTOŚCI 3 PLIKOW W WORDZIE: MAIN.CPP: #include #include #include pamięci // Potrzebne do memset oraz memcpy, czyli kopiowania bloków #include "Rysowanie_BMP.h" using

Bardziej szczegółowo

2 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 2 1/6 Grafika Komputerowa 3D Instrukcja laboratoryjna Temat: Manipulowanie przestrzenią 2 Przygotował: mgr inż. Maciej Lasota 1) Manipulowanie przestrzenią Istnieją dwa typy układów współrzędnych:

Bardziej szczegółowo

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD programowania Wykład: 5 Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD programowania w C++ Instrukcje sterujące 2 dr Artur Bartoszewski

Bardziej szczegółowo

Smarty PHP. Leksykon kieszonkowy

Smarty PHP. Leksykon kieszonkowy IDZ DO PRZYK ADOWY ROZDZIA SPIS TREœCI KATALOG KSI EK KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG Smarty PHP. Leksykon kieszonkowy Autor: Daniel Bargie³ ISBN: 83-246-0676-9 Format: B6, stron: 112 TWÓJ KOSZYK

Bardziej szczegółowo

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji

Bardziej szczegółowo

Programowanie Obiektowew języku C++ Zadania L4

Programowanie Obiektowew języku C++ Zadania L4 Programowanie Obiektowew języku C++ Zadania L4 Mirosław Głowacki 1,2 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki

Bardziej szczegółowo

Instrukcja do ćwiczeń

Instrukcja do ćwiczeń Instrukcja do ćwiczeń SYSTEMY WBUDOWANE Lab. 3 Przetwornik ADC + potencjometr 1. Należy wejść na stronę Olimexu w celu znalezienia zestawu uruchomieniowego SAM7-EX256 (https://www.olimex.com/products/arm/atmel/sam7-ex256/).

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL Dorota Smorawa Pierwszy program Pierwszy program będzie składał się z trzech etapów: Funkcji rysującej scenę 3D, Inicjacji okna renderingu,

Bardziej szczegółowo

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, Materiał

Bardziej szczegółowo

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p. Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja

Bardziej szczegółowo

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka

Bardziej szczegółowo

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można

Bardziej szczegółowo

Wstęp do informatyki- wykład 7

Wstęp do informatyki- wykład 7 1 Wstęp do informatyki- wykład 7 Operatory przypisania, złożone operatory przypisania, Pętla while i do..while Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania.

Bardziej szczegółowo

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++ Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu

Bardziej szczegółowo

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM) ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM) LABORATORIUM 5 - LOKALIZACJA OBIEKTÓW METODĄ HISTOGRAMU KOLORU 1. WYBÓR LOKALIZOWANEGO OBIEKTU Pierwszy etap laboratorium polega na wybraniu lokalizowanego obiektu.

Bardziej szczegółowo

IX. Wskaźniki.(3 godz.)

IX. Wskaźniki.(3 godz.) Opracowała: dr inż. Anna Dubowicka Uczelniane Centrum Komputerowe PK IX. Wskaźniki.(3 godz.) Wskaźnik jest zmienną, która zawiera adres innej. 1. Definiowanie wskaźników. typ * nazwa ; gdzie: znak * informuje

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady Pętle i tablice. Spotkanie 3 Dr inż. Dariusz JĘDRZEJCZYK Pętle: for, while, do while Tablice Przykłady 11/26/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Pętla w największym uproszczeniu służy

Bardziej szczegółowo

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p. Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,

Bardziej szczegółowo

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1 Typy złożone Struktury, pola bitowe i unie. Programowanie Proceduralne 1 Typy podstawowe Typy całkowite: char short int long Typy zmiennopozycyjne float double Modyfikatory : unsigned, signed Typ wskaźnikowy

Bardziej szczegółowo

Programowanie proceduralne w języku C++ Pojęcia podstawowe - kod źródłowy

Programowanie proceduralne w języku C++ Pojęcia podstawowe - kod źródłowy Programowanie proceduralne w języku C++ Pojęcia podstawowe - kod źródłowy Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej

Bardziej szczegółowo

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik Wykład VII Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Kompilacja Kompilator C program do tłumaczenia kodu źródłowego na język maszynowy. Preprocesor

Bardziej szczegółowo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy) Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013

Bardziej szczegółowo

Zapis algorytmów: schematy blokowe i pseudokod 1

Zapis algorytmów: schematy blokowe i pseudokod 1 Zapis algorytmów: schematy blokowe i pseudokod 1 Przed przystąpieniem do napisania kodu programu należy ten program najpierw zaprojektować. Projekt tworzącego go algorytmu może być zapisany w formie schematu

Bardziej szczegółowo

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów Funkcje. Spotkanie 5 Dr inż. Dariusz JĘDRZEJCZYK Tworzenie i używanie funkcji Przekazywanie argumentów do funkcji Domyślne wartości argumentów Przeładowanie nazw funkcji Dzielenie programu na kilka plików

Bardziej szczegółowo

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Zadanie polega na napisaniu pierwszego programu w języku C, jego poprawnej kompilacji i wgraniu na mikrokontroler. W tym celu należy zapoznać

Bardziej szczegółowo

Język C++ zajęcia nr 2

Język C++ zajęcia nr 2 Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator

Bardziej szczegółowo

Przekształcenia geometryczne. Dorota Smorawa

Przekształcenia geometryczne. Dorota Smorawa Przekształcenia geometryczne Dorota Smorawa Przekształcenia geometryczne Na poprzednich laboratoriach już dowiedzieliśmy się, na czym polegają podstawowe przekształcenia geometryczne. Trzy podstawowe przekształcenia

Bardziej szczegółowo

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to

Bardziej szczegółowo

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Podstawy programowania Wykład: 9 Łańcuchy znaków 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Rodzaje plików Dane przechowywane w pliku mogą mieć reprezentację binarną (taką samą, jak

Bardziej szczegółowo

Wykład 5. Rendering (2) Geometria

Wykład 5. Rendering (2) Geometria Wykład 5. Rendering (2) Geometria 1. Z ogólnego, niezależnego od implementacji punktu widzenia, dane stanowiące opis geometrii modelu zorganizowane są w skończoną sekwencję (lub grupę sekwencji), którego

Bardziej szczegółowo

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD Języki C i C++ Wykład: 2 Wstęp Instrukcje sterujące 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Instrukcje sterujące 2 Pętla for for ( instrukcja_ini ; wyrazenie_warunkowe

Bardziej szczegółowo

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p. Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

Idź do. Spis treści Przykładowy rozdział Skorowidz. Katalog książek. Katalog online Zamów drukowany katalog. Twój koszyk.

Idź do. Spis treści Przykładowy rozdział Skorowidz. Katalog książek. Katalog online Zamów drukowany katalog. Twój koszyk. Idź do Spis treści Przykładowy rozdział Skorowidz Katalog książek Katalog online Zamów drukowany katalog Twój koszyk Dodaj do koszyka Cennik i informacje Zamów informacje o nowościach Zamów cennik Czytelnia

Bardziej szczegółowo

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r. M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza

Bardziej szczegółowo

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Komponenty i serwisy Wstęp: W trzeciej części przedstawione zostaną podstawowe techniki

Bardziej szczegółowo

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99 Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99 Techniki algorytmiczne realizowane przy pomocy grafiki żółwia w programie ELI 2,0. Przedmiot: Informatyka

Bardziej szczegółowo

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium: Zakres laboratorium: definiowanie struktur terminologia obiektowa definiowanie klas funkcje składowe klas programy złożone z wielu plików zadania laboratoryjne Laboratorium nr 12 Temat: Struktury, klasy.

Bardziej szczegółowo

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą

Bardziej szczegółowo

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny Laboratorium grafiki komputerowej i animacji Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny Przygotowanie do ćwiczenia: 1. Zapoznać się ze zdefiniowanymi w OpenGL modelami światła i właściwości materiałów.

Bardziej szczegółowo

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()

Bardziej szczegółowo

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program. PYTHON Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program. Aby program napisany w danym języku mógł być wykonany, niezbędne

Bardziej szczegółowo

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok

Bardziej szczegółowo

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal

Bardziej szczegółowo

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Programowanie w C++ Wykład 8 Katarzyna Grzelak 15 kwietnia 2019 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe

Bardziej szczegółowo

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie

Bardziej szczegółowo

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6 JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona

Bardziej szczegółowo