Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Analiza 2. zadania konkursu shaderów

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for TheMXPL TheMXPL
December 19, 2019

Analiza 2. zadania konkursu shaderów

Avatar for TheMXPL

TheMXPL

December 19, 2019

Other Decks in Programming

Transcript

  1. 1 Problem • Rozmiar: 8px x 8px • Format: uint8

    (kanał R) • Filtrowanie: trójliniowe
  2. 1 Problem • Rozmiar: 8px x 8px • Format: uint8

    (kanał R) • Filtrowanie: trójliniowe • „Zawijanie”: Repeat
  3. 1 Problem • Rozmiar: 8px x 8px • Format: uint8

    (kanał R) • Filtrowanie: trójliniowe • „Zawijanie”: Repeat Konfiguracja narzucona z góry
  4. 1 Problem • Rozmiar: 8px x 8px • Format: uint8

    (kanał R) • Filtrowanie: trójliniowe • „Zawijanie”: Repeat
  5. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  6. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  7. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  8. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  9. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap Interpolacja między tymi wartościami
  10. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  11. Filtrowanie trójliniowe Interpolujemy 4 teksele znajdujące się w okolicy punktu

    próbkowania (filtrowanie dwuliniowe) Interpolujemy teksele z 2 „najbardziej odpowiednich” mipmap
  12. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… 4 (, 2 ) ̶ Tak, ale…
  13. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… 4 (, 2 ) - 264 cykli ̶ Tak, ale…
  14. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli ̶ Tak, ale…
  15. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli 4 ℎ(, 2 , ) ̶ Tak, ale…
  16. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli 4 ℎ(, 2 , ) - 120 cykli ̶ Tak, ale…
  17. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli 4 ℎ(, 2 , ) - 120 cykli Zawsze LOD 0 ̶ Tak, ale…
  18. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli 4 ℎ(, 2 , ) - 120 cykli Koordynaty jako ivec2 ̶ Tak, ale…
  19. Czyli wystarczy zmienić filtrowanie na punktowe? 1) Zasady konkursu 2)

    Byłoby to niezbyt mądre… Zamiast tego lepiej użyć funkcji texelFetch 4 (, 2 ) - 264 cykli 4 ℎ(, 2 , ) - 120 cykli Próbkowanie mipmapy A 120 cykli + Próbkowanie mipmapy B 120 cykli + Liczenie LOD + interpolacja 24 cykle 264 cykle ̶ Tak, ale…
  20. Problem 2 (1.0 − ε; ε) (ε; ε) (1.0 −

    ε; ε) (ε; ε) (ε; ε) (ε; ε) (1.0 − ε; ε) (1.0 − ε; ε)
  21. Problem 2 (1.0 − ε; ε) (ε; ε) (1.0 −

    ε; ε) (ε; ε) (ε; ε) (ε; ε) (1.0 − ε; ε) (1.0 − ε; ε) „Nieciągłość gradientu współrzędnych tekstury”
  22. ( + 1.0 − ε; ε) ( + 1.0 +

    ε; ε) ( + 2.0 −ε; ε) ( + 2.0 +ε; ε) ( + 3.0 + ε; ε) ( + 3.0 − ε; ε) ( + 0.0 + ε; ε) ( + 4.0 − ε; ε)
  23. ( + 1.0 − ε; ε) ( + 1.0 +

    ε; ε) ( + 2.0 −ε; ε) ( + 2.0 +ε; ε) ( + 3.0 + ε; ε) ( + 3.0 − ε; ε) ( + 0.0 + ε; ε) ( + 4.0 − ε; ε)
  24. = 2 ∗ tan−1 Wzór liczący UV Y - wartość

    wyliczona na podstawie fragCoord oraz iTime
  25. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx?
  26. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx?
  27. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx?
  28. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? , ; __ ; Funkcja atan w OpenGL:
  29. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / 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
  30. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? , ; __ ; Funkcja atan w OpenGL: Wynik należy do zakresu: < −; > < − 2 ; 2 >
  31. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? < −; >
  32. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? < −2; 2 >
  33. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? < −2; 2 >
  34. = 2 ∗ tan−1 Wzór liczący UV . = 2.0

    ∗ . , . / Jaki jest zakres współrzędnej UVx? < −2; 2 > Mamy to!
  35. Skąd się bierze artefakt? • Z „nieciągłości gradientu współrzędnych tekstury”

    …ale najpierw coś prostszego: • „Pochodna cząstkowa w odniesieniu do przestrzeni ekranowej”
  36. Skąd się bierze artefakt? • Z „nieciągłości gradientu współrzędnych tekstury”

    …ale najpierw coś prostszego: • „Pochodna cząstkowa w odniesieniu do przestrzeni ekranowej” Tak naprawdę proste mechanizmy z fikuśnymi nazwami
  37. Uruchamianie fragment shaderów Batch / Warp / Wavefront (AMD) (Nvidia)

    Tekstura do której renderujemy trójkąt Dane wysyłane na GPU
  38. Uruchamianie fragment shaderów Batch / Warp / Wavefront (AMD) (Nvidia)

    32 wątki 64 wątki Tekstura do której renderujemy trójkąt Dane wysyłane na GPU
  39. Uruchamianie fragment shaderów Zajmiemy się analizą tego bloku Tekstura do

    której renderujemy trójkąt Dane wysyłane na GPU
  40. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); }
  41. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  42. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  43. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  44. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  45. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  46. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4
  47. Pojedynczy blok pikseli 2x2 void mainImage(out vec4 fragColor, in vec2

    fragCoord) { vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv, 0.0,1.0); } %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 PS Powyższy listing jest bardzo uproszczony
  48. %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 =

    OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 Wszystkie instrukcje naszego shadera
  49. %1 = 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 Piksele bloku, który renderujemy
  50. Piksel A Piksel B Piksel C Piksel D %1 =

    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
  51. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D Rejestry wykorzystywane przez poszczególne piksele
  52. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D Wartości rejestrów w poszczególnych krokach
  53. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0
  54. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 (powyżej widzimy wyłącznie komponenty x i y rejestrów)
  55. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0
  56. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0
  57. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1
  58. Piksel A Piksel B Piksel C Piksel D %1 =

    OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 = OpFDiv %1 %2 %4 = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 A B C D 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 Uwaga! Rejestry pikseli na zewnątrz trójkąta również są uzupełniane.
  59. Pochodna cząstkowa w odniesieniu do przestrzeni ekranowej ; ; ;

    ; HLSL GLSL ddx ddx(x) = wartość x z prawego piksela - wartość x z lewego piksela
  60. Pochodna cząstkowa w odniesieniu do przestrzeni ekranowej ; ; ;

    ; HLSL GLSL ddy ddy(x) = wartość x z dolnego piksela - wartość x z górnego piksela
  61. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D
  62. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D Wstawione nazwy zmiennych
  63. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  64. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D Wartość rejestru R1 już nie jest potrzebna 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  65. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0
  66. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 = 0.63 – 0.54 0 = 0.44 – 0.44
  67. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 = 0.63 – 0.54 0 = 0.44 – 0.44
  68. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 = 0.63 – 0.54 0 = 0.31 – 0.31
  69. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 ddx(uv) – dla każdego piksela taka sama wartość
  70. Piksel A Piksel B Piksel C Piksel D R1 R2

    R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 R1 R2 R3 R4 6.5 3.5 0 0 0 0 0 0 7.5 3.5 0 0 0 0 0 0 6.5 2.5 0 0 0 0 0 0 7.5 2.5 0 0 0 0 0 0 6.5 3.5 12 8 0 0 0 0 7.5 3.5 12 8 0 0 0 0 6.5 2.5 12 8 0 0 0 0 7.5 2.5 12 8 0 0 0 0 6.5 3.5 12 8 0.54 0.44 0 0 7.5 3.5 12 8 0.63 0.44 0 0 6.5 2.5 12 8 0.54 0.31 0 0 7.5 2.5 12 8 0.63 0.31 0 0 6.5 3.5 0 0 12 8 0 0 0.54 0.44 0 0 0.54 0.44 0 1 7.5 3.5 0 0 12 8 0 0 0.63 0.44 0 0 0.63 0.44 0 1 6.5 2.5 0 0 12 8 0 0 0.54 0.31 0 0 0.54 0.31 0 1 7.5 2.5 0 0 12 8 0 0 0.63 0.31 0 0 0.63 0.31 0 1 %1 = OpLoad %gl_FragCoord %2 = OpLoad %iResolution %3 (uv) = OpFDiv %1 %2 %1 (ddx(uv)) = OpDPdx %3 %4 (fragColor) = OpCompositeConstruct %3 %float_0 %float_1 OpStore %gl_FragColor %4 A B C D 0.09 0 12 8 0.54 0.44 0 0 0.09 0 12 8 0.63 0.44 0 0 0.09 0 12 8 0.54 0.31 0 0 0.09 0 12 8 0.63 0.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 0.09 0 0 0 Jeżeli byłoby ddy(uv) 0 = 0.54 – 0.54 -0.13 = 0.31 – 0.44
  71. LOD 8 LOD 7 LOD 6 LOD 5 LOD 4

    LOD 3 LOD 2 LOD 1 LOD 0
  72. LOD 8 LOD 7 LOD 6 LOD 5 LOD 4

    LOD 3 LOD 2 LOD 1 LOD 0 Tekstura ma ustawione filtrowanie trójliniowe
  73. uv: 0.501 0.499 0.500 0.500 0.501 0.500 0.500 0.499 ddx(uv):

    (0.001, 0.000) ddy(uv): (0.000, -0.001)
  74. uv: 0.501 0.499 0.500 0.500 0.501 0.500 0.500 0.499 ddx(uv):

    (0.001, 0.000) ddy(uv): (0.000, -0.001) uv: 0.6 0.4 0.5 0.5 0.6 0.5 0.5 0.4 ddx(uv): (0.1, 0.0) ddy(uv): (0.0, -0.1) uv: 0.51 0.49 0.50 0.50 0.51 0.50 0.50 0.49 ddx(uv): (0.01, 0.00) ddy(uv): (0.00, -0.01)
  75. Jak jest wyliczana zmienna określająca LOD? = log2 { ∗

    2, ∗ 2} = ((), ()) Zależność: im większe ddx(uv) lub ddy(uv) tym większy LOD
  76. ddx(uv): (0.1, 0.0) ddy(uv): (0.0, -0.1) ddx(uv): (0.001, 0.000) ddy(uv):

    (0.000, -0.001) ddx(uv): (0.01, 0.00) ddy(uv): (0.00, -0.01)
  77. ddx(uv): (0.1, 0.0) ddy(uv): (0.0, -0.1) ddx(uv): (0.001, 0.000) ddy(uv):

    (0.000, -0.001) ddx(uv): (0.01, 0.00) ddy(uv): (0.00, -0.01) Duży LOD Mały LOD Średni LOD
  78. Post Scriptum = log2 { ∗ 2, ∗ 2} =

    log2 { 2, 2} W dokumentacji wygląda on następująco…
  79. Post Scriptum = log2 { ∗ 2, ∗ 2} =

    log2 { 2, 2} W dokumentacji wygląda on następująco…
  80. Post Scriptum = log2 { ∗ 2, ∗ 2} =

    log2 { 2, 2} W dokumentacji wygląda on następująco… = ∂ ∂ , ∂ ∂
  81. Post Scriptum = log2 { ∗ 2, ∗ 2} =

    log2 { 2, 2} W dokumentacji wygląda on następująco… = ∂ ∂ , ∂ ∂ Krok w przestrzeni pełnej tekstury (a nie znormalizowanej) Krok w przestrzeni ekranu
  82. ddy(uv) = (4,0) ( − 2.0 + ε; ε) (

    + 2.0 − ε; ε) Bardzo duży LOD
  83. Próbkowanie tekstury Podstawowa funkcja próbkująca: 4 (, 2 ) ALE

    istnieje również inna wersja: 4 (, 2 , 2 , 2 )
  84. Próbkowanie tekstury Podstawowa funkcja próbkująca: 4 (, 2 ) ALE

    istnieje również inna wersja: 4 (, 2 , 2 , 2 ) dPdx, dPdy wyliczane automatycznie dPdx, dPdy podane jawnie
  85. Próbkowanie tekstury Podstawowa funkcja próbkująca: 4 (, 2 ) ALE

    istnieje również inna wersja: 4 (, 2 , 2 , 2 ) PS istnieje również taka wersja: 4 (, 2 , )
  86. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ;
  87. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ; Wyznaczmy sobie "zepsute" y
  88. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ; Jeżeli . > 2.0 …
  89. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ; … od . odejmij 4.0
  90. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ;
  91. Naprawa artefaktu Artefakty powstają gdy: . ≈ 4.0 …so let’s

    hack it… 2 = ; −= 2 2. , 0. , ∗ 4 4. , 0. ; Odnośnie hakowania…
  92. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować }
  93. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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 }
  94. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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) { } }
  95. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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 } }
  96. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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 } }
  97. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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 }
  98. Pseudokod shadera void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    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 fragColor = resultColor; }
  99. dużo maty 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; Pseudokod shadera
  100. dużo maty 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; Renderowane piksele C D H G A B F E
  101. A B C D E F G H dużo maty

    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
  102. A B C D E F G H dużo maty

    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
  103. A B C D E F G H dużo maty

    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
  104. A B C D E F G H dużo maty

    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
  105. A B C D E F G H dużo maty

    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
  106. A B C D E F G H dużo maty

    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
  107. A B C D E F G H dużo maty

    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
  108. A B C D E F G H dużo maty

    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
  109. A B C D E F G H dużo maty

    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
  110. A B C D E F G H dużo maty

    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
  111. A B C D E F G H dużo maty

    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)
  112. A B C D E F G H dużo maty

    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)
  113. A B C D E F G H dużo maty

    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
  114. A B C D E F G H dużo maty

    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 =??? =???
  115. A B C D E F G H dużo maty

    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
  116. A B C D E F G H X X

    X X X X X X X X X X X X X X X X X Post Scriptum
  117. A B C D E F G H X X

    X X X X X X X X X X X X X X X X X Post Scriptum Maska bitowa jest tworzona
  118. A B C D E F G H X X

    X X X X X X X X X X X X X X X X X Post Scriptum Maska bitowa jest tworzona Maska bitowa jest odwracana
  119. A B C D E F G H X X

    X X X X X X X X X X X X X X X X X Post Scriptum Maska bitowa jest tworzona Maska bitowa jest odwracana Maska bitowa jest usuwana
  120. Jak naprawić? void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować vec4 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 fragColor = resultColor; }
  121. Jak naprawić? void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować vec4 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 fragColor = resultColor; }
  122. Jak można usunąć if’a? • Wykorzystanie funkcji • Wykorzystanie matematyki

    • Wykorzystanie operatora trójargumentowego ?: ( , )
  123. Jak można usunąć if’a? • Wykorzystanie funkcji • Wykorzystanie matematyki

    • Wykorzystanie operatora trójargumentowego ?: ( , ) resultColorA = kolor z czerwono-czarnej kratki resultColorB = kolor z tekstury na podstawie ddx, ddy fragColor = Segment < 0.5 ? resultColorA : resultColorB;
  124. Jak można usunąć if’a? • Wykorzystanie funkcji • Wykorzystanie matematyki

    • Wykorzystanie operatora trójargumentowego ?: ( , ) resultColorA = kolor z czerwono-czarnej kratki resultColorB = kolor z tekstury na podstawie ddx, ddy fragColor = Segment < 0.5 ? resultColorA : resultColorB; R1 R2 R3 R4
  125. Jak można usunąć if’a? • Wykorzystanie funkcji • Wykorzystanie matematyki

    • Wykorzystanie operatora trójargumentowego ?: ( , ) resultColorA = kolor z czerwono-czarnej kratki resultColorB = kolor z tekstury na podstawie ddx, ddy fragColor = Segment < 0.5 ? resultColorA : resultColorB; R1 R2 R3 R4 R3
  126. Operator trójargumentowy R1 R2 R3 R4 R3 vec4 colorA =

    UV / iResolution; vec4 colorB = (UV+1) / iResolution; fragColor = Segment < 0.5 ? colorA : colorB; • Gdzie jest haczyk? • Jaka wydajność?
  127. Operator trójargumentowy R1 R2 R3 R4 R3 vec4 colorA =

    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ść?
  128. Operator trójargumentowy R1 R2 R3 R4 R3 vec4 colorA =

    UV / iResolution; vec4 colorB = (UV+1) / iResolution; fragColor = Segment < 0.5 ? colorA : colorB; fragColor = Segment < 0.5 ? UV / iResolution : (UV+1) / iResolution; • Gdzie jest haczyk? • Jaka wydajność?
  129. Operator trójargumentowy R1 R2 R3 R4 R3 vec4 colorA =

    UV / iResolution; vec4 colorB = (UV+1) / iResolution; fragColor = Segment < 0.5 ? colorA : colorB; fragColor = Segment < 0.5 ? UV / iResolution : (UV+1) / iResolution; Kod będzie działał jak zwykły if • Gdzie jest haczyk? • Jaka wydajność?
  130. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5
  131. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5 %5 = %4 %4 %4 %4
  132. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5 %5 = %4 %4 %4 %4 float vec4 vec4
  133. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5 %5 = %4 %4 %4 %4 %6 = %5 %2 %3
  134. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5 %5 = %4 %4 %4 %4 %6 = %5 %2 %3 - 4 cykle - 3 cykle - 2 cykle
  135. Operator trójargumentowy • Gdzie jest haczyk? • Jaka wydajność? =

    < 0.5 ? ∶ ; %1 − ; %2 − ; %3 − ; %4 = ℎ %1 %_0_5 %5 = %4 %4 %4 %4 %6 = %5 %2 %3 - 4 cykle - 3 cykle - 2 cykle
  136. Naprawa artefaktu void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować vec4 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 fragColor = resultColor; }
  137. Naprawa artefaktu void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować vec4 resultColor = 0.; if (Segment == 0) vec4 resultColorA= kolor z czerwono-czarnej kratki else if (Segment == 1) { vec2 ddx, ddy = ręczne obliczenie gradientów vec4 resultColorB= kolor z tekstury na podstawie ddx, ddy } vec4 resultColor = Segment < 0.5 ? resultColorA : resultColorB; trochę maty zmieniającej resultColor fragColor = resultColor; }
  138. Naprawa artefaktu void mainImage(out vec4 fragColor, in vec2 fragCoord) {

    dużo maty wykorzystującej m.in. fragCoord int Segment = określenie segmentu, który mamy wyrenderować vec4 resultColor = 0.; if (Segment == 0) vec4 resultColorA= kolor z czerwono-czarnej kratki else if (Segment == 1) { vec2 ddx, ddy = ręczne obliczenie gradientów vec4 resultColorB= kolor z tekstury na podstawie ddx, ddy } vec4 resultColor = Segment < 0.5 ? resultColorA : resultColorB; trochę maty zmieniającej resultColor fragColor = resultColor; } Pochodne liczone w przepływie jednolitym
  139. Post Scriptum Jak to wygląda w HLSL? [branch] if (warunek)

    { jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej
  140. Post Scriptum Jak to wygląda w HLSL? [branch] if (warunek)

    { jakiś kod gdy warunek spełniony } else { jakiś kod gdy warunek nie spełniony } jakiś kod po instrukcji warunkowej
  141. Post Scriptum Jak to wygląda w HLSL? [branch] if (warunek)

    { 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
  142. Post Scriptum Jak to wygląda w HLSL? [branch] if (warunek)

    { 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
  143. Post Scriptum Jak to wygląda w HLSL? [flatten] if (warunek)

    { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA
  144. Post Scriptum Jak to wygląda w HLSL? [flatten] if (warunek)

    { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA
  145. Post Scriptum Jak to wygląda w HLSL? R1 [flatten] if

    (warunek) { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA
  146. Post Scriptum Jak to wygląda w HLSL? R1 R2 [flatten]

    if (warunek) { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA
  147. Post Scriptum Jak to wygląda w HLSL? R1 R2 R3

    [flatten] if (warunek) { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA
  148. Post Scriptum Jak to wygląda w HLSL? R1 R2 R3

    [flatten] if (warunek) { zmiennaA = jakiś kod } else { zmiennaA = jakiś inny kod } jakiś kod wykorzystujący zmiennaA R3 R4 = ? : R1 R2 R4
  149. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku
  150. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku
  151. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp...
  152. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp...
  153. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku
  154. Post Scriptum Jak to wygląda w HLSL? [branch] vs [flatten]

    ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku
  155. Post Scriptum Jak to wygląda w HLSL? A co gdy

    nie dodamy atrybutu? [branch] vs [flatten] ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku
  156. Post Scriptum Jak to wygląda w HLSL? A co gdy

    nie dodamy atrybutu? [branch] vs [flatten] ciężkie obliczenia w obu blokach warunku wykorzystanie tex2D(), ddx(), ddy(), itp... lekkie obliczenia w obu blokach warunku ¯\_(ツ)_/¯
  157. Problem - optymalizacja 4 1) - nie ma co optymalizować

     2) Mikrooptymalizacje - może będzie o tym osobna prelekcja…
  158. Problem - optymalizacja 4 1) - nie ma co optymalizować

     2) Mikrooptymalizacje - może będzie o tym osobna prelekcja… 3)
  159. Problem - optymalizacja 4 1) - nie ma co optymalizować

     2) Mikrooptymalizacje - może będzie o tym osobna prelekcja… 3) - może da się coś uprościć…
  160. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 Algorytm rekurencyjny
  161. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 1 = 0
  162. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 1 = 0 2 = 1 4 ∗ 0 2 3 1
  163. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 1 = 0 2 = 1 4 ∗ 0 2 3 1 4 = 1 16 ∗ 0 8 2 10 12 4 14 6 3 11 1 9 15 7 13 5
  164. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 1 = 0 2 = 1 4 ∗ 0 2 3 1 4 = 1 16 ∗ 0 8 2 10 12 4 14 6 3 11 1 9 15 7 13 5 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21
  165. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21
  166. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺
  167. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ()
  168. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ()
  169. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ()
  170. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ()
  171. Optymalizacja 2 = 1 (2)2 ∗ 4 ∗ 4 ∗

    + 2 4 ∗ + 3 4 ∗ + 1 8 = 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ () Zaimplementujmy ten wzór!
  172. Rezultat Jest optymalniej, ale zwiększa się RMSE (rozbieżność między naszym

    obrazem, a obrazem źródłowym)  Ale dlaczego? 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺
  173. Rezultat Jest optymalniej, ale zwiększa się RMSE (rozbieżność między naszym

    obrazem, a obrazem źródłowym)  Ale dlaczego? 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ⇎
  174. Rezultat Jest optymalniej, ale zwiększa się RMSE (rozbieżność między naszym

    obrazem, a obrazem źródłowym)  Ale dlaczego? 1 64 ∗ 0 48 12 60 3 51 15 63 32 16 44 28 35 19 47 31 8 56 4 52 11 59 7 55 40 24 36 20 43 27 39 23 2 50 14 62 1 49 13 61 34 18 46 30 33 17 45 29 10 58 6 54 9 57 5 53 42 26 38 22 41 25 37 21 ⟺ ⇎ Tekstura filtru Bayera z Internetu Tekstura filtru Bayera na shadertoy’u
  175. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru?
  176. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    wariacje zwracają to samo. -A może zmodyfikuję wartości stałe wzoru? - NIE, zmiany zwiększają różnice.
  177. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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?
  178. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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.
  179. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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?
  180. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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.
  181. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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
  182. - A może źle zaimplementowałem funkcję? - NIE, wszystkie jej

    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Ś…
  183. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru
  184. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Wiele wartości jest identycznych…
  185. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru … ale jeszcze więcej jest różnych
  186. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru To możemy otrzymać stosunkowo tanio
  187. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru To możemy otrzymać stosunkowo tanio A może obliczyć macierz ze wzoru i poprawić wynik?
  188. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8
  189. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 Zakres zmian to <-1;8>
  190. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian to <-1;8>
  191. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian to <-1;8> Zakres zmian to <0;9>
  192. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian można zapisać w 4 bitach Zakres zmian to <-1;8> Zakres zmian to <0;9>
  193. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian można zapisać w 4 bitach We float można zapisać różnicę 8 wartości Zakres zmian to <-1;8> Zakres zmian to <0;9>
  194. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian można zapisać w 4 bitach We float można zapisać różnicę 8 wartości Zakres zmian to <-1;8> Zakres zmian to <0;9> W vec4 można zapisać różnicę 32 wartości
  195. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Najmniejsza różnica: -1 Największa różnica: 8 +1 Zakres zmian można zapisać w 4 bitach We float można zapisać różnicę 8 wartości Zakres zmian to <-1;8> Zakres zmian to <0;9> W vec4 można zapisać różnicę 32 wartości W 2. vec4 można zapisać różnicę wszystkich wartości
  196. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru Pożądane różnice zapisujemy do zmiennej TopHalf Pożądane różnice zapisujemy do zmiennej BottomHalf
  197. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru 4 = 4 011719161, 003111321, 041803171, 020122011 ;
  198. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru 4 = 4 011719161, 003111321, 041803171, 020122011 ;
  199. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru 4 = 4 011719161, 003111321, 041803171, 020122011 ;
  200. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru 4 = 4 011719161, 003111321, 041803171, 020122011 ; Stałe obliczone ręcznie – zerowy koszt
  201. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; }
  202. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 0 128 32 160 8 136 40 168 192 64 224 96 200 72 232 104 48 176 16 144 56 184 24 152 240 112 208 80 248 120 216 88 12 140 44 172 4 132 36 164 204 76 236 108 196 68 228 100 60 188 28 156 52 180 20 148 252 124 220 92 244 116 212 84 Macierz Bayera z shadertoy’a Macierz Bayera ze wzoru float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; } Przesunięcia bitowe/mnożenia przez magiczne liczby
  203. Rezultat: Zamiast 120 cykli funkcji texelFetch(), mamy ok. 70 cykli

    matematycznych działań Najlepszy wynik jest lepszy o ok. 40 cykli
  204. float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index

    macierzy ze wzoru uint Difference = rozkodowana różnica ze zmiennej TopHalf lub BottomHalf bayerValue += Difference; return float(bayerValue) / 255.; } Zastanówmy się…
  205. float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index

    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ę…
  206. float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index

    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ę…
  207. float getBayerValue(uvec2 index) { uint bayerValue = wartość komórki index

    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ę…
  208. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a
  209. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a Wszystkie wartości są w zakresie <0;255>
  210. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a Wszystkie wartości są w zakresie <0;255> Każdą wartość można zapisać w 8 bitach
  211. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a Wszystkie wartości są w zakresie <0;255> Każdą wartość można zapisać w 8 bitach W vec4 można zapisać 16 wartości
  212. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a
  213. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner
  214. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a 4 = 4 0108828, 084968, 038198, 0977858 ; Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner
  215. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a 4 = 4 0108828, 084968, 038198, 0977858 ; Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner
  216. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a 4 = 4 0108828, 084968, 038198, 0977858 ; Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner
  217. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a 4 = 4 0108828, 084968, 038198, 0977858 ; Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner Stałe obliczone ręcznie – zerowy koszt
  218. 0 128 38 160 16 136 45 168 191 66

    224 96 200 74 233 104 51 176 23 143 58 184 30 152 241 111 208 81 249 119 216 88 20 139 47 171 10 132 41 163 204 77 237 107 196 70 229 100 63 188 33 155 55 179 27 147 254 123 220 92 245 116 212 85 Macierz Bayera z shadertoy’a 4 = 4 0108828, 084968, 038198, 0977858 ; Wartości zapisujemy do zmiennej LeftTopCorner Wartości zapisujemy do zmiennej LeftBottomCorner Wartości zapisujemy do zmiennej RightTopCorner Wartości zapisujemy do zmiennej RightBottomCorner >
  219. Koniec! … prawie Disclaimer… Wszystko się bardzo dynamicznie zmienia Więc

    czekam na uwagi oraz pytania równocześnie dziękując za uwagę ☺
  220. Koniec! … prawie Disclaimer… Wszystko się bardzo dynamicznie zmienia Więc

    czekam na uwagi oraz pytania równocześnie dziękując za uwagę ☺ TheMXPL Prezentację można będzie znaleźć na:
  221. Koniec! … prawie Disclaimer… Wszystko się bardzo dynamicznie zmienia Więc

    czekam na uwagi oraz pytania równocześnie dziękując za uwagę ☺ TheMXPL Prezentację można będzie znaleźć na: może…