∗ . , . / Jaki jest zakres współrzędnej UVx? , ; __ ; Funkcja atan w OpenGL: Poprawny wynik gdy punkt (x,y): leży w I, II, III lub IV ćwiartce układu leży w I lub IV ćwiartce układu
OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D Tutaj również piksele z renderowanego bloku
dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować float resultColor = 0.; if (Segment == 0) resultColor = kolor z czerwono-czarnej kratki }
dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować float resultColor = 0.; if (Segment == 0) resultColor = kolor z czerwono-czarnej kratki else if (Segment == 1) { } }
dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować float resultColor = 0.; if (Segment == 0) resultColor = kolor z czerwono-czarnej kratki else if (Segment == 1) { vec2 ddx, ddy = ręczne obliczenie gradientów resultColor = kolor z tekstury na podstawie ddx, ddy } }
dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować float resultColor = 0.; if (Segment == 0) resultColor = kolor z czerwono-czarnej kratki else if (Segment == 1) { vec2 ddx, ddy = ręczne obliczenie gradientów resultColor = kolor z tekstury na podstawie ddx, ddy } trochę maty zmieniającej resultColor }
0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; Renderowane piksele C D H G A B F E
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E Tutaj również te same piksele
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E Tutaj również te same piksele Uwaga! W rzeczywistości jest 32 lub 64 pikseli
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E Stan pikseli w poszczególnych krokach
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X Jednolity przepływ (uniform flow) Jednolity przepływ (uniform flow)
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X Jednolity przepływ (uniform flow) Jednolity przepływ (uniform flow) Niejednolity przepływ (non-uniform flow)
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X Z dokumentacji OpenGL: W przepływie niejednolitym wartości pochodnych są niezdefiniowane
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X =??? =???
int Segment = określenie segmentu float resultColor = 0.; if (Segment == 0) resultColor = czerwono-czarna kratka else { vec2 ddx, ddy = obliczenie gradientów resultColor = kolor z tekstury } trochę maty zmieniającej resultColor fragColor = resultColor; C D H G A B F E X X X X X X X X X X X X X X X X X X X W tym miejscu mamy wartości niezdefiniowane
UV / iResolution; vec4 colorB = (UV+1) / iResolution; fragColor = Segment < 0.5 ? colorA : colorB; Wartości rejestrów muszą być wyliczone przed użyciem operatora (w wypadku użycia SPIR-V) • Gdzie jest haczyk? • Jaka wydajność?
{ jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej [flatten] if (warunek) { jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej
{ jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej [flatten] if (warunek) { jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej
nie dodamy atrybutu? [branch] vs [flatten] ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku
nie dodamy atrybutu? [branch] vs [flatten] ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku ¯\_(ツ)_/¯
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji?
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji? - NIE, debugowanie pokazuje, że wszystko się zgadza.
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji? - NIE, debugowanie pokazuje, że wszystko się zgadza. - A może wpiszę z palca prawidłowe wartości macierzy?
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji? - NIE, debugowanie pokazuje, że wszystko się zgadza. - A może wpiszę z palca prawidłowe wartości macierzy? - NIE, koszt wczytania tablicy to 120 cykli.
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji? - NIE, debugowanie pokazuje, że wszystko się zgadza. - A może wpiszę z palca prawidłowe wartości macierzy? - NIE, koszt wczytania tablicy to 120 cykli. -A może
wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice. -A może popełniłem błąd w zaokrągleniach/precyzji? - NIE, debugowanie pokazuje, że wszystko się zgadza. - A może wpiszę z palca prawidłowe wartości macierzy? - NIE, koszt wczytania tablicy to 120 cykli. -A może - CHCIAŁBYŚ…
macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; } To musi zostać Zastanówmy się…
macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; } Może da się to zoptymalizować? Zastanówmy się…
macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; } Może da się to zoptymalizować? A może całkowicie zrezygnować z liczenia wartości ze wzoru? Zastanówmy się…