vertex - obliczenia na krawedziach
Drugi - obliczenia na pixelach
Cyzczenie buforow
-----
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); <- wyczysc bufor tym kolorem()
glClear(GL_COLOR_BUFFER_BIT);
---
uzyj programu o nazwie the program
glUseProgram(theProgram);
____
Dane do wystartowania programu
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); <- dane zwiazane z wiercholkami ( obiekt)
glEnableVertexAttribArray(0); <- atrybut numer 0, uruchamiamy go
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); <- wypelniamy go, mowi co to jest za atrybut.
4 floaty mowia o polozeniu wierzcholka
^^^^^^^^^^
Bufory- cos do przechowywania atrybutow o wierzcholakach i pizelach?
glGen -> towrzymy pudelko
glBind -> otwieramy to pudelko [ mozna tez laczyc elementy]
glData -> wypelniamy pudelko
np stworzymy kilka pudelek, wybieramty jedno i uzyjemty komendy bind do wybrania konretnie jednego pudelka, mozna tezs uzyc go ponownie do otwarcia innego pudelka a te poprzednie bedzie zamkniete, jeli po prostu checmy je zamknac to bindujemy do zera.
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); <- pozycje wierzcholkoow
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
^^
Odwolujemy sie do podelka i wprowadzamy dane, wkladamy do pudelka np wielkos, VertexPosition -> tablica jednowymiarowa
Z poprzedniego
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); informacje o tablicy
( grupujemy w czworki grupuy zero, floaty, od poczatku, bez przerw)
_______
Zamiast 3 danych xyz mamy w opengl 4y dane
XYZW- ta czwarta dana jest do macierzy. wspolrzedne jednorodne.
xyz-> przestrzen 3d,
W-> sprawia ze sa to dane jednorodne, mozna latwiej operowac wtedy na macierzach
W ma jedynki na poczatku obecnie, na koncu trzeba sie go pozbyc, nie zawsze bedzie 1, wplywa na xyz.
Taki iz po przejscu z jednego shadera na drugi, dane nam sie zamieniaja na dane 3d w postaci x/w, y/w , z/w. Tego nie ttrzeba juz dzielic.
Open gl musi sobie przez 4ta zmeinna podzielic.
____
jak juz mamy wypelniony bufor czyli
,,glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
"
Mozna narysowac trojkat
,,glDrawArrays(GL_TRIANGLES, 0, 3);" bierze 3 wierzcholki i utworzy z nich trojkaty, mozna tez rysowac inne rzeczy.
____
glDisableVertexAttribArray(0); usuniecie atrybutow
glUseProgram(0); usuniecie programu
___
openggl uzywa 2ch buforwov
glutSwapBuffers();
jeden ktory liczy drugi ktory wyswietla? WTF?
______________
Shader, 1.3
#version 330 -> wersja jezyka
layout(location = 0)
in vec4 position;
//szereg danych wejsciowych i wyjsciowych.
//tu mamy tylko wejsciowe
//In na wejscie
//out wyjsciowe
//Tu mamy wejscie z bufora
//pobieramy jako dane wejsciowe dane z atrybutu zero, czyli nasze czworki floatow
void main()
{
gl_Position = position;
}
//Tu przepisujemy dane na wyjscie
gl_Position -> to wyjsciowa pozycja, czyli nasze x,y,z czyli wpisanie naszych danych na wierzchołki
Fragment shader
Tu wchodzą wszystkie dane z shadera, nadaje on tu kolory w najprostszej wersji.
#version 330
Wersja
out vec4 outputColor;
4o wymiarowe dane o kolorze
outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
Stworzenie z 4 floatow jednej danej typu vec 4.
_______
Jak zrobić by shadery dzialaly na karcie
------ROZDZIAŁ 2 ____------
out vec4 outputColor;
jedna zmienna ywjsciowa
outputColor = mix(vec4(1.0f, 1.0f, 1.0f, 1.0f),
vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpValue);
Zmienna wyjsciowa jest bardziej skomplikowna,m używamy funkcji mix która zsluzy do wymieszania
(1.0f, 1.0f, 1.0f, 1.0f),
Kolor biały
vec4(0.2f, 0.2f, 0.2f, 1.0f),
Szary
lerpValue);
Teta? Wtf?
[ odwolywanie się do wektrowo 4o wymiarowych vec 4. Można bezpośrednio do jednego wymiaru typu vector.x lub vector.xy]
gl_FragCoord.y
To już nie sa nasze wspolzedne typu -1/ 1. To sa już wspolzedne fragment position, wspolzedne okna.
Jest to konieczne.
Ze znormalizowanych ( -1 do 1) na wspolrzedne okna-> na pixele
gl_FragCoord.y / 500.0f
Jeśli mielsmy okno o szerokości 500 to dzieląc przez 500.0f uzyskamy wartości z przedzialu 0<->1 WTF?
Oprocz wspolrzednych możemy tez podawac kolory.
const float vertexData[] = {
0.0f, 0.5f, 0.0f, 1.0f,
0.5f, -0.366f, 0.0f, 1.0f,
-0.5f, -0.366f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
Dla każdego wierzchołka mamy inny kolor.
____
Pierwsze 3 czworki to wierzchołki , reszta to kolory. Trzeba to openglowi powiedzieć
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
Atrybu zero polozenie wierzchołka
Attrybuy 1 kolloory
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (void*)48);
Artrybut zero, jedziemy bez przerw.
Dla atrybutu 1, jest przesuniecie o 48, czyli informacja o tym co jest kolorami.
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
Wyczyszczenie atrybutow pierwszego i drugiego.
glutPostRedisplay();
Wymus odswierzenie obrazu? Wtf
Vertex shader pobiera dane z buforw
Fragment shader pobiera info z Vertexa
smooth out vec4 theColor;
definiujemy tak dane wyjściowe
theColor = color;
w ten sposób informujemy fragment shadera ze ma pobrać dane z vertexa.
smooth
To rodzaj interpolacji, gładkie przejście z jednego koloru na drugi