1 DirectX Piel shader 1

Wielkość: px
Rozpocząć pokaz od strony:

Download "1 DirectX Piel shader 1"

Transkrypt

1 1 DirectX Piel shader 1 Nowa zabawka, jaką poznaliśmy jakiś czas temu, czyli vertex shader dał nam do ręki wspaniale możliwości jeśli chodzi o obróbkę wierzchołków przez nasza kartę i osiąganie wydumanych efektów dotyczących przekształcania geometrii czy świateł. Ale panom od konstruowania kart było mało, bo nie poprzestali na tym. Nie wystarczyło już to, ze mamy praktycznie kontrolę nad każdym przekształcanym wierzchołkiem - oni zapragnęli czegoś więcej - chcieli położyć łapę na każdy piksel na ekranie. Długo myśleli, a ponieważ w międzyczasie inżynierowie od krzemu także się nie obijali, więc dzisiaj mamy zupełnie nowy, niezwykle fascynujący temat do omówienia - czyli Pixel Shader! Ci, co uważnie czytał lekcje poświecone vertex shaderom wiedza jak działa taki wynalazek. Można go rozumieć i rozpatrywać niejako na dwa rożne sposoby. Pierwszy to taki, ze traktujemy nasz shader jako kawałek procesora, czy jakiś oddzielony blok funkcjonalny takowego, który dostając jakieś dane przekształca je w charakterystyczny dla siebie sposób używając dostępnych dla siebie rozkazów. Drugi sposób to taki, ze nie interesowaliśmy się tym kawałkiem sprzętu a patrzyliśmy na program i sposób w jaki podane mu dane przetwarzał. Widząc poszczególne rozkazy i sposób ich wykorzystania potrafiliśmy przewidzieć mniej więcej co program powinien robić. To, co odnosiło się do vertex shaderów oczywiście w mniejszym, lub większym stopniu będzie także adekwatne dla ich pikselowych odpowiedników. Różnice oczywiście będą - począwszy od konstrukcji fizycznej fragmentów układowych, poprzez potrzebne do działania shadera dane, rozkazy, kończąc na ilości przetwarzanych danych. Jak my, programiści będziemy patrzeć na piksel shadery? Otóż dla nas najważniejsze nie jest oczywiście badanie jak fizycznie działa układ, który realizuje instrukcje pixel shadera. Ponieważ my bardzo lubimy kombinować, wymyślać i tworzyć, więc skupimy się głównie na programowaniu. Będziemy więc patrzeć na shadery głównie przez pryzmat instrukcji, rejestrów wejściowych i tym podobnych rzeczy. Omówimy więc sobie jak wygląda niejako interfejs shadera - czyli jakie posiada rejestry wejściowe i wyjściowe oraz jakie są instrukcje, które pozwolą nam tymi danymi operować. Dowiemy się oczywiście jak napisać takiego shadera, jak skompilować (bo będzie to dla nas oczywiście program) no i w końcu jak tego wszystkiego użyć naszym programie, żeby zobaczyć na ekranie cos ładnego. Podobnie jak w przypadku vertex shaderów rozpatrzymy sobie naszego bohatera dzisiejszego z dwóch punktów widzenia. Po pierwsze - jego zasada działania jako układu, czyli rejestry wejścia, wyjścia, pamięci stałej i tym podobne. Co się dzieje ze zmiennymi, jak są one przetwarzane i tak dalej. Z drugiej spojrzymy sobie na shadera jako na program - dowiemy się jaka ma konstrukcje, jak go skompilować i co znaczą poszczególne instrukcje - wszystko odbędzie się podobnie jak w przypadku vertex shadera. Zanim zaczniemy jednak omawiać szczegóły konstrukcyjne i poszczególne elementy potrzebne w programowaniu shaderów należy wspomnieć o dosyć uciążliwej wadzie (zalecie?) pixel shaderów. Otóż chodzi o ich wersje. Oczywiście jak każda rzecz w komputerowym świecie tak i shadery się rozwijają, ale ponieważ grafika jest chyba jedną z najbardziej dynamicznych dziedzin w znacznym stopniu odbija się to na shaderach właśnie. Otóż nie dosyć, że różnych bajerów naszym bohaterom przybywa z każdą wersją, to jeszcze niektóre mechanizmy, sposób ich działania zupełnie się zmienia, co może doprowadzić do białej gorączki. Na początku więc od razu uczulam na małe zamieszanie z wersjami, o którym na pewno usłyszymy dzisiaj nie raz. Zacznijmy może od strony układowej i zobaczmy co tam w środku siedzi. Poniżej znajdujemy rysunek, przedstawiający w skrócie to, co będziemy dzisiaj analizować. I znowu największym kawałkiem naszego rysunku jest... ALU - czyli, jak zapewne wszyscy się znakomicie domyślają jakiś kawałek procesora. Nie inaczej i w tym przypadku - wszystko co trafi do pixel shadera poprzez rejestry wejściowe zostaje poddane obróbce i wypuszczone na zewnątrz. Ten element rysunku akurat powinien nas najmniej ciekawić, ponieważ zaglądać do niego nie będziemy a nas bardziej szczegółowo interesuje jego otoczenie. Procesor nie byłby procesorem, gdyby nie jeden z jego podstawowych elementów, jakim są rejestry. Przechowuje on w nich

2 2 DirectX Piel shader 1 wszystkie dane podczas jakichkolwiek operacji na danych, tam je przyjmuje i w nich umieszcza wyniki - analogiczna sytuacja ma oczywiście miejsce i u nas. Ponieważ nasz procesor jest procesorem graficznym, więc ma trochę pokręconą budowę w stosunku do znanych nam poprzedników. Ale na tym nie koniec, pixel shader okazuje się nader wrednym tworem i zrozumienie zasad działania, jakimi się rządzi przyprawi nas zapewne o mały ból głowy. Jeśli przypomnieć sobie budowę vertex shadera i pomyśleć o niej cieplej to jeszcze da się ją zrozumieć. Natomiast z rysunku powyżej wynika coś dziwnego. Otóż pixel shader nie ma jednego ale jakby dwa jednoczesne potoki przetwarzania danych - są one nazywane potokami równoległymi. Lewa strona tego rysunku odpowiada za tzw. kanał danych wektorowych - tutaj są wpuszczane dane dotyczące kolorów a dokładniej mówiąc składowe RGB. Prawy kanał tak naprawdę operuje tylko na jednej danej - kanale alfa koloru, czyli umożliwia nam mieszanie z przezroczystością. Żeby ułatwić sobie nieco operowanie tymi nazwami przyjęło się nazywać lewy kanał kanałem koloru a prawy kanałem alfa. Jak widzimy, na samym początku mamy wspólny blok, który służy do skopiowania danych z wejścia. Dzieje się tak, ponieważ na przykład wszystkie modyfikatory, o których się na pewno dowiemy będą operowały na kopiach danych a nie na oryginalnej zawartości rejestrów wejściowych, żeby za dużo nie namieszać na scenie. Następnie następuje modyfikowanie skopiowanych danych wejściowych. Co i jak dokładnie wyjaśni nam się na pewno przy opisie modyfikatorów. Jak wiemy modyfikacje są już dokonywane na danych skopiowanych, w rejestrach wejściowych pozostały dane nie zmienione. I tutaj każdy kanał już operuje sobie swoimi danymi, w zależności od instrukcji i modyfikatora. Następnie zostaje wykonana jakaś instrukcja a następnie, jeśli jest to potrzebne jeszcze wynik może zostać także zmodyfikowany. Żeby jeszcze weselej było na sam koniec możemy dokonać tzw. maskowania składowych, czyli jeśli sobie zażyczymy, że tylko niektóre ze składowych koloru nas interesują to tylko takie sobie weźmiemy. Zresztą na pewno jeszcze powiemy sobie o tym przy omawianiu wszelkiej maści identyfikatorów. Po przejściu przez wszystkie fazy obróbki nasz kolor ze sceny zostaje umieszczony w rejestrze wyjściowym i tak naprawdę zamiast oryginalnego koloru bryły jaki powinien być w danym miejscu zostaje na nią nałożone to, co powstało po przepuszczeniu tego przez pixel shader. Zasada więc bardzo podobna do działania vertex shadera tylko tutaj działanie nie na wierzchołkach ale pikselach malowanych na ścianach bryły a dodatkowo mamy rozdział na kolor i jego przezroczystość - to tak, aby nam się lepiej i wygodniej manipulowało wszystkimi danymi. Kolejna sprawa o której musimy sobie koniecznie powiedzieć jest mechanizm adresowania tekstur przy korzystaniu z shadera. Najprościej mówiąc jest to mechanizm, który będzie umożliwiał pobieranie z tekstur nakładanych na daną bryłę odpowiednich danych o kolorach bazując na przychodzących do shadera współrzędnych mapowania tekstur. Zazwyczaj współrzędne mapowania tekstury będą dostarczane do shadera jako część formatu wierzchołka (odpowiednie pola) lub mogą być określane na podstawie tego, z jakiego rodzaju tekstura mamy tak naprawdę do czynienia (możemy mieć przecież tekstury do efektów specjalnych, jak dla przykładu mapy środowiska). Po raz pierwszy w tym miejscu dają boleśnie też o sobie znać różnice w budowach poszczególnych wersji shaderów, o których wspominałem powyżej. Ponieważ w naszym artykule skupimy się na wersjach od 1.0 do 1.4 więc w takim zakresie będziemy sobie omawiali wszystkie zmiany. Zaczniemy właśnie od mechanizmu adresowania tekstur. Ale zanim zaczniemy musimy sobie jeszcze powiedzieć o jednym ważnym terminie, jaki będzie nam potrzebny przy omawianiu mechanizmu adresowania tekstur. Jest nim Samplowanie tekstury. Niektórym nazwa może się kojarzyć (niekoniecznie poprawnie), ale dla porządku:

3 3 DirectX Piel shader 1 Samplowaniem będziemy nazywać pobieranie odpowiednich danych o kolorze z tekstury, ale opierając się na czterech ważnych informacjach: instrukcji adresowania użytej w pixel shaderze, współrzędnych mapowania, aktualnie ustawionej teksturze na danym poziomie tekstury, różnych atrybutów obróbki tekstury ustawionych dla danego poziomu. Jasno z tego więc wynika, że aby mieć możliwość samplowania tekstury musi ona być przypisana do jakiegoś konkretnego poziomu tekstury, z którego możemy pobrać dodatkowe informacje o sposobie przedstawiania tekstury na bryle. Inaczej samplowanie możemy nazywać na przykład przeszukiwaniem tekstury. Przypatrzmy się temu rysunkowi powyżej. Pokazuje on drogę, jaką mogą przebyć współrzędne mapowania w shaderach od wersji od 1.0 do 1.3, zanim zostaną użyte do uzyskania koloru tekstury aplikowanej naszej bryle. Jak widać, dróg tych jest kilka a każda z nich charakteryzuje się inną specyfiką: (kolor czerwony) W takim przypadku rejestry tekstury są ładowane bezpośrednio współrzędnymi mapowania a shader posługując się nimi pobiera z określonego miejsca na teksturze odpowiedni kolor bez żadnych dodatkowych obliczeń. (kolor niebieski) Współrzędne mapowania są przekazywane do tzw. samplera tekstury, który bazując na kilku wspomnianych przeze mnie wyżej danych pobierze odpowiedni kolor z tekstury i umieści jego wartości w rejestrach tekstury. Tekstura oczywiście będzie ustawiona na jakimś konkretnym poziomie i dane o samplingu są pobierane z tegoż poziomu. Numer współrzędnych mapowania (wierzchołek ma ich aż osiem par, podobnie jest z ilością dostępnych poziomów tekstur) zawsze koresponduje z numerem docelowego rejestru zastosowanego w instrukcji shadera. Pewne instrukcje adresowe tekstur w konkretnych wersjach pixel shadera przeprowadzają różne transformacje na wejściowych współrzędnych teksturowania aby stworzyć nowe współrzędne. Następnie mogą one być użyte do samplowania tekstury (kolor zielony) lub być bezpośrednio przekazywane jako dane dla rejestrów tekstury (kolor żółty). O tym, jakie są to instrukcje i co dokładnie one robią z tymi współrzędnymi możecie się dowiedzieć czytając dokumentację w DX SDK. Jeśli będzie taka możliwość na pewno sobie o tym powiemy... Dla wersji 1.4 rejestry tekstur maja trochę inne znaczenie niż w poprzednich wersjach. Zawierają one współrzędne tekstury więc mamy tutaj niejako podobieństwo do sposobu oznaczonego w poprzednich wersjach kolorem czerwonym. Są to rejestry tylko do odczytu (używane jako rejestry wejściowe dla instrukcji adresowych) i nie można na nich przeprowadzać operacji arytmetycznych. Fakt, że posiadamy współrzędne tekstury w rejestrach oznacza tylko tyle, że teraz zbiór współrzędnych mapowania i numer poziomu tekstury wcale nie musza się zgadzać dla wersji 1.4 pixel shadera. Numer poziomu, z którego dokonywane jest samplowanie tekstury określany jest przez docelowy numer rejestru, ale zbiór współrzędnych tekstury jest określany przez nowy rejestr wejściowy t#. Bloczek z rysunku powyżej nazwany "zmiana współrzędnych" nie jest obecny w shaderze w wersji 1.4, ponieważ modyfikacja współrzędnych tekstury przed samplowaniem tekstury jest osiągana w prosty sposób przez użycie arytmetycznych instrukcji poprzedzonych tzw. zależnym odczytem. Często bowiem zdarza się, że pożytecznie jest wykonać jakieś operacje na współrzędnych mapowania przed samplowaniem tekstury - jest to właśnie ten zależny odczyt. Termin "zależny" oznacza ni mniej ni więcej, że dane tekstury, które dostaniemy w wyniku samplowania będą zależeć od pewnych operacji, które dokonamy wcześniej w pixel shaderze. Dla wersji shadera odczyt zależny także jest możliwy, ale jest bardzo ograniczony i sprowadza się tylko do zastosowania instrukcji adresowej używającej jako parametru wejściowego rezultatu poprzednio zastosowanej instrukcji adresowej. Dla wersji 1.4 shadera odczyt zależny ma o wiele większe możliwości, ponieważ współrzędne mapowania mogę pochodzić nie tylko z poprzedniej instrukcji adresowej, ale także z prawie dowolnej instrukcji arytmetycznej - tak, że tutaj można naprawdę sporo namieszać. O szczegółach takiego zależnego odczytu możecie dowiedzieć się także trochę więcej z dokumentacji.

4 4 DirectX Piel shader 1 Zanim przystąpimy do omawiania rejestrów, instrukcji i modyfikatorów jeszcze parę słów: O problemie ograniczeń w ilości zastosowanych w programie shadera instrukcji wiemy już z opisu vertex shaders. Musimy uważać, aby nie przekroczyć pewnej ustalonej ilości instrukcji przypadających na jeden program, bo inaczej po prostu niewiele nadziałamy. Dla pixel shaders "policzalnymi" instrukcjami są tylko instrukcje arytmetyczne i adresowe, nie liczą się instrukcje definicji, wersji i fazy - dobrze jest o tym pamiętać. Dodatkowo, żeby "umilić" nam fakt nudnego pisania shaderów konstruktorzy postarali się o to, żeby w każdej wersji były jakieś wyjątki i w jednej na przykład instrukcja się nie liczy, choć należy do tych "policzalnych", w niektórych liczy się jako jedna, w niektórych jako dwie itd... szczegóły w dokumentacji - ale zabawa naprawdę przednia w zapamiętywanie ;)) a i okazja do poćwiczenia pamięci nie najgorsza. Jeśli chodzi o sam program to należy od razu przyjąć do wiadomości, że zostaliśmy zobligowani do ścisłego przestrzegania pewnego harmonogramu pisania i jeśli nie będziemy się trzymać tego, to program na po prostu nie odpali. Oczywiście nie obędzie się bez zamieszania z wersjami, więc żeby nie przedłużać: Dla wersji od 1.0 do 1.3 program powinien wyglądać następująco: instrukcja wersji, instrukcje definicji stałych, instrukcje adresowe tekstur, instrukcje arytmetyczne. Pixel shader w wersji 1.4 dokłada nową cegiełkę i daje możliwość stosowanie instrukcji fazy, która umożliwia w prosty sposób zwiększenie limitu możliwych do wykorzystania instrukcji arytmetycznych i adresowania, jeśli przestaniemy się mieścić w naszych zapędach. Program zatem będzie mógł mieć dwie fazy, z których każda może posiadać sześć instrukcji adresowych a zaraz po nich osiem instrukcji arytmetycznych. Program więc zatem wyglądał będzie następująco: instrukcja wersji, instrukcje definicji stałych, instrukcje adresowe tekstur (6), instrukcje arytmetyczne (8), instrukcja fazy, instrukcje adresowe tekstur (6), instrukcje arytmetyczne (8), Zastosowanie instrukcji ma także swój efekt uboczny, w postaci nie ustawionego elementu kanału alfa przy przejściu do nowej fazy w rejestrach tymczasowych. Więcej o problemie w opisie instrukcji fazy w DX SDK. Wiemy już, jak zbudowany jest pixel shader jeśli chodzi o kanały, którymi płyną dane. Wiemy, że są niejako dwa niezależne od siebie - jeden dla składowych kolorów a drugi dla składowych alfa koloru. Pociąga to za sobą dosyć kuszącą perspektywę możliwości wykonywania dwóch niezależnych instrukcji arytmetycznych na obu kanałach jednocześnie - są one przecież od siebie niezależne! Taką możliwość będziemy nazywali parowaniem instrukcji a robienie tego będzie zupełnie banalne. Wyobraźmy sobie, dwie, na razie zupełnie hipotetyczne instrukcje: mul r0.rgb, t0, v0 oraz add r1.a, r1, c2 Jedna z nich przedstawia operację na kanale koloru a druga na kanale alfa - na razie musimy przyjąć to na wiarę, ale bardziej spostrzegawczy na pewno się domyślają dlaczego. Parowanie instrukcji to nic innego tylko proste dodanie ich w kodzie shadera: mul r0.rgb, t0, v0 + add r1.a, r1, c2 Po prostu przed następną instrukcją dodajemy znaczek plus i gotowe. Główną rolę w takim łączeniu ogrywał będzie modyfikator selekcji kanałów, ale o nim dowiemy się znacznie później. Ale sama możliwość parowania instrukcji przedstawia się nader interesująco i maniacy optymalizacji już mogą zacierać ręce. Ostatnią rzeczą, o której sobie powiemy przed przystąpieniem do omawiania rejestrów i całej reszty będzie kolejność wykonywania operacji. Otóż instrukcje shadera mogą być modyfikowane przez tzw. modyfikatory, których jest całe mnóstwo. O rodzajach wszystkich i ich działaniu oczywiście powiemy sobie nieco dokładniej, ale dla naszych programów znaczenie będzie miała kolejność ich wykonywania na naszych instrukcjach. Rezultat instrukcji zależy właśnie od kolejności w jakiej modyfikatory zostaną zaaplikowane wynikowi lub wartości wejściowej instrukcji. I tak w kolejności wykonywane są od najważniejszych: selektory rejestrów wejściowych oraz modyfikatory rejestrów wejściowych,

5 5 DirectX Piel shader 1 instrukcje, modyfikatory instrukcji, selektory rejestrów wyjściowych (docelowych). Hm... wiemy zatem już co nieco o budowie samego pixel shadera, wiemy jak posługiwać się teksturami oraz jak ma wyglądać program, nie obeszło się także bez paru sztuczek. Czas więc przystąpić do tego, na co czekamy już od bardzo dawna - czyli zagłębimy się w morze rejestrów, instrukcji,modyfikatorów i selektorów. Oczywiście nie omówimy wszystkich dokładnie, bo chyba artykuł by się wam nie załadował do przeglądarki ;). Powiemy pokrótce co, jak i na co a szczegóły jak przyjdzie pora znajdziecie i co najważniejsze zrozumiecie bez problemu. Do dzieła więc! Rejestry. Zacznijmy może od podobieństw pomiędzy vertex a pixel shaderem a są nimi rejestry pamięci stałej, ale niestety - na samej nazwie podobieństwa te się kończą. Pierwsza sprawa to ich ilość - tutaj mamy takich rejestrów tylko 8. Jak będziemy mieli okazje się przekonać później, w testowych programach ta ilość powinna nam zupełnie do szczęścia wystarczyć - operacji na teksturach znowu nie będzie tak wiele a efekty będą głównie zależeć od naszej wyobraźni ;). No ale wracając do sprawy - rejestry pamięci stałej służą do tego, aby przechować w nich jakieś potrzebne nam dane. Na przykład jeśli zapragniemy przekazać do shadera jakieś stale liczbowe, które maja nam pomoc w osiągnięciu kosmicznego, nowego efektu, do tego celu mogą nam posłużyć właśnie rejestry pamięci stałej. Po prostu umieszczamy w nich kolejne liczby, których będziemy używać i voila. Jeden rejestr pamięci stałej może przechowywać jedna liczbę z zakresu od -1 do 1. Ma on tez inne ograniczenia, ale w tej chwili są one dla nas mniej istotne i może o nich kiedy indziej. Rejestry pamięci stałej będziemy oznaczać w programach shaderów literą c# (od constant zapewne) i kolejnym numerem rejestru, poczynając od 0 a kończąc na 7. Czy dane nam będzie wykorzystać zawsze wszystkie osiem, zobaczymy. Następnym zestawem rejestrów wejściowych są znane nam także z vertex shaderów rejestry tymczasowe, służące do przechowywania wartości tymczasowych podczas przeprowadzania obliczeń. Jeden taki rejestr zawiera cztery liczby typu float a ilość takich rejestrów waha się od dwóch do sześciu, w zależności od obsługiwanej przez nasza kartę wersji pixel shaders. Rejestry tymczasowe będziemy oczywiście oznaczać analogicznie do vertex shaderów literami r# i kolejnym numerem, poczynając od rejestru pierwszego, czyli 0. Należy w tym miejscu dodatkowo zaznaczyć, że w przypadku pixel shader rejestr r0 służy także jako wyjście pixel shadera, czyli w nim są umieszczane wartości końcowe obliczonych wartości poszczególnych pikseli. Na tych typach rejestrów podobieństwa pomiędzy pikselami a wierzchołkami się kończą. Bądź co bądź jedno z drugim ma niewiele wspólnego, jeśli chodzi o dane go opisujące, więc nie obędzie się tez to oczywiście bez wpływu na pixel shader. Bez wątpienia podstawowe znaczenie dla działania pixel shadera będą miały dwa ważne czynniki decydujące o wyglądzie pikseli na scenie - kolor wierzchołków i tekstury nałożone na wielokąty. Dzięki shaderowi będziemy mieli do dyspozycji narzędzie, które pozwoli wpływać nam na jedno i drugie w taki sposób, dzięki któremu uzyskamy naprawdę fascynujące efekty i pełną kontrolę nad tym, co się dzieje z pikselami na ekranie. Ale żeby wiedzieć jak, dowiedzmy się najpierw o pozostałych rejestrach. Rejestry tekstury - są odpowiedzialne za przechowywanie danych tekstur. Dokładniej mówiąc będą ładowane współrzędnymi teksturowania które następnie będą używane do pobrania z określonego miejsca określonego koloru naszej mapy lub kolorami pochodzącymi z samplowania tekstury. Jak wspomniałem przy omawianiu mechanizmu adresowania, dane są pobierane z tekstury skojarzonej z odpowiednim poziomem teksturowania. Wiemy, że zarówno poziomów tekstur jak i zestawów współrzędnych mapowania w wierzchołku możemy mieć aż osiem. W przypadku rejestrów tekstur mamy znowu doczynienia z zamieszaniem wśród wersji. W dokumentacji do SDK znajdziemy informacje, że dla wersji od 1.1 do 1.3 pierwszy zestaw współrzędnych tekstury w strukturze wierzchołka jest powiązany z pierwszym poziomem tekstury (o numerze 0). Oznacza to, że tym przypadku istnieje tzw. relacja jeden do jeden jeśli chodzi o poziomy tekstur i kolejność deklarowania zestawów współrzędnych. Po prostu pierwszemu zadeklerarowanemu zestawowi współrzędnych odpowiada poziom pierwszy, drugiemu drugi itd. W przypadku wersji shadera 1.4 takiej zależności już nie ma i kolejność deklaracji zestawów współrzędnych nie determinuje do którego poziomu odnoszą się dane współrzędne tekstury używane przez shader do pobrania sobie koloru - poziom ten można ustawić. W zależności od wersji także zachowanie rejestrów jest różne - dla wersji 1.0 pixel shadera rejestry tekstur są tylko do odczytu, od 1.1 do 1.3 można je traktować tak samo jak rejestry tymczasowe dla działań arytmetycznych, natomiast w wersji 1.4 rejestry te zawierają współrzędne teksturowania ale można ich używać również jako źródłowych rejestrów dla operacji służących adresowaniu tekstur - co do czego jest używane na pewno wyjdzie w przykładowych programach. Na razie musimy wiedzieć tylko tyle, że w rejestrze tym znajdziemy współrzędne tekstury lub jej dane (kolor). Rejestry tekstury w programach będziemy oznaczali literka t# i kolejnym numerem poczynając od 0. Oczywiście w najnowszych wersjach shaderów ilości będą się zmieniać zdecydowanie na korzyść (czyt. ilość), ale co i ile to dokładnie w dokumentacji. Rejestry koloru - jak sama nazwa wskazuje są używane do przechowywania danych o kolorach pikseli. Dane takie są pobierane ze struktury wierzchołka (jeśli on takowe zawiera, bo jeśli ich nie ma to trudno zgadywać co tam ma być. Używa się ich głównie kiedy mamy zamiar zrobić jakiś efekt z udziałem koloru wierzchołków (np. zmieszać go z kolorem tekstury,

6 6 DirectX Piel shader 1 albo pozmieniać go zgodnie z naszym widzimisie. W rejestrze tym przechowujemy kolory jako liczby float (cztery, dla każdej składowej). I ponownie w tym przypadku mamy zamieszanie jeśli chodzi o wersje shadera. Chodzi o wersję 1.4, w której konstruktorzy uparli się, że rejestry koloru są dostępne dopiero w drugiej fazie. Z ważniejszych rzeczy należy dodać jeszcze, że pixel shader ma dostęp do rejestrów koloru tylko do odczytu, nie można zawartości tych rejestrów zmieniać bezpośrednio. Zawartość tych rejestrów jest ustalana na podstawie przeglądania danych wierzchołków, ale jest to robione z o wiele mniejsza precyzja niż przeglądanie danych tekstury - zapewne dlatego, że przeważnie kolory wierzchołków nie zmieniają się gwałtownie na przekroju całej bryły. Dane wejściowe dla rejestrów koloru są skalowane do przedziału od 0 do 1, ponieważ taki zakres jest poprawny dla działania pixel shadera jeśli chodzi o kwestie kolorów - o tym musimy pamiętać przy operacjach w programie shadera. Znana nam z vertex shadera literka v# i kolejne numery są odpowiedzialne za przechowywanie wartości kolorów - czyli tak właśnie będziemy oznaczać rejestry koloru. Przyjęte jest w zwyczaju, że do rejestru v0 wczytuje się wartość diffuse ze struktury wierzchołka a do v1 wartość specular. My lubimy od razu nabierać dobrych przyzwyczajeń, więc o tym pamiętajmy już od teraz, bo zapewne spotkamy wiele przykładowych programów, które właśnie tak będą działać. Ograniczenia wejścia. Wiemy, że rejestry służą jednostce ALU shadera do pobierania i udostępniania danych - czyli ogólnie mówiąc do wymiany z resztą całego elektronicznego śmiecia na zewnątrz shadera. Wydawać by się mogło, że mamy tutaj pewną dowolność, tak jednak niestety nie jest. Otóż każdy typ rejestrów ma ściśle określone przeznaczenie i z tym są powiązane pewne restrykcje jeśli chodzi o użycie ich w poszczególnych instrukcjach. Wielu z rejestrów nie wolno używać w instrukcjach danego typu, w wielu występują ograniczenia jeśli chodzi o ich ilość w jednej instrukcji. W dokumentacji SDK jest tabelka, która obrazuje dokładnie co i jak. Przy pisaniu shadera należy więc mieć tę tabelkę zawsze pod ręką i pamiętać o tych rzeczach... inaczej będzie nam się waliło przy kompilacji i długo będziemy szukać co jest grane. Należy także pamiętać, że ograniczenia w ilości rejestrów wejściowych nie wpływają w żaden sposób na rejestry wyjściowe - liczby nie są ze sobą w żaden sposób powiązane. Zresztą - rejestr wyjściowy przeważnie jest tylko jeden, więc wielkiego problemu tutaj nie ma. Odczyt/Zapis. Nie może się oczywiście obejść także bez obostrzeń typu "tylko do odczytu". Modyfikacje pewnych rejestrów wejściowych dla przykładu podczas pisania shadera mogłyby destabilizować jego pracę, postanowiono więc, że możliwość modyfikacji części z nich zostanie zablokowana, co usprawni pracę shadera (choć nie wiadomo czy nam także ;). Oczywiście rejestry "tylko do odczytu" mogą być użyte tylko jako rejestry wejściowe, ponieważ nie da się im zmienić wartości podczas działania programu, ale to jest chyba oczywiste. Oczywiście i tutaj nie może się obejść bez zamieszania z wersjami, ale tabelka dostępna w SDK powinna wyjaśnić wam wszystko. Proponuje sobie dwie powyższe tabele wydrukować, powiększyć i powiesić dla przykładu na ścianie nad monitorem... po tysiącu shaderów żadne ściągi nie będą wam już oczywiście potrzebne, ale na początku warto mieć zawsze pod ręką ;). W dokumentacji znajdujemy jeszcze dwie ważne uwagi co do typów odczytu: dla wersji 1.0 rejestry tekstur maja możliwość zapisu i odczytu przy instrukcjach adresowania tekstur, ale są tylko do odczytu dla instrukcji arytmetycznych. Dla wersji 1.4 rejestry tekstur są tylko do odczytu jeśli chodzi o instrukcje adresowania tekstur oraz należy zapamiętać, że nie można z nich ani czytać a tym bardziej do nich zapisywać korzystając z instrukcji arytmetycznych. Zakresy. Rejestry jak wiadomo powszechnie są miejscem przechowywania pewnych wartości liczbowych. Ponieważ większości rejestry kojarzą się z takimi znanymi nam z procesorów jako układów tutaj musimy zwrócić uwagę na pewną, ważną rzecz. Otóż rejestry shadera przypominają te powyższe tylko z nazwy - wprawdzie maja one określoną pojemność jeśli chodzi o ilość bitów przypadających na wartość przechowywaną w rejestrze, ale bity te nie zawsze będą określały to samo. Tabela dostępna w SDK ma za zadanie uzmysłowić użytkownikom jakimi wartościami powinny być ładowane poszczególne rejestry pixel shadera aby działał on zgodnie ze swoim przeznaczeniem i umożliwiał otrzymanie oczekiwanych wyników. Jak widać w tabelce cześć takich wartości rożni się oczywiście w zależności od wersji (jakże mogłoby być inaczej :), a cześć z nich możemy odczytać bezpośrednio z właściwości karty. Należy także zaznaczyć, że wczesne karty mające możliwości przetwarzania pixel shaders w trybie hardware używały specyficznego, ograniczonego trybu (jeśli chodzi o precyzję) przechowywania części wartości ułamkowych (na ośmiu bitach tylko), więc należy niekiedy to mieć na uwadze przy projektowaniu shadera. Na tym zakończylibyśmy opis ważnej niewątpliwie części shadera jaką są rejestry. A skoro już mamy jak przekazywać i odbierać dane więc podczas ich przepływu przez pixel shader możemy zacząć cos z nimi robić, czyli zacząć je przekształcać. Zanim jednak do tego przystąpimy musimy poznać dwie kolejne, ważne sprawy - czyli instrukcje i modyfikatory. Zaczniemy może od instrukcji, ponieważ z takimi mieliśmy już do czynienia przy omawianiu vertex shadera. Instrukcje.

7 7 DirectX Piel shader 1 Instrukcje możemy podzielić w przypadku pixel shaders na kilka rodzajów, w zależności od rodzaju operacji, jakie będą one przeprowadzać. Żeby było śmieszniej w zależności od wersji shadera będziemy mieli rożne typy tych instrukcji - zamieszania będzie co niemiara, ale miejmy nadzieje, że jakoś to wszystko obejmiemy. Oczywiście nie będę tutaj omawiał każdej instrukcji z osobna na poziomie typów argumentów i jakie rejestry ona może odczytywać i modyfikować - to znajdziecie w dokumentacji. Ale nakreślimy ogólnie, po co, gdzie i jak. Typy instrukcji: Ogólnie biorąc instrukcje możemy podzielić na: Instrukcja wersji (znamy ją już z vertex shadera), która definiuje wersję shadera. Musi być ona analogicznie jak w przypadku vertex shadera pierwszą instrukcja w programie i wystąpić może tylko raz na samym początku - określa ona według reguł której wersji sprawdzany będzie kod shadera. Instrukcje definiujące stale w programie shadera. Instrukcje te musza wystąpić po instrukcji wersji ale przed wszystkimi instrukcjami arytmetycznymi czy adresowymi. Tak zwane instrukcje fazy. Powodują one rozbicie kodu shadera na dwie fazy (tylko w wersji 1.4). Każda z takich faz ma swoja liczbę instrukcji arytmetycznych i adresowych i jest ona ograniczona. Instrukcje arytmetyczne - najbliższe naszemu sercu. Zawierają oczywiście zwykłe operacje matematyczne jak dodawanie, odejmowanie czy mnożenie, ale także bardziej specyficzne jak na przykład obliczanie iloczynu skalarnego wektorów - jednym słowem wszystko co potrzebne w obliczeniach grafiki 3D. Instrukcje adresowania - nazwa może trochę tajemnicza ale instrukcje te służą do manipulacji współrzędnymi teksturowania, które są powiązane z określonym poziomem tekstur. Drugą sprawą występującą niejako przy okazji są tak zwane modyfikatory. Służą one jak sama nazwa wskazuje modyfikacji - ktoś zapyta "modyfikacji czego?". W dokumentacji mamy napisane, że instrukcji oraz rejestrów wejściowych i wyjściowych. Oczywiście zamieszania mamy ciąg dalszy, ponieważ wersja 1.4 shadera umożliwia dodatkowo modyfikacje rejestrów tekstur - są to tak zwane modyfikatory rejestrów tekstur. Ale o nich dalej. Modyfikatory instrukcji - służą do zmiany sposobu działania instrukcji a dokładniej mówiąc do zmiany wartości wyjściowej po jej zadziałaniu. Po zaaplikowaniu takiego modyfikatora a nie wiedząc dokładnie jak on działa możemy się nieźle zdziwić obserwując wartości wyjściowe shadera - tutaj więc potrzebna jest szczególna rozwaga przy używaniu takich wynalazków. Modyfikacja instrukcji polega na tym, że instrukcja najpierw oblicza wartość wyjściową, ale przed zapisaniem jej do rejestru wyjściowego jest modyfikowana przez zaaplikowany modyfikator. Mogą one być używane tylko do instrukcji arytmetycznych - używanie ich na rejestrach tekstur nie jest możliwe. A jak zaaplikować modyfikator do instrukcji? Nic bardziej prostszego - po prostu po nazwie instrukcji należy dopisać przyrostek definiujący dany modyfikator. W tabeli w SDK znajdziecie oczywiście listę wszystkich modyfikatorów arytmetycznych dostępnych łącznie z wersja shadera. Najfajniejszą jednak z tego wszystkiego rzeczą jest możliwość łączenia modyfikatorów! Otóż wystarczy po instrukcji dołączać kolejne modyfikatory na tej samej zasadzie do instrukcji a ona będzie modyfikowana przez kolejne z nich. Jak przykład rozpatrzmy następującą instrukcje: add_x2_sat dest, src0, src1 add to instrukcja dodania do siebie dwóch wartości z rejestrów wejściowych src0 i src1. W wyniku przeprowadzonej operacji rezultat dodawania powinien się znaleźć w rejestrze dest, jednak nie stanie się to tak od razu. Popatrzmy dokładniej co mamy za instrukcje - nie jest to przecież add bo ten stwór wygląda tak: add_x2_sat. To jest właśnie bajer ze składaniem modyfikatorów - aplikujemy instrukcji add kilka pod rząd, tak że rezultat zostanie mocno przekształcony. Najpierw widzimy cos takiego jak _x2 - jak przeczytacie sobie w dokumentacji dokładnie to dowiecie się, że jest to po prostu pomnożenie przez liczbę 2. Następnie widzimy _sat - czyli jak wynika z dokumentacji obcięcie wyniku do przedziału od 0.0 do 1.0. Kolejność działań takich modyfikatorów jest taka, jak w zapisie instrukcji - czyli najpierw wyliczenie sumy argumentów, potem pomnożenie wyniku przez dwa a na koniec obcięcie tego do przedziału Mam nadzieje, że nie jest to zbyt skomplikowane? Modyfikatory rejestrów wejściowych - jak sama nazwa wskazuje. Są to modyfikatory, które powodują zmianę wartości odczytanej z rejestru wejściowego przed przekazaniem jej do instrukcji. Jednocześnie zawartość samego rejestru pozostaje niezmieniona. Jak widać takie modyfikatory mogą się przydać na przykład do przygotowania danych w rejestrach wejściowych przed wykonaniem określonej instrukcji - jeśli dane nie spełniają jakiegoś warunku a instrukcja tego wymaga to można takim danych aplikować modyfikator i po krzyku. Podobnie jak w przypadku modyfikatorów instrukcji nie mogą te modyfikatory być używane w innych instrukcjach niż arytmetyczne - jedynym wyjątkiem od tej reguły jest modyfikator o nazwie "signed scale". Po szczegóły odeślę was może do dokumentacji, ponieważ szczegółowe opisywanie wszystkich instrukcji zajęłoby nam zbyt dużo czasu a nie jest ono nam do szczęścia koniecznie potrzebne. W przypadku tych modyfikatorów istnieje także kilka ograniczeń, które trzeba wziąć konieczne pod uwagę: Modyfikator negacji nie może być użyty w połączeniu z modyfikatorem odwracania a w przypadku kombinacji z innymi modyfikatorami jest wykonywany na końcu,

8 8 DirectX Piel shader 1 Modyfikator odwracania nie może być łączony z innymi, Modyfikatory mogą być łączone z selektorami (co to już za moment), Modyfikatory rejestrów źródłowych nie powinny być używane dla rejestrów pamięci stałej, ponieważ może to spowodować nieokreślone ich zachowanie. Dla wersji 1.4 wywołanie modyfikatora na rejestrze stałym spowoduje błąd już podczas sprawdzania shadera. Selektory rejestrów wejściowych - ten typ modyfikatorów służy do wstawiania wartości z jednego kanału do innych. Cóż to znaczy? Jak mieliśmy okazje się już dowiedzieć rejestry pixel shadera przechowują przeważnie cztery liczby float. Każdą z tych liczb możemy sobie wyobrazić, że trzymana jest tak jakby w oddzielnym kawałku tego shadera - nazwijmy go sobie dla naszych rozważań właśnie kanałem. Jeśli na przykład wyobrazimy sobie rejestr koloru to mam on cztery kanały a w każdym przetrzymuje jedną składową koloru jako liczbę float. Jak działają takie selektory? Otóż nic bardziej banalnego - po prostu jeśli wywołamy określony selektor (dla określonego kanału) to jego zawartość zostanie przepisana do innych kanałów tego rejestru, dla którego został wywołany. Możemy więc do wszystkich kanałów przepisać zawartość kanału zawierającego składową r, g, b czy alfa. Należy sobie w tym miejscu zapamiętać, że selektor jest aplikowany danemu rejestrowi przed modyfikatorem rejestru wejściowego co z kolei implikuje także pierwszeństwo przed instrukcją. Selektor aplikuje się bardzo prosto - wystarczy do nazwy rejestru po kropce dodać odpowiednia literkę. Zestawów takich literek może być dwa - albo rgba (żeby się kojarzyło z kolorem) albo xyzw - zestawy te są zamienne i powodują takie samo działanie. Kiedy shader spotyka selektor w swoim kodzie podczas odczytu rejestru źródłowego zamiast odczytanych wartości z każdego kanału do instrukcji trafiają pozmieniane wartości - w każdy kanale jest to samo - zawartość samego rejestru wejściowego się nie zmienia - modyfikatory po prostu w tym przypadku modyfikują wartości już odczytane. Przypatrzmy się przykładowemu modyfikatorowi rejestru wejściowego: mul r0, r0, r1.r Rejestrami wejściowymi w tym przypadku są r0 i r1. Jak widać w przypadku r1 stosujemy na nim modyfikator, który spowoduje, że wartości w kanale r (czerwonym) zostaną powielone na wszystkie inne kanały tego rejestru, ale stanie się to po jego odczytaniu, czyli tak naprawdę rejestr r1 pozostanie niezmieniony. Za to do instrukcji mnożenia trafi przekształcona wartość z rejestru r1. Maska zapisu rejestrów wyjściowych - brzmi skomplikowanie, ale nie jest takie w istocie. Podczas wykonywania większości instrukcji pixel shadera dane są umieszczane w jakimś rejestrze wyjściowym. Jak wiemy większość z tych, mogących zostać zapisanych przez instrukcje jest zbudowana z czterech kanałów. Ten typ modyfikatora pozwala na kontrolę, które kanały w rejestrze wyjściowym instrukcji będą mogły być zapisane a które pozostaną nie zmienione. Format tego modyfikatora może być łatwy do odgadnięcia. Otóż, aby oznaczyć które kanały mogą być zapisane a które nie, wystarczy po nazwie rejestru wyjściowego dać kropkę i wpisać symboliczne oznaczenia kanałów. Tymi oznaczeniami są r, g, b, a (lub analogicznie do modyfikatora poprzedniego x, y, z, w. Nie obyło się tutaj oczywiście bez burzy jeśli chodzi o wersje shaderów. Dla shaderów z przedziału 1.0 do 1.3 mamy niestety dosyć ubogie możliwości jak widać z tabelki dostępnej w dokumentacji jeśli chodzi o maskowanie i możemy sobie tylko zablokować niejako zapis kanału odpowiedzialnego za wartość alfa (modyfikator.rgb). Natomiast w wersji 1.4 możemy stosować już dowolne kombinacje poszczególnych kanałów, z tym że istnieje tutaj pewne ograniczenie co do pisania kodu. Poszczególne pola musza być podane w kolejności, w jakiej występują w rejestrze wyjściowym - jeśli dla przykładu chcielibyśmy sobie zamaskować kanał "niebieski" i umożliwić zapis tylko do pozostałych musimy skonstruować modyfikator w sposób:.rga - nie dopuszczalny jest na przykład zapis ".gar" czy ".rag" - po prostu nie wolno nam w takim modyfikatorze przestawiać liter - kolejność kanałów musi zostać zachowana. Maskowanie zapisu rejestrów wyjściowych jest dostępne tylko dla instrukcji arytmetycznych - żadnych innych. Tutaj także istnieją oczywiście wyjątki, ponieważ dla shaderów 1.4 niektóre instrukcje adresowania mogą takiego maskowania dokonywać. Ale po wszystkie szczegóły polecam udać się do dokumentacji, bo gdybyśmy tak zaczęli opisywać wszystkie możliwe sytuacje to by nam wyszła niezła księga. Nie podanie żadnego modyfikatora po nazwie rejestru wyjściowego jest równoznaczne, z maska.rgba - oczywiście można się tego domyśleć po działaniu shadera bez zastosowania modyfikatora. Ale warto czasem o tym pamiętać, jak przyjdzie nam się zmierzyć z jakimiś jeszcze bliżej nieokreślonymi kosmicznymi problemami. No i cóż na koniec mogę powiedzieć - wygląda to dosyć skomplikowanie i jak popatrzeć nawet do dokumentacji to jest tego dosyć sporo. Na pewno pisanie pixel shaders będzie wymagało o wiele więcej uwagi niż tych, dotyczących wierzchołków, ale też efekty będą o wiele bardziej fascynujące. Mając wiedzę o każdym pikselu na ekranie będziemy mogli z nim zrobić praktycznie wszystko a wszystkie dotychczas poznane techniki używające na przykład mieszania tekstur będziemy mieli do dyspozycji na poziomie kodu programu. Tak więc zamiast definiować jakieś tam stany i posługiwać się właściwościami poziomów tekstur my w kodzie zrobimy sobie z teksturą czy kolorem bryły dosłownie wszystko. Takie efekty jak cienie, oświetlenie liczone dla pojedynczych pikseli, efekty przezroczystości, mgły, wypukłości - to wszystko czeka na nas w zupełnie nowym wymiarze - wymiarze pixel shadera. Czeka nas zatem naprawdę fascynująca zabawa, bo uzbrojeni w w kartę dowolnie programowalną możemy w zasadzie już tylko jedno - wymyślać i korzystać dowoli z dobrodziejstw shaderów. W momencie, kiedy powstaje ten artykuł są zapewne już na rynku zapewne karty obsługujące shadery w wersjach powyżej

9 9 DirectX Piel shader Jeśli wierzyć buńczucznym zapowiedziom konstruktorów będziemy mieli do dyspozycji możliwość sterowania kodem shadera (instrukcje w stylu if-else) na przykład, na pewno się zwiększy ilość dostępnych instrukcji, zarówno jeśli chodzi o różnorodność działania jaki i możliwości budowy większych programów, powstaną zapewne języki wysokiego poziomu jeśli chodzi o shadery i pewnie znowu odejdziemy od asemblera. Ale jedno jest pewne - dobrze wiedzieć co siedzi na samym spodzie, żeby w razie czego mieć od czego zacząć przy szukaniu błędów. Do czasu następnej lekcji polecam zasiąść chwileczkę nad dokumentacją i zapoznać się choć pobieżnie z instrukcjami i modyfikatorami, żeby potem nie szukać i nie kombinować niepotrzebnie, bo może się okazać, że efekt który usiłujemy mozolnie osiągnąć kombinując instrukcjami można zrobić dosłownie w jednej linijce za pomocą modyfikatorów. A już w następnej lekcji poznamy praktykę - czyli napiszemy nasz pierwszy pixel shader i spróbujemy wycisnąć z tego jakiś niebanalny efekt - czy z dobrym skutkiem przekonamy się już niedługo ;).Do zobaczenia.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Dzielenie sieci na podsieci

Dzielenie sieci na podsieci e-damiangarbus.pl Dzielenie sieci na podsieci dla każdego Uzupełnienie do wpisu http://e-damiangarbus.pl/podzial-sieci-na-podsieci/ Dwa słowa wstępu Witaj, właśnie czytasz uzupełnienie do wpisu na temat

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Jak napisać program obliczający pola powierzchni różnych figur płaskich? Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy

Bardziej szczegółowo

Które z poniższych adresów są adresem hosta w podsieci o masce 255.255.255.248

Które z poniższych adresów są adresem hosta w podsieci o masce 255.255.255.248 Zadanie 1 wspólne Które z poniższych adresów są adresem hosta w podsieci o masce 255.255.255.248 17.61.12.31 17.61.12.93 17.61.12.144 17.61.12.33 17.61.12.56 17.61.12.15 Jak to sprawdzić? ODPOWIEDŹ. Po

Bardziej szczegółowo

WYBUCHAJĄCE KROPKI ROZDZIAŁ 1 MASZYNY

WYBUCHAJĄCE KROPKI ROZDZIAŁ 1 MASZYNY WYBUCHAJĄCE KROPKI ROZDZIAŁ 1 MASZYNY Witaj w podróży. Jest to podróż matematyczna oparta na historii mojej, Jamesa, która jednak nie wydarzyła się naprawdę. Kiedy byłem dzieckiem, wynalazłem maszynę -

Bardziej szczegółowo

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.

Bardziej szczegółowo

Podział sieci na podsieci wytłumaczenie

Podział sieci na podsieci wytłumaczenie Podział sieci na podsieci wytłumaczenie Witam wszystkich z mojej grupy pozdrawiam wszystkich z drugiej grupy. Tematem tego postu jest podział sieci na daną ilość podsieci oraz wyznaczenie zakresów IP tychże

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

1 Matematyka Macierze

1 Matematyka Macierze 1 Matematyka Macierze Witam w naszym drugim odcinku małego poradnika matematycznego. Poprzednim razem powiedzieliśmy sobie sporo na temat wektorów i wszelakich operacji, jakie na nich przeprowadzać. No

Bardziej szczegółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą

Bardziej szczegółowo

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Publikacja jest dystrybuowana bezpłatnie Program Operacyjny Kapitał Ludzki Priorytet 9 Działanie 9.1 Poddziałanie

Bardziej szczegółowo

Przekształcanie wykresów.

Przekształcanie wykresów. Sławomir Jemielity Przekształcanie wykresów. Pokażemy tu, jak zmiana we wzorze funkcji wpływa na wygląd jej wykresu. A. Mamy wykres funkcji f(). Jak będzie wyglądał wykres f ( ) + a, a stała? ( ) f ( )

Bardziej szczegółowo

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10. ZAMIANA LICZB MIĘDZY SYSTEMAMI DWÓJKOWYM I DZIESIĘTNYM Aby zamienić liczbę z systemu dwójkowego (binarnego) na dziesiętny (decymalny) należy najpierw przypomnieć sobie jak są tworzone liczby w ww systemach

Bardziej szczegółowo

Czym są właściwości. Poprawne projektowanie klas

Czym są właściwości. Poprawne projektowanie klas Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane

Bardziej szczegółowo

Ile waży arbuz? Copyright Łukasz Sławiński

Ile waży arbuz? Copyright Łukasz Sławiński Ile waży arbuz? Arbuz ważył7kg z czego 99 % stanowiła woda. Po tygodniu wysechł i woda stanowi 98 %. Nieważne jak zmierzono te %% oblicz ile waży arbuz teraz? Zanim zaczniemy, spróbuj ocenić to na wyczucie...

Bardziej szczegółowo

Informatyka I: Instrukcja 4.2

Informatyka I: Instrukcja 4.2 Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże

Bardziej szczegółowo

Logiczny model komputera i działanie procesora. Część 1.

Logiczny model komputera i działanie procesora. Część 1. Logiczny model komputera i działanie procesora. Część 1. Klasyczny komputer o architekturze podanej przez von Neumana składa się z trzech podstawowych bloków: procesora pamięci operacyjnej urządzeń wejścia/wyjścia.

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

Co to jest niewiadoma? Co to są liczby ujemne?

Co to jest niewiadoma? Co to są liczby ujemne? Co to jest niewiadoma? Co to są liczby ujemne? Można to łatwo wyjaśnić przy pomocy Edukrążków! Witold Szwajkowski Copyright: Edutronika Sp. z o.o. www.edutronika.pl 1 Jak wyjaśnić, co to jest niewiadoma?

Bardziej szczegółowo

1. Operacje logiczne A B A OR B

1. Operacje logiczne A B A OR B 1. Operacje logiczne OR Operacje logiczne są operacjami działającymi na poszczególnych bitach, dzięki czemu można je całkowicie opisać przedstawiając jak oddziałują ze sobą dwa bity. Takie operacje logiczne

Bardziej szczegółowo

Zajęcia nr. 3 notatki

Zajęcia nr. 3 notatki Zajęcia nr. 3 notatki 22 kwietnia 2005 1 Funkcje liczbowe wprowadzenie Istnieje nieskończenie wiele funkcji w matematyce. W dodaktu nie wszystkie są liczbowe. Rozpatruje się funkcje które pobierają argumenty

Bardziej szczegółowo

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest Pętle Pętla to pewien fragment kodu, który jest wykonywany wielokrotnie. Wyobraź sobie taką sytuację. Piszesz program do szyfrowania danych. Dane są szyfrowane kolejno bajt po bajcie. Załóżmy, że plik

Bardziej szczegółowo

Lekcja : Tablice + pętle

Lekcja : Tablice + pętle Lekcja : Tablice + pętle Wprowadzenie Oczywiście wiesz już jak dużo można osiągnąć za pomocą tablic oraz jak dużo można osiągnąć za pomocą pętli, jednak tak naprawdę prawdziwe możliwości daje połączenie

Bardziej szczegółowo

Warunek wielokrotnego wyboru switch... case

Warunek wielokrotnego wyboru switch... case Warunek wielokrotnego wyboru switch... case Działanie instrukcji switch jest zupełnie inne niż w przypadku instrukcji if o czym będziesz mógł się przekonać w niniejszym rozdziale. Różnice pomiędzy instrukcjami

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

C++ Przeładowanie operatorów i wzorce w klasach C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje

Bardziej szczegółowo

Plan wykładu. Akcelerator 3D Potok graficzny

Plan wykładu. Akcelerator 3D Potok graficzny Plan wykładu Akcelerator 3D Potok graficzny Akcelerator 3D W 1996 r. opracowana została specjalna karta rozszerzeń o nazwie marketingowej Voodoo, którą z racji wspomagania procesu generowania grafiki 3D

Bardziej szczegółowo

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017 Systemy operacyjne Laboratorium 9 Perl wyrażenia regularne Jarosław Rudy Politechnika Wrocławska 28 lutego 2017 Temat obejmuje wykorzystanie wyrażeń regularnych w perlu. Wyrażenia same w sobie są w zasadzie

Bardziej szczegółowo

wagi cyfry 7 5 8 2 pozycje 3 2 1 0

wagi cyfry 7 5 8 2 pozycje 3 2 1 0 Wartość liczby pozycyjnej System dziesiętny W rozdziale opiszemy pozycyjne systemy liczbowe. Wiedza ta znakomicie ułatwi nam zrozumienie sposobu przechowywania liczb w pamięci komputerów. Na pierwszy ogień

Bardziej szczegółowo

Dodawanie ułamków i liczb mieszanych o różnych mianownikach

Dodawanie ułamków i liczb mieszanych o różnych mianownikach Dodawanie ułamków i liczb mieszanych o różnych mianownikach Przedmowa To opracowanie jest napisane z myślą o uczniach klas 4 szkół podstawowych którzy po raz pierwszy spotykają się z dodawaniem ułamków

Bardziej szczegółowo

Wyszukiwanie binarne

Wyszukiwanie binarne Wyszukiwanie binarne Wyszukiwanie binarne to technika pozwalająca na przeszukanie jakiegoś posortowanego zbioru danych w czasie logarytmicznie zależnym od jego wielkości (co to dokładnie znaczy dowiecie

Bardziej szczegółowo

Systemy liczbowe. System dziesiętny

Systemy liczbowe. System dziesiętny Systemy liczbowe System dziesiętny Dla nas, ludzi naturalnym sposobem prezentacji liczb jest system dziesiętny. Oznacza to, że wyróżniamy dziesięć cytr. Są nimi: zero, jeden, dwa, trzy, cztery, pięć, sześć,

Bardziej szczegółowo

CIĄGI wiadomości podstawowe

CIĄGI wiadomości podstawowe 1 CIĄGI wiadomości podstawowe Jak głosi definicja ciąg liczbowy to funkcja, której dziedziną są liczby naturalne dodatnie (w zadaniach oznacza się to najczęściej n 1) a wartościami tej funkcji są wszystkie

Bardziej szczegółowo

3. Instrukcje warunkowe

3. Instrukcje warunkowe . Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Jak odczuwać gramatykę

Jak odczuwać gramatykę Jak odczuwać gramatykę Przez lata uważałem, że najlepszym sposobem na opanowanie gramatyki jest powtarzanie. Dzisiaj wiem, że powtarzanie jest skrajnie nieefektywnym sposobem nauki czegokolwiek, także

Bardziej szczegółowo

Analiza i Przetwarzanie Obrazów. Szyfrowanie Obrazów. Autor : Mateusz Nawrot

Analiza i Przetwarzanie Obrazów. Szyfrowanie Obrazów. Autor : Mateusz Nawrot Analiza i Przetwarzanie Obrazów Szyfrowanie Obrazów Autor : Mateusz Nawrot 1. Cel projektu Celem projektu jest zaprezentowanie metod szyfrowania wykorzystujących zmodyfikowane dane obrazów graficznych.

Bardziej szczegółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie strukturalne i obiektowe. Funkcje Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy

Bardziej szczegółowo

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych) Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych) Funkcja uwikłana (równanie nieliniowe) jest to funkcja, która nie jest przedstawiona jawnym przepisem, wzorem wyrażającym zależność wartości

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ Lekcja 5 - PROGRAMOWANIE NOWICJUSZ 1 Programowanie i program według Baltiego Najpierw sprawdźmy jak program Baltie definiuje pojęcia programowania i programu: Programowanie jest najwyższym trybem Baltiego.

Bardziej szczegółowo

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych.

Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych. Kod uzupełnień do dwóch jest najczęściej stosowanym systemem zapisu liczb ujemnych wśród systemów binarnych. Jeśli bit znaku przyjmie wartość 0 to liczba jest dodatnia lub posiada wartość 0. Jeśli bit

Bardziej szczegółowo

Programowanie i techniki algorytmiczne

Programowanie i techniki algorytmiczne Temat 2. Programowanie i techniki algorytmiczne Realizacja podstawy programowej 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych 2) formułuje ścisły opis prostej

Bardziej szczegółowo

Struktura i działanie jednostki centralnej

Struktura i działanie jednostki centralnej Struktura i działanie jednostki centralnej ALU Jednostka sterująca Rejestry Zadania procesora: Pobieranie rozkazów; Interpretowanie rozkazów; Pobieranie danych Przetwarzanie danych Zapisywanie danych magistrala

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

7. Pętle for. Przykłady

7. Pętle for. Przykłady . Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i

Bardziej szczegółowo

8.2 Drukowanie arkusza kalkulacyjnego

8.2 Drukowanie arkusza kalkulacyjnego przede wszystkim zastanów się, co chcesz pokazać na wykresie (te same dane można pokazać na różne sposoby, uwypuklając różne ich aspekty) zaznacz zakres danych jeszcze przed wywołaniem kreatora wykonaj

Bardziej szczegółowo

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH 5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH Temat, którym mamy się tu zająć, jest nudny i żmudny będziemy się uczyć techniki obliczania wartości logicznej zdań dowolnie złożonych. Po co? możecie zapytać.

Bardziej szczegółowo

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych B.1. Dostęp do urządzeń komunikacyjnych Sterowniki urządzeń zewnętrznych widziane są przez procesor jako zestawy rejestrów

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

Temat: Pojęcie potęgi i wykładniczy zapis liczb. Część I Potęga o wykładniku naturalnym

Temat: Pojęcie potęgi i wykładniczy zapis liczb. Część I Potęga o wykładniku naturalnym PRZELICZANIE JEDNOSTEK MIAR Kompleks zajęć dotyczący przeliczania jednostek miar składa się z czterech odrębnych zajęć, które są jednak nierozerwalnie połączone ze sobą tematycznie w takiej sekwencji,

Bardziej szczegółowo

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać

Bardziej szczegółowo

Notatka lekcja_#3_1; na podstawie W.Kapica 2017 Strona 1

Notatka lekcja_#3_1; na podstawie  W.Kapica 2017 Strona 1 Na poprzednich zajęciach zajmowaliśmy się odczytywaniem sygnałów cyfrowych. Dzięki temu mogliśmy np.: sprawdzić, czy przycisk został wciśnięty. Świat, który nas otacza nie jest jednak cyfrowy, czasami

Bardziej szczegółowo

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy Programowanie w C++ 1.Czym jest programowanie Pisanie programów to wcale nie czarna magia, tylko bardzo logiczna rozmowa z komputerem. Oczywiście w jednym ze specjalnie stworzonych do tego celu języków.

Bardziej szczegółowo

Informatyka II. Laboratorium Aplikacja okienkowa

Informatyka II. Laboratorium Aplikacja okienkowa Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.

Bardziej szczegółowo

Celem tego projektu jest stworzenie

Celem tego projektu jest stworzenie Prosty kalkulator Celem tego projektu jest stworzenie prostego kalkulatora, w którym użytkownik będzie podawał dwie liczby oraz działanie, które chce wykonać. Aplikacja będzie zwracała wynik tej operacji.

Bardziej szczegółowo

[WYSYŁANIE MAILI Z PROGRAMU EXCEL]

[WYSYŁANIE MAILI Z PROGRAMU EXCEL] c 20140612- rev. 2 [WYSYŁANIE MAILI Z PROGRAMU EXCEL] ZAWARTOŚĆ Wstęp... 3 Funkcje w excelu... 4 Funkcja Hiperłącza... 7 Dodawanie odbiorców... 8 Uzupełnianie tytułu... 8 Wpisywanie treści... 8 Znane problemy...

Bardziej szczegółowo

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy. Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy. #include #include #include #include

Bardziej szczegółowo

Uwagi ogólne. 3. Użycie gwiazdki zamiast kropki na oznaczenie mnożenia: 4. Lepiej niż 6, F wyglądałby zapis: 69,539 pf.

Uwagi ogólne. 3. Użycie gwiazdki zamiast kropki na oznaczenie mnożenia: 4. Lepiej niż 6, F wyglądałby zapis: 69,539 pf. Uwagi ogólne. 1. Sprawozdania przesyłamy przez e-mail, wpisując w temacie STUDENT. 2. Sprawozdania przesyłamy tylko w postaci pliku PDF. 3. Termin na wykonanie i przesłanie sprawozdania wynosi 7 dni od

Bardziej szczegółowo

Ćwiczenie: JavaScript Cookies (3x45 minut)

Ćwiczenie: JavaScript Cookies (3x45 minut) Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.

Bardziej szczegółowo

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego Arytmetyka cyfrowa Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego (binarnego). Zapis binarny - to system liczenia

Bardziej szczegółowo

CorelDRAW. 1. Rysunek rastrowy a wektorowy. 2. Opis okna programu

CorelDRAW. 1. Rysunek rastrowy a wektorowy. 2. Opis okna programu 1. Rysunek rastrowy a wektorowy CorelDRAW Różnice między rysunkiem rastrowym (czasami nazywanym bitmapą) a wektorowym są olbrzymie. Szczególnie widoczne są podczas skalowania (czyli zmiany rozmiaru) rysunku

Bardziej szczegółowo

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika: PRZYPOMNIJ SOBIE! Matematyka: Dodawanie i odejmowanie "pod kreską". Elektronika: Sygnały cyfrowe. Zasadę pracy tranzystorów bipolarnych i unipolarnych. 12. Wprowadzenie 12.1. Sygnały techniki cyfrowej

Bardziej szczegółowo

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora. 1. Podstawy matematyki 1.1. Geometria analityczna W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora. Skalarem w fizyce nazywamy

Bardziej szczegółowo

Przepustowość kanału, odczytywanie wiadomości z kanału, poprawa wydajności kanału.

Przepustowość kanału, odczytywanie wiadomości z kanału, poprawa wydajności kanału. Przepustowość kanału, odczytywanie wiadomości z kanału, poprawa wydajności kanału Wiktor Miszuris 2 czerwca 2004 Przepustowość kanału Zacznijmy od wprowadzenia równości IA, B HB HB A HA HA B Można ją intuicyjnie

Bardziej szczegółowo

Diagnostyka obrazowa

Diagnostyka obrazowa Diagnostyka obrazowa Ćwiczenie pierwsze Zapoznanie ze środowiskiem przetwarzania obrazu ImageJ 1 Cel ćwiczenia Ćwiczenie ma na celu zapoznanie uczestników kursu Diagnostyka obrazowa ze środowiskiem przetwarzania

Bardziej szczegółowo

W dowolnym momencie można zmienić typ wskaźnika.

W dowolnym momencie można zmienić typ wskaźnika. c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać

Bardziej szczegółowo

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup Baltie 3 Podręcznik do nauki programowania dla klas I III gimnazjum Tadeusz Sołtys, Bohumír Soukup Czytanie klawisza lub przycisku myszy Czytaj klawisz lub przycisk myszy - czekaj na naciśnięcie Polecenie

Bardziej szczegółowo

13. Równania różniczkowe - portrety fazowe

13. Równania różniczkowe - portrety fazowe 13. Równania różniczkowe - portrety fazowe Grzegorz Kosiorowski Uniwersytet Ekonomiczny w Krakowie rzegorz Kosiorowski (Uniwersytet Ekonomiczny 13. wrównania Krakowie) różniczkowe - portrety fazowe 1 /

Bardziej szczegółowo

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej.

Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Wymagania edukacyjne z informatyki dla klasy szóstej szkoły podstawowej. Dział Zagadnienia Wymagania podstawowe Wymagania ponadpodstawowe Arkusz kalkulacyjny (Microsoft Excel i OpenOffice) Uruchomienie

Bardziej szczegółowo

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com

Bardziej szczegółowo

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami: Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie

Bardziej szczegółowo

g_pd3ddevice->createpixelshader( (DWORD*)pCode->GetBufferPointer(), &PixelShader ); pcode->release();

g_pd3ddevice->createpixelshader( (DWORD*)pCode->GetBufferPointer(), &PixelShader ); pcode->release(); 1 DirectX Piel shader 2 Przechodzimy od teorii do praktyki - dzisiaj więc napiszemy nasz własny, pierwszy piksel shader. Mam nadzieję, że choć pobieżnie się zapoznaliście się z dokumentacją i macie niejakie

Bardziej szczegółowo

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Być może jesteś doświadczonym programistą, biegle programujesz w Javie, Kompendium PHP 01 Być może jesteś doświadczonym programistą, biegle programujesz w Javie, C++, Pythonie lub jakimś innym języku programowania, których jak myślę, powstało już tyle, że chyba nie ma osoby,

Bardziej szczegółowo

WYRAŻENIA ALGEBRAICZNE

WYRAŻENIA ALGEBRAICZNE WYRAŻENIA ALGEBRAICZNE Wyrażeniem algebraicznym nazywamy wyrażenie zbudowane z liczb, liter, nawiasów oraz znaków działań, na przykład: Symbole literowe występujące w wyrażeniu algebraicznym nazywamy zmiennymi.

Bardziej szczegółowo

Formaty obrazów rastrowych biblioteki PBM

Formaty obrazów rastrowych biblioteki PBM Formaty obrazów rastrowych biblioteki PBM Reprezentacja obrazu Obrazy pobierane z kamery, bądź dowolnego innego źródła, mogą być składowane na pliku dyskowym w jednym z wielu istniejących formatów zapisu

Bardziej szczegółowo

x 2 = a RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych 2. Proste równania kwadratowe Równanie kwadratowe typu:

x 2 = a RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych 2. Proste równania kwadratowe Równanie kwadratowe typu: RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych Przed rozpoczęciem nauki o równaniach kwadratowych, warto dobrze opanować rozwiązywanie zwykłych równań liniowych. W równaniach liniowych niewiadoma

Bardziej szczegółowo

Pomorski Czarodziej 2016 Zadania. Kategoria C

Pomorski Czarodziej 2016 Zadania. Kategoria C Pomorski Czarodziej 2016 Zadania. Kategoria C Poniżej znajduje się 5 zadań. Za poprawne rozwiązanie każdego z nich możesz otrzymać 10 punktów. Jeżeli otrzymasz za zadanie maksymalną liczbę punktów, możesz

Bardziej szczegółowo

użytkownika 1 Jak wybrać temat pracy 2 Spis treści 3 Część pierwsza problematyka 4 Część druga stosowane metody 5 Część trzecia propozycja rozwiązania

użytkownika 1 Jak wybrać temat pracy 2 Spis treści 3 Część pierwsza problematyka 4 Część druga stosowane metody 5 Część trzecia propozycja rozwiązania 1 Jak wybrać temat pracy 2 Spis treści 3 Część pierwsza problematyka 4 Część druga stosowane metody 5 Część trzecia propozycja rozwiązania 6 Część czwarta dokumentacja techniczna i dokumentacja użytkownika

Bardziej szczegółowo

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++ Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu

Bardziej szczegółowo

Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty).

Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty). Pudełkowy komputer Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty). Budowa komputera: każdy uczeń składa proste pudełko metodą orgiami Zobacz:

Bardziej szczegółowo

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka Sesje, ciasteczka, wyjątki Nie sposób wyobrazić sobie bez nich takich podstawowych zastosowań, jak logowanie użytkowników czy funkcjonowanie koszyka na zakupy. Oprócz tego dowiesz się, czym są wyjątki,

Bardziej szczegółowo

Dzięki ćwiczeniom z panią Suzuki w szkole Hagukumi oraz z moją mamą nauczyłem się komunikować za pomocą pisma. Teraz umiem nawet pisać na komputerze.

Dzięki ćwiczeniom z panią Suzuki w szkole Hagukumi oraz z moją mamą nauczyłem się komunikować za pomocą pisma. Teraz umiem nawet pisać na komputerze. Przedmowa Kiedy byłem mały, nawet nie wiedziałem, że jestem dzieckiem specjalnej troski. Jak się o tym dowiedziałem? Ludzie powiedzieli mi, że jestem inny niż wszyscy i że to jest problem. To była prawda.

Bardziej szczegółowo

Zad. 3: Układ równań liniowych

Zad. 3: Układ równań liniowych 1 Cel ćwiczenia Zad. 3: Układ równań liniowych Wykształcenie umiejętności modelowania kluczowych dla danego problemu pojęć. Definiowanie właściwego interfejsu klasy. Zwrócenie uwagi na dobór odpowiednich

Bardziej szczegółowo

O co chodzi z tym MATLAB'em?!

O co chodzi z tym MATLAB'em?! O co chodzi z tym MATLAB'em?! Część 1. SIMULINK W pliku data.mat jest zapisany przebieg. Gdzieś tam i kiedyś tam zarejestrowany. Widać go na fioletowo poniżej. Powstał on z obiektu, co ciekawe wiemy jak

Bardziej szczegółowo

Chińskie, japońskie znaki

Chińskie, japońskie znaki Chińskie, japońskie znaki Podstawowe znaki chińskie czy japońskie to dla Europejczyka czysta magia. Dzieje się tak dlatego, że ucząc się tego typu znaków, opieramy się na czymś, co nie pozwala nam pamiętać.

Bardziej szczegółowo

Instrukcja użytkowania

Instrukcja użytkowania Instrukcja użytkowania Aby skutecznie pracować z programem Agrinavia Map należy zrozumieć zasadę interfejsu aplikacji. Poniżej można odszukać zasady działania Agrinavia Map. Szczegółowe informacje na temat

Bardziej szczegółowo

Grafika 3D program POV-Ray - 1 -

Grafika 3D program POV-Ray - 1 - Temat 1: Ogólne informacje o programie POV-Ray. Interfejs programu. Ustawienie kamery i świateł. Podstawowe obiekty 3D, ich położenie, kolory i tekstura oraz przezroczystość. Skrót POV-Ray to rozwinięcie

Bardziej szczegółowo

NAUKA JAK UCZYĆ SIĘ SKUTECZNIE (A2 / B1)

NAUKA JAK UCZYĆ SIĘ SKUTECZNIE (A2 / B1) NAUKA JAK UCZYĆ SIĘ SKUTECZNIE (A2 / B1) CZYTANIE A. Mówi się, że człowiek uczy się całe życie. I jest to bez wątpienia prawda. Bo przecież wiedzę zdobywamy nie tylko w szkole, ale również w pracy, albo

Bardziej szczegółowo

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb Zad. 3: Rotacje 2D 1 Cel ćwiczenia Wykształcenie umiejętności modelowania kluczowych dla danego problemu pojęć. Definiowanie właściwego interfejsu klasy. Zwrócenie uwagi na dobór odpowiednich struktur

Bardziej szczegółowo

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika Rejestry procesora Procesor podczas wykonywania instrukcji posługuje się w dużej części pamięcią RAM. Pobiera z niej kolejne instrukcje do wykonania i dane, jeżeli instrukcja operuje na jakiś zmiennych.

Bardziej szczegółowo

Dziedziczenie. Dziedziczenie i kaskadowość. Dodał Administrator środa, 10 marzec :00. Tematy: Dziedziczenie Kaskadowość

Dziedziczenie. Dziedziczenie i kaskadowość. Dodał Administrator środa, 10 marzec :00. Tematy: Dziedziczenie Kaskadowość Tematy: Dziedziczenie Kaskadowość Dziedziczenie Zrozumienie pojęcia dziedziczenia wymaga od nas zapoznania się z hierarchią ważności poszczególnych znaczników wewnątrz dokumentu. Kaskadowe arkusze stylów

Bardziej szczegółowo

Temat 20. Techniki algorytmiczne

Temat 20. Techniki algorytmiczne Realizacja podstawy programowej 5. 1) wyjaśnia pojęcie algorytmu, podaje odpowiednie przykłady algorytmów rozwiązywania różnych problemów; 2) formułuje ścisły opis prostej sytuacji problemowej, analizuje

Bardziej szczegółowo

Podstawy programowania w C++

Podstawy programowania w C++ Podstawy programowania w C++ Liczby w jaki sposób komputery je widzą? Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com Czy wiesz, jak komputery wykonują

Bardziej szczegółowo

PAMIĘĆ RAM. Rysunek 1. Blokowy schemat pamięci

PAMIĘĆ RAM. Rysunek 1. Blokowy schemat pamięci PAMIĘĆ RAM Pamięć służy do przechowania bitów. Do pamięci musi istnieć możliwość wpisania i odczytania danych. Bity, które są przechowywane pamięci pogrupowane są na komórki, z których każda przechowuje

Bardziej szczegółowo

Jak nie zostać niewolnikiem kalkulatora? Obliczenia pamięciowe i pisemne.

Jak nie zostać niewolnikiem kalkulatora? Obliczenia pamięciowe i pisemne. Jak nie zostać niewolnikiem kalkulatora? Obliczenia pamięciowe i pisemne. W miarę postępu techniki w niepamięć odeszły nawyki do wykonywania pisemnych albo pamięciowych obliczeń. O suwaku logarytmicznym,

Bardziej szczegółowo