diff --git a/Treść zadań/cw7.html b/Treść zadań/cw7.html index 04fa15f..eaaf311 100644 --- a/Treść zadań/cw7.html +++ b/Treść zadań/cw7.html @@ -169,15 +169,22 @@
\[\frac{\partial v}{\partial t}=\Delta v.\]
W wersji dyskretnej będzie to:
\[\text{newV[i,j]} = \text{oldV}[i,j] + \Delta(\text{oldV},i,j).\]
-Należy dodać jeszcze jeden RWStructuredBuffer<float>
, w którym będziemy przechowywać poprzedni krok, nazwij go oldVegetation
. Obliczenia będziemy wykonywać na danych z niego i zapisywać w vegetation
. to pozwoli uniknąć problemów z synchronizacją bufora. Zaimplementuj powyższy wzór.
Należy dodać jeszcze jeden RWStructuredBuffer<float>
, w którym będziemy przechowywać poprzedni krok, nazwij go oldVegetation
. Obliczenia będziemy wykonywać na danych z niego i zapisywać w vegetation
. to pozwoli uniknąć problemów z synchronizacją bufora. Dodaj też zmienną dt
i zainicjalizuj ją atrybutem dt
. Zaimplementuj powyższy wzór.
Zainicjalizuj go po stronie C# analogicznie co bufor vegetation
. Zapisz go jako atrybut o nazwie . W initBufferValues
przypisz mu te same wartości co buforowi vegetation
.
Zaimplementuj funkcję swapBuffers
, w której zamień ze sobą bufory vegetation
i oldVegetation
i wywołaj dla nich ponownie computeShader.SetBuffer
. W doSimulationSteps
dodaj wywołanie swapBuffers
przed wywołaniem w pętli shadera.
Zaimplementuj model reakcji dyfuzji:
+dWater
i dVegetation
ustaw na 0.3
i 0.1
odpowiednio.W tej chwili trawa rośnie niezależnie od tekstury terenu i jego wysokości, powoduje to, że mamy trawę wyrastającą na drodze albo na szczycie góry. By zniwelować ten problem można uzależnić parametry feed
i kill
od terenu.
W tym celu stwórz dwa bufory typu float
o nazwie feedModifier
i killModifier
i rozmiarze sizeX*sizeY
. Następnie zapełnij je wartościami. Uzależnić killModifier
od rodzaju tekstury.
W tym celu stwórz dwa bufory typu float
o nazwie feedModifier
i killModifier
. Następnie zapełnij je wartościami. Uzależnij killModifier
od rodzaju tekstury. Pobierz wagi ze spaltmapy i jeżeli wartość śniegu będzie dodatnia ustaw killModifier
na 2, w przeciwnym wypadku na 1. Teren ma inną rozdzielczość niż splatmapa, uwzględnij to przy pobieraniu danych.
Po stronie shadera odczytaj wartość wartości feedModifier
i killModifier
dla danej współrzędnej i przemnóż je przez parametry feed
i kill
w równaniach.
Uzależnij feedModifier
od wysokości terenu. możesz do tego wykorzystać na przykład funkcję transition
napisaną wcześniej.
Uzależnij feedModifier
od wysokości terenu. możesz do tego wykorzystać na przykład funkcję transition
napisaną na poprzednich zajęciach .