>::const_iterator g = m.faces.begin(); g != m.faces.end(); ++g){
+ out << g->first << " ";
+ }
+ out << "\n";
+// for(int i = 0; i < m.face.size(); ++i)
+// out << m.face[i] << (((i % 3) == 2)?"\n":"\t");
+ }
+ return out;
+}
+
+} // namespace obj
+
+#endif // OBJLOAD_H_
diff --git a/grk/cw 6/style.css b/grk/cw 6/style.css
new file mode 100644
index 0000000..cf42427
--- /dev/null
+++ b/grk/cw 6/style.css
@@ -0,0 +1,107 @@
+html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+
+body{
+color:#444;
+font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman', serif;
+font-size:12px;
+line-height:1.5em;
+padding:1em;
+margin:auto;
+max-width:42em;
+background:#fefefe;
+}
+
+a{ color: #0645ad; text-decoration:none;}
+a:visited{ color: #0b0080; }
+a:hover{ color: #06e; }
+a:active{ color:#faa700; }
+a:focus{ outline: thin dotted; }
+a:hover, a:active{ outline: 0; }
+
+::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
+::selection{background:rgba(255,255,0,0.3);color:#000}
+
+a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
+a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
+
+p{
+margin:1em 0;
+}
+
+img{
+max-width:100%;
+}
+
+h1,h2,h3,h4,h5,h6{
+font-weight:normal;
+color:#111;
+line-height:1em;
+}
+h4,h5,h6{ font-weight: bold; }
+h1{ font-size:2.5em; }
+h2{ font-size:2em; }
+h3{ font-size:1.5em; }
+h4{ font-size:1.2em; }
+h5{ font-size:1em; }
+h6{ font-size:0.9em; }
+
+blockquote{
+color:#666666;
+margin:0;
+padding-left: 3em;
+border-left: 0.5em #EEE solid;
+}
+hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
+pre, code, kbd, samp { color: #000; font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 0.98em; }
+pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
+
+b, strong { font-weight: bold; }
+
+dfn { font-style: italic; }
+
+ins { background: #ff9; color: #000; text-decoration: none; }
+
+mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
+
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
+sup { top: -0.5em; }
+sub { bottom: -0.25em; }
+
+ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
+li p:last-child { margin:0 }
+dd { margin: 0 0 0 2em; }
+
+img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
+
+table {
+border-collapse: collapse;
+border-spacing: 0;
+width: 100%;
+}
+th { border-bottom: 1px solid black; }
+td { vertical-align: top; }
+
+@media only screen and (min-width: 480px) {
+body{font-size:14px;}
+}
+
+@media only screen and (min-width: 768px) {
+body{font-size:16px;}
+}
+
+@media print {
+ * { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
+ body{font-size:12pt; max-width:100%;}
+ a, a:visited { text-decoration: underline; }
+ hr { height: 1px; border:0; border-bottom:1px solid black; }
+ a[href]:after { content: " (" attr(href) ")"; }
+ abbr[title]:after { content: " (" attr(title) ")"; }
+ .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
+ pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
+ tr, img { page-break-inside: avoid; }
+ img { max-width: 100% !important; }
+ @page :left { margin: 15mm 20mm 15mm 10mm; }
+ @page :right { margin: 15mm 10mm 15mm 20mm; }
+ p, h2, h3 { orphans: 3; widows: 3; }
+ h2, h3 { page-break-after: avoid; }
+}
\ No newline at end of file
diff --git a/grk/cw 6/textures/clouds.jpg b/grk/cw 6/textures/clouds.jpg
new file mode 100644
index 0000000..5d60b98
Binary files /dev/null and b/grk/cw 6/textures/clouds.jpg differ
diff --git a/grk/cw 6/textures/earth.png b/grk/cw 6/textures/earth.png
new file mode 100644
index 0000000..2aed90c
Binary files /dev/null and b/grk/cw 6/textures/earth.png differ
diff --git a/grk/cw 6/textures/earth2.png b/grk/cw 6/textures/earth2.png
new file mode 100644
index 0000000..465f5d3
Binary files /dev/null and b/grk/cw 6/textures/earth2.png differ
diff --git a/grk/cw 6/textures/earth2_normals.png b/grk/cw 6/textures/earth2_normals.png
new file mode 100644
index 0000000..a43634a
Binary files /dev/null and b/grk/cw 6/textures/earth2_normals.png differ
diff --git a/grk/cw 6/textures/earth_normalmap.png b/grk/cw 6/textures/earth_normalmap.png
new file mode 100644
index 0000000..6437240
Binary files /dev/null and b/grk/cw 6/textures/earth_normalmap.png differ
diff --git a/grk/cw 6/textures/grid.png b/grk/cw 6/textures/grid.png
new file mode 100644
index 0000000..127be20
Binary files /dev/null and b/grk/cw 6/textures/grid.png differ
diff --git a/grk/cw 6/textures/grid_color.png b/grk/cw 6/textures/grid_color.png
new file mode 100644
index 0000000..35d65cf
Binary files /dev/null and b/grk/cw 6/textures/grid_color.png differ
diff --git a/grk/cw 6/textures/mars.jpg b/grk/cw 6/textures/mars.jpg
new file mode 100644
index 0000000..09a804b
Binary files /dev/null and b/grk/cw 6/textures/mars.jpg differ
diff --git a/grk/cw 6/textures/mercury.jpg b/grk/cw 6/textures/mercury.jpg
new file mode 100644
index 0000000..9bb2c0b
Binary files /dev/null and b/grk/cw 6/textures/mercury.jpg differ
diff --git a/grk/cw 6/textures/metal.jpg b/grk/cw 6/textures/metal.jpg
new file mode 100644
index 0000000..25285ad
Binary files /dev/null and b/grk/cw 6/textures/metal.jpg differ
diff --git a/grk/cw 6/textures/moon.jpg b/grk/cw 6/textures/moon.jpg
new file mode 100644
index 0000000..986bbf5
Binary files /dev/null and b/grk/cw 6/textures/moon.jpg differ
diff --git a/grk/cw 6/textures/moon.png b/grk/cw 6/textures/moon.png
new file mode 100644
index 0000000..b0ebd4d
Binary files /dev/null and b/grk/cw 6/textures/moon.png differ
diff --git a/grk/cw 6/textures/moon_normals.png b/grk/cw 6/textures/moon_normals.png
new file mode 100644
index 0000000..6e995b7
Binary files /dev/null and b/grk/cw 6/textures/moon_normals.png differ
diff --git a/grk/cw 6/textures/rust.jpg b/grk/cw 6/textures/rust.jpg
new file mode 100644
index 0000000..b50580d
Binary files /dev/null and b/grk/cw 6/textures/rust.jpg differ
diff --git a/grk/cw 6/textures/rust_normal.jpg b/grk/cw 6/textures/rust_normal.jpg
new file mode 100644
index 0000000..ff79292
Binary files /dev/null and b/grk/cw 6/textures/rust_normal.jpg differ
diff --git a/grk/cw 6/textures/scratches.jpg b/grk/cw 6/textures/scratches.jpg
new file mode 100644
index 0000000..a2c7172
Binary files /dev/null and b/grk/cw 6/textures/scratches.jpg differ
diff --git a/grk/cw 6/textures/spaceship.jpg b/grk/cw 6/textures/spaceship.jpg
new file mode 100644
index 0000000..4359825
Binary files /dev/null and b/grk/cw 6/textures/spaceship.jpg differ
diff --git a/grk/cw 6/textures/spaceship_normal.jpg b/grk/cw 6/textures/spaceship_normal.jpg
new file mode 100644
index 0000000..103e76c
Binary files /dev/null and b/grk/cw 6/textures/spaceship_normal.jpg differ
diff --git a/grk/cw 6/textures/test.png b/grk/cw 6/textures/test.png
new file mode 100644
index 0000000..7419ea4
Binary files /dev/null and b/grk/cw 6/textures/test.png differ
diff --git a/grk/cw 6/textures/test_normals.png b/grk/cw 6/textures/test_normals.png
new file mode 100644
index 0000000..6c0d6cb
Binary files /dev/null and b/grk/cw 6/textures/test_normals.png differ
diff --git a/grk/cw 6/textures/venus.jpg b/grk/cw 6/textures/venus.jpg
new file mode 100644
index 0000000..95a5a50
Binary files /dev/null and b/grk/cw 6/textures/venus.jpg differ
diff --git a/grk/cw 6/zadania 6.html b/grk/cw 6/zadania 6.html
new file mode 100644
index 0000000..de2c403
--- /dev/null
+++ b/grk/cw 6/zadania 6.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+ Zadania 6
+
+
+
+
+
+Teksturowanie
+Te zajęcia są kontynuacją poprzednich. Zalecam wykorzystać ukończony kod z poprzednich zajęć. Projekt startowy to tylko częściowo ukończone zadania.
+Zadanie
+Obejrzyj plik Texture.h, aby zapoznać się z interfejsem do obsługi tekstur.
+Przygotuj shadery i załaduj teksturę:
+W kolejnych zadaniach będziemy potrzebować trzeciej pary shaderów: shader_5_tex.vert i shader_5_tex.frag. Są to gotowe shadery z poprzednich zadań. Wczytaj shadery i przechowuj adres programu pod zmienną globalną programTex
.
+Pod namespace texture
znajdują się zmienne globalne typu GLuint
, które będą przechowywać adresy tekstur. W funkcji init()
załaduj tekstury z folderu textures przy pomocy funkcji Core::LoadTexture
. Ta funkcja zwraca adres wczytanej tekstury, przypisz je do zmiennych w namespace texture
. (Aby odwołać się do grid
w namespace
texture
, użyj texture::grid
.)
+Stwórz funkcję odpowiedzialną za rysowanie teksturowanych obiektów. Skopiuj funkcję drawObjectColor
. Nazwij kopię drawObjectTexture()
i zmodyfikuj ją tak, aby przyjmowała jako parametr identyfikator tekstury, a nie wektor koloru. (Usuń w niej linijkę odpowiadającą za przesyłanie koloru, aby uniknąć błędu komunikacji, później dodamy ładowanie tekstury na jej miejsce.)
+Zmodyfikuj shader, aby nakładał teksturę na obiekt:
+Narysuj jedną z planet za pomocą drawObjectTexture()
, użyj programTex
jako programu.
+
+- Prześlij współrzędne mapowania tekstur z vertex shadera do fragment shadera.
+
+
+- Współrzędne tekstur to kolejny (po pozycjach i wektorach normalnych) atrybut wierzchołków - są dostępne w vertex shaderze pod nazwą
vertexTexCoord
.
+- Prześlij je znanym już sposobem do fragment shadera (zmienna
out
w vertex shaderze i odpowiadająca jej zmienna in
we fragment shaderze).
+
+
+- Prześlij teksturę do fragment shadera:
+
+
+- Stwórz zmienną typu
uniform sampler2D
(nazwij ją na przykład colorTexture
) we fragment shaderze - analogicznie do innych zmiennych typu uniform, służy ona do przesyłania informacji bezpośrednio z kodu C++ do shadera.
+- W kodzie C++ użyj funkcji
Core::SetActiveTexture
wewnątrz funkcji drawObjectTexture()
, aby ustawić zmienną sampler2D
na wczytaną wcześniej teksturę.
+
+
+- Użyj wartości uzyskanej z tekstury zamiast koloru (
objectColor
) do pokolorowania obiektu:
+
+
+- Wykonaj próbkowanie tekstury we współrzędnych otrzymanych przez fragment shader:
vec4 textureColor = texture2D(~nazwaZmiennejSampler2D, ~nazwaZmiennejWspolrzedneTekstury)
(gdzie vec4
zawiera kolor RGBA).
+- Użyj pierwszych trzech współrzędnych (RGB) uzyskanego wektora jako nowego koloru bazowego piksela.
+
+Pobaw się mechanizmem teksturowania:
+
+- Przemnóż jedną lub obie ze współrzędnych mapowania przez 5 i sprawdź, co się stanie.
+- Wypróbuj pozostałe tekstury: grid_color.png, earth.png.
+- Tekstury Ziemi wyświetlają się "do góry nogami". Napraw to.
+- Jeśli chcesz mieć kilka planet o różnych teksturach, możesz skorzystać z tego linku lub tego linku.
+
+Zadanie *
+Nadaj jakieś tekstury wszystkim obiektom, które znajdują się w scenie.
+Multitexturing
+W tej części pokażemy, jak wykorzystać więcej niż jedną teksturę przy rysowaniu obiektu na przykładzie zachmurzonej Ziemi.
+Zadanie
+
+- Utwórz kolejną parę shaderów, nazwij je
shader_earth
, skopiuj poprzednie shadery, jakie wykorzystywaliśmy,
+- dodaj w nich nowy
uniform sampler2D
nazwij go clouds
,
+- użyj do rysowania ziemi nowo stworzonego shadera,
+- wyślij dodatkowo teksturę chmur, która znajduje się pod plikiem
clouds.png
, ustaw indeks tekstury na 2,
+- by sprawdzić, czy całość się udała, użyj chmury jako kolory.
+
+Wykorzystamy teksturę chmur jako maskę. Ustaw kolor Ziemi jako mix między białym a kolorem tekstury Ziemi, a za współczynnik mieszania weź kanał r
tekstury chmur.
+Zadanie*
+W podobny sposób wykorzystaj tekstury ship.jpg
, scratches.jpg
i rust.jpg
, żeby dodać zarysowania do statku. Załaduj wszystkie trzy tekstury, użyj scratches.jpg
jako maski, która będzie wskazywała współczynnik, którym będziemy mieszać pomiędzy dwoma pozostałymi teksturami.
+Teksturowanie proceduralne
+
+Stwórz czwartą parę plików z shaderami (np. shader_proc_tex.vert i shader_proc_tex.frag). Następnie zainicjalizuj program jak w I.6.a) i II.1.a) (nazwij go np programProcTex
). Do wywołania rysowania wykorzystuj funkcję drawObject
(Żeby nie tracić oteksturowanych planet, możesz rysować za ich pomocą wyłącznie statek).
+Prostym sposobem proceduralnego teksturowania, jest uzależnienie koloru od pozycji piksela w przestrzeni lokalnej (użycie przestrzeni świata spowodowałoby, że wzór na obiekcie zmieniałby się przy poruszaniu go).
+
+
+- Prześlij z vertex shadera do fragment shadera pozycję wierzchołka w przestrzeni lokalnej (czyli tej, w której wyrażone są atrybuty wierzchołka - nie trzeba więc wykonywać żadnej transformacji macierzowej).
+- We fragment shaderze oblicz sinus współrzędnej y pozycji piksela.
+- Jeżeli sinus jest większy od zera, to ustaw bazowy kolor obiektu na wybrany kolor, a jeśli jest mniejszy od zera, to na inny kolor.
+- Możesz przesłać te kolory przy użyciu zmiennych uniform z kodu C++ - pozwoli to rysować różne obiekty z różnymi parami kolorów.
+- Poeksperymentuj z innymi metodami teksturowania proceduralnego podanymi na wykładzie.
+
+
+
\ No newline at end of file
diff --git a/grk/cw 6/zadania 6.md b/grk/cw 6/zadania 6.md
new file mode 100644
index 0000000..a8755ce
--- /dev/null
+++ b/grk/cw 6/zadania 6.md
@@ -0,0 +1,67 @@
+# Teksturowanie
+Te zajęcia są kontynuacją poprzednich Zalecam wykorzystać ukończony kod z poprzednich zajęć. Projekt startowy jest tylko częściowo ukończonymi zadaniami
+
+### Zadanie
+Obejrzyj plik **Texture.h**, aby zapoznać się z interfejsem do obsługi tekstur.
+
+
+### Przygotuj shadery i załaduj teksturę:
+W kolejnych zadaniach będziemy potrzebować trzecią parę shaderów: **shader_5_tex.vert** i **shader_5_tex.frag** są one gotowymi shaderami z poprzednich zadań. Wczytaj shadery i przechowaj adres programu pod zmienną globalną `programTex`.
+
+Pod `namespace texture` znajdują się zmienne globalne typu `Gluint`, które będą przechowywać adresy tekstur. W funkcji `init()` załaduj tekstury z folderu **textures** przy pomocy `Core::LoadTexture`. Ta funkcja zwraca adres do wczytanej tekstury, przypisz je do zmiennych z `namespace texture`. (odwołanie się do `namespace` wykonuje się za pomocą ::, czyli by odwołać się do `grid` w `namespace` `texture` należy napisać `texture::grid`)
+
+Stwórz funkcje odpowiadająca za rysowanie teksturowanych obiektów. Skopiuj funkcję `drawObjectColor`. Nazwij kopię `drawObjectTexture()` i zmodyfikują ją tak, aby przyjmowała jako parametr identyfikator tekstury, a nie wektor koloru. (Usuń w niej linijkę odpowiadającą za przesyłanie koloru, żeby uniknąć błędu komunikacji, później dodamy na jej miejsce ładowanie tekstury).
+
+
+
+### Zmodyfikuj shader tak, aby nakładał teksturę na obiekt:
+Narysuj jedną z planet za pomocą `drawObjectTexture()`, użyj `programTex` jako programu.
+
+b) Prześlij współrzędne mapowania tekstur z *vertex shadera* do *fragment shadera*
+- Współrzędne tekstur to kolejny (po pozycjach i wektorach normalnych) atrybut wierzchołków - są dostępne w *vertex shaderze* pod nazwą `vertexTexCoord`
+- Prześlij je znanym już sposobem do *fragment shadera* (zmienna `out` w *vertex shaderze* i odpowiadająca jej zmienna `in` we *fragment shaderze*)
+
+c) Prześlij teksturę do fragment shadera:
+- Stwórz zmienną typu `uniform sampler2D` (nazwij ją na przykład `colorTexture`) we fragment shaderze - analogicznie do innych zmiennych typu uniform, służy ona do przesyłania informacji bezpośrednio z kodu C++ do shadera
+- Po stronie kodu C++ użyj funkcji `Core::SetActiveTexture` wewnątrz `drawObjectTexture()` aby ustawić zmienną `sampler2D` na wczytaną wcześniej teksturę.
+
+d) Użyj wartości uzyskanej z tekstury zamiast koloru (`objectColor`) do pokolorowania obiektu:
+- Wykonaj próbkowanie tekstury we współrzędnych otrzymanych przez fragment shader: `vec4 textureColor = texture2D(~nazwaZmiennejSampler2D, ~nazwaZmiennejWspolrzedneTekstury)`" (`vec4` zawiera kolor RGBA)
+- Użyj pierwszych trzech współrzędnych (RGB) uzyskanego wektora jako nowego koloru bazowego piksela.
+
+
+### Pobaw się mechanizmem teksturowania:
+- Przemnóż jedną lub obie ze współrzędnych mapowania przez 5 i sprawdź, co się stanie.
+- Wypróbuj pozostałe tekstury: **grid_color.png**, **earth.png**.
+- Tekstury Ziemi wyświetlają się "do góry nogami". Napraw to.
+- Jeśli chcesz mieć kilka planet o różnych teksturach, możesz skorzystać z [link](https://www.solarsystemscope.com/textures/) lub [link2](https://stevealbers.net/albers/sos/sos.html).
+
+### Zadanie *
+Nadaj jakieś tekstury wszystkim obiektom, które znajdują się w scenie.
+
+## Multitexturing
+W tej części pokażemy jak wykorzystać więcej niż jedną teksturę przy rysowaniu obiektu na przykładzie zachmurzonej Ziemi.
+
+### Zadanie
+- Utwórz kolejną parę shaderów, nazwij je `shader_earth`, skopiuj poprzednie shadery, jakie wykorzystywaliśmy,
+- dodaj w nich nowy `uniform sampler2D` nazwij go `clouds`,
+- użyj do rysowania ziemi nowo stworzonego shadera,
+- wyślij dodatkowo teksturę chmur, która znajduje się pod plikiem `clouds.png`, ustaw indeks tekstury na **2**,
+* by sprawdzić, czy całość się udała, użyj chmury jako kolory.
+
+Wykorzystamy teksturę chmur jako maskę. Ustaw kolor Ziemi jako mix między białym a kolorem tekstury Ziemi a za współczynnik mieszania weź kanał `r` tekstury chmur.
+
+### Zadanie*
+W podobny sposób wykorzystaj tekstury `ship.jpg`, `scratches.jpg` i `rust.jpg`, żeby dodać zarysowania do statku. Załaduj wszystkie trzy tekstury, użyj `scratches.jpg` jako maskę, która będzie wskazywała współczynnik, którym będziemy mieszać pomiędzy dwoma pozostałymi teksturami.
+
+## Teksturowanie proceduralne
+
+a) Stwórz czwartą parę plików z shaderami (np. **shader_proc_tex.vert** i **shader_proc_tex.frag**). Następnie zainicjalizuj program jak w I.6.a) i II.1.a) (nazwij go np `programProcTex`). Do wywołania rysowania wykorzystuj funkcję `drawObject` (Żeby nie tracić oteksturowanych planet, możesz rysować za ich pomocą wyłącznie statek).
+
+b) Prostym sposobem proceduralnego teksturowania, jest uzależnienie koloru od pozycji piksela w przestrzeni lokalnej (użycie przestrzeni świata spowodowałoby, że wzór na obiekcie zmieniałby się przy poruszaniu go).
+- Prześlij z vertex shadera do fragment shadera pozycję wierzchołka w przestrzeni lokalnej (czyli tej, w której wyrażone są atrybuty wierzchołka - nie trzeba więc wykonywać żadnej transformacji macierzowej).
+- We fragment shaderze oblicz sinus współrzędnej y pozycji piksela.
+- Jeżeli sinus jest większy od zera, to ustaw bazowy kolor obiektu na wybrany kolor, a jeśli jest mniejszy od zera, to na inny kolor.
+- Możesz przesłać te kolory przy użyciu zmiennych uniform z kodu C++ - pozwoli to rysować różne obiekty z różnymi parami kolorów.
+- Poeksperymentuj z innymi metodami teksturowania proceduralnego podanymi na wykładzie.
+
diff --git a/grk/cw 6/zlib.dll b/grk/cw 6/zlib.dll
new file mode 100644
index 0000000..7e7c10e
Binary files /dev/null and b/grk/cw 6/zlib.dll differ
diff --git a/grk/cw 6/zlibd.dll b/grk/cw 6/zlibd.dll
new file mode 100644
index 0000000..5f03c2c
Binary files /dev/null and b/grk/cw 6/zlibd.dll differ