Thursday, April 28, 2022

A simple zebra-striped model

1) Fill the array with values 0/1 with probability 0.5.

2) Loop over entire array, calculate the sum from the 8 neighbors (plus the given node) and change the value according to the rule:

sum = 0 1 2 3 4 5 6 7 8 9
new value = 0 0 0 0 1 0 1 1 1

3) Apply the ping-pong rule, that is, for two buffers in which we keep the data A and B and creating new values we write into the second one so as not to overwrite those from which we are to draw data in a given iteration. Then we replace A with B and so on over and over again.



Prosty model pasków na zebrze


 1) Wypełnij tablicę wartościami 0/1 z prawdopodobieństwem 0.5

 2) Przejdź całą tablicę, oblicz sumę z 8 sąsiadów (plus dany węzeł) i zmień wartość wg reguły:

suma =              0 1 2 3 4 5 6 7 8 9
nowa wartość = 0 0 0 0 1 0 1 1 1 1

3) Zastosuj regułę ping-pong, to znaczy dla dwóch buforów, w których trzymamy dane A i B i tworząc nowe wartości z jednego z nich odczytujemy dane, a wpisujemy do drugiego po to, żeby nie nadpisywać tych, z których mamy czerpać dane w danej iteracji. Potem zamieniamy A z B i tak w kółko.

 



 

Friday, April 15, 2022

Fale z wizualizacją 4D

​Przedstawiam kilka symulacji, które mogą pomóc zrozumieć podstawowe zjawiska z fizyki fal. To, co je wyróżnia (tak mi się przynajmniej wydaje ;) to, że są to symulacje trójwymiarowe z wizualizacją 4D (x,y,z i kolor dla amplitudy. Zjawiska o których mówię, to:


Fala w pudełku 3D z pojedynczego źródła



​Dyfrakcja fali na pojedynczej szczelinie



Dyfrakcja na podwójnej szczelinie + interferencja = eksperyment Younga (powstają prążki i tu je dobrze widać)


Ten projekt to wynik mojej pracy z shaderami obliczeniowymi. Jest to trójwymiarowa wersja różnic skonczonych, gdzie rozwiązywane jest równanie falowe. W sumie to nic trudnego, sam model jest dobrze opisany w mojej książce o symulacjach (Helion 2021). Najwięcej problemów sprawiła tu wizualizacja, bo nie jest łatwo wizualizować dane wolumetryczne. Porzuciłem jednak pomysł raymarchingu i wykonałem po prostu wizualizację na cząsteczkach z alpha-blendingiem. Nie jest idealnie, ale coś wreszcie widać.

Jeśli ktoś woli - można obejrzeć to samo ​w formie kompilacji z muzyką​.​

Zainteresowanych techniczną stroną programowania shaderów zapraszam do wysłuchania ​wykładu na ich temat​ - świeży, z tego tygodnia.

Tuesday, April 5, 2022

Open Frameworks (OpenGL): Mapping GPU data to CPU array in Compute Shaders

This sound small but takes me some time to find out.

My colleague asked me how to access (read or write) GPU buffer on the CPU side.

This is simple, you have to use mapping from OpenGL, so we basically do:

float *data = A.map<float>(GL_READ_ONLY);

// now you can read from data[] table on CPU side


This was trivial, what was not trivial (and I found it out from some examples as my program crashed all the time) - you have to.. unmap this as well after you use it, so you basically do:

    A.unmap();

done.

Soda Constructor (Revisited)