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

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

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

Transkrypt

1 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 pojęcie jakie mamy dostępne instrukcje, modyfikatory i rejestry. Ufam także, że lekcja poprzednia została porządnie przerobiona i raczej wszystko będzie jasne w tym artykule. Oczywiście omówimy sobie wszystko dokładnie co i jak, no ale do pewnych rzeczy raczej już nie będziemy wracać. Tak więc chyba wszystko w gotowości więc zaczynamy! Dzisiejszy przykład jak już wiemy ma pokazać, w jaki sposób posługiwać się nowym wynalazkiem, jakim jest pixel shader. Ale przykład nasz będzie się charakteryzował jeszcze jedną, dosyć istotną cechą - już na pełną skalę posłużymy się w nim zarówno vertex jak i pixel shaderem - oznacza to, że będziemy mieć w zasadzie pełną kontrolę nad tym co się dzieje na ekranie - i to zarówno nad szalejącymi wierzchołkami jak i poszczególnymi pikselami znajdującymi się na samej bryle, zdefiniowanej przez te wierzchołki. Przyznam szczerze, że chciałem w tym przykładzie zasunąć już jakieś super wyglądające mapowanie wypukłości, ale niestety - to nie ta lekcja. Dzisiaj pobawimy się najprymitywniej w zasadzie jak można, ale za to poznamy tajemnice pixel shaders, które potem umożliwią nam zabawę na naprawdę wysokim poziomie. W tej lekcji w zasadzie cały potrzebny kod jest wam doskonale znany - doszło tylko kilka instrukcji, które i tak nie będą dla was stanowić żadnej tajemnicy. Opiszemy także szczegółowo pixel shader, który będzie naprawdę bardzo króciutki, ale zobaczycie za to różnicę w ilości kodu, który trzeba by wklepać normalnie, aby osiągnąć ten sam efekt ;). Aby więc nie przedłużać zacznijmy może od tego, co przedstawiał będzie przykład. Omówimy sobie dzisiaj przykład, który kiedyś już w zasadzie omawialiśmy - multiteksturing jednoprzebiegowy. Czyli nałożymy sobie na nasz obiekt dwie tekstury, renderując ją tylko raz no i oczywiście zmieszamy nasze tekstury w odpowiedni sposób aby osiągnąć określony efekt. Tak więc w naszym przykładzie wystąpi bryła z wierzchołkami, które będą posiadały odpowiednią strukturę - będą mianowicie zawierały dwa zestawy mapowania, dla każdej tekstury oddzielny. Oczywiście pociąga to za sobą odpowiednie zmiany w deklaratorze vertex shadera oraz w typie wierzchołków. Ale o tym już mówiliśmy sobie także nie raz i nie dwa, a jeśli już nie pamiętacie to zapraszam do lekcji, właśnie choćby o multiteksturingu. Oczywiście trzeba stworzyć i załadować tekstury (ktoś nie potrafi? ;) no i co najważniejsze w tej lekcji załadować i skompilować program pixel shadera. I właśnie od tego sobie zaczniemy opis dzisiejszego kodu: herror = D3DXAssembleShaderFromFile( szbuffer, 0, NULL, &pcode, &perror ); if( NULL!= perror ) { plik.clear(); plik << (char*)( perror->getbufferpointer() ) << endl; plik.flush(); perror->release(); } return false; g_pd3ddevice->createpixelshader( (DWORD*)pCode->GetBufferPointer(), &PixelShader ); pcode->release(); I cóż tutaj widać takiego strasznego... Jak widać nasza ulubiona biblioteka D3DX nie próżnuje i tym razem dostarcza nam odpowiednich funkcji do działania. Tak samo jak w przypadku vertex shadera tak i w tym mamy możliwość zarówno wklepania kodu shadera bezpośrednio w kodzie C/C++ jako łańcucha znakowego (przykłady znajdziecie w SDK na każdym kroku), ja jednak nie preferuję takich rozwiązań. My sobie napiszemy nasz shader w pliku tekstowym, załadujemy i skompilujemy. Do tego właśnie służy funkcja D3DXAssembleShaderFromFile(), którą dostarcza nam biblioteka D3DX. Co do parametrów, to w zasadzie już omawialiśmy sobie tę funkcję, ale może przypomnijmy sobie. Pierwszym parametrem jest ścieżka do pliku, który zawiera kod naszego shadera. U nasz trochę ostatnio pokręciłem z układem projektów, więc przekazujemy tu bufor znakowy, który zawiera w jakiś tam sposób tę ścieżkę wykombinowaną, ze zrozumieniem nie powinniście mieć żadnych problemów. Drugi parametr to pewna kombinacja flag, na które zostanie zwrócona uwaga podczas kompilacji shadera. Umożliwiają one głównie ułatwienia w debugowaniu i analizowaniu shadera pod względów w działaniu. Flag tych nie jest wiele, więc ciekawscy mogą pogrzebać w opisach. My na razie się uczymy, więc nie będziemy nic kombinować i ustawimy sobie to na zero. Pozostałe trzy parametry to wskaźniki na obiekty typu D3DXBUFFER. Są to nic innego jak tylko bufory, do których Direct3D będzie wkładał odpowiednie informacje w czasie wywoływania tej funkcji. Pierwszy bufor (u nas nie używany) może zawierać pewne informacje na temat stałych deklarowanych dla określonego shadera. Jeśli wartość tę ustawić na NULL to parametr ten jest ignorowany. Nas na razie takie informacje nie interesują, więc wiadomo skąd taka a nie inna wartość. Następny bufor, u nas nazwany jako pcode to miejsce, gdzie zostanie umieszczony skompilowany, wykonywalny kod naszego shadera. Bufor ten potem zostanie użyty do stworzenia shadera, ponieważ samo wywołanie omawianej funkcji niczego takiego oczywiście nie powoduje. Czwarty parametr to można by powiedzieć tak na wszelki wypadek, ale jest to bardzo pożyteczny zarazem element. W razie jakiś błędów w kodzie shadera podczas jego analizowania w tym buforze zostaną umieszczone informacje o błędach w postaci zwykłych łańcuchów znakowych zawierające opis i numer linii na przykład co znacznie ułatwi ich poszukiwanie i eliminowanie. Jeśli podczas analizy kodu nie wystąpią żadne błędy to parametr ten zostanie ustawiony na wartość NULL. Po wywołaniu tej funkcji, jeśli wszystko się uda, w zmiennej pcode powinniśmy otrzymać to, co nas interesuje, czyli kod shadera. Ale na wszelki wypadek sprawdzamy jeszcze zawartość zmienne perror, bo może się okazać, że bufor z błędami nie jest pusty. Jeśli taka sytuacja wystąpi to my w naszym programie po prostu wrzucimy sobie zawartość tego bufora do pliku, żeby mieć wyraźnie i bez wątpliwości, że coś

2 2 DirectX Piel shader 2 jest nie tak. Taki sposób jak nietrudno zauważyć zapewnia dosyć prostą obronę przez ewentualnym wywaleniem się programu, w sytuacji gdy spróbujemy tworzyć shader nie mając skompilowanego jego kodu. A skoro już o tworzeniu shadera... czas aby wreszcie na scenę naszych dzisiejszych działań wkroczyło nasze cudne urządzenie i zadziałało. No i działa - za pomocą metody CreatePixelShader(). Sama nazwa nie wymaga chyba komentarza mam nadzieję, parametry zresztą też. Jako pierwszy podajemy urządzeniu kod shadera znajdujący się w odpowiednim buforze a jako drugi identyfikator naszego shadera w postaci liczby typu DWORD. I od tej pory w zasadzie naszym obiektem zainteresowania powinna być właśnie tylko ta liczba, bo dzięki niej będziemy mieć dostęp do naszego shadera i będziemy go mogli używać dzięki niej. Jeśli wszystko się powiedzie oczywiście to dostaniemy do ręki naszą liczbę i będziemy mogli aplikować nasz shader kiedy tylko nam się żywnie będzie podobało. A czy z dobrym skutkiem? Jak widać, zupełnie nic strasznego się nie dzieje i jak na razie nie wygląda to tak źle. I faktycznie, jak wszystko w DirectX, tylko straszy to na początku a potem jest już zupełnie miło i człowiekowi aż brakuje pomysłów do czego by to jeszcze można było zmusić. Ale wracając do naszego kodu - cóż shader skompilowaliśmy (przynajmniej taką mamy nadzieję), mamy jego identyfikator, tekstury załóżmy, że także załadowaliśmy do pamięci, bryłę utworzyliśmy, ale zanim coś na ekran wyrzucimy trzeba jeszcze parę rzeczy zrobić. A tak naprawdę te rzeczy zrobimy sobie dzisiaj znowu w mało elegancki sposób, bo wrzucimy je bezpośrednio do funkcji renderującej. g_pd3ddevice->settexture( 0, g_ptex1 ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexture( 1, g_ptex2 ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); Chodzi właśnie o tekstury. Wprawdzie załadowaliśmy je do pamięci, ale urządzenie jeszcze nie wie, że akurat w przypadku tej bryły ma się nimi posłużyć. Tak więc przed renderingiem naszej bryły musimy odpowiednio poustawiać poziomy tekstur, aby urządzenie a co za tym idzie i sam pixel shader miał skąd pobierać dane. To nie stanowi problemu, bo potrafimy robić to przecież znakomicie i mamy to w małym palcu. Ale tak dla przypomnienia wrzucam odpowiedni kawałek kodu. Wspomniałem także na początku artykułu o tym, że będziemy się dzisiaj bawić w multiteksturing - no i słowa oczywiście dotrzymuję. W tym momencie powinienem was odesłać do kodu lekcji o multiteksturingu jednoprzebiegowym, ale żeby było całkiem jasne przytoczmy sobie ten kawałek tutaj. Oto co musieliśmy wpisać w naszym kodzie, aby tekstury nam się ładnie nałożyły na siebie: g_pd3ddevice->settexture( 0, g_ptex1 ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_TEXCOORDINDEX, 0 ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexturestagestate( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexture( 1, g_ptex2 ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_TEXCOORDINDEX, 0 ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_COLOROP, D3DTOP_MODULATE ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_COLORARG2, D3DTA_CURRENT ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_ALPHAARG2, D3DTA_CURRENT ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); g_pd3ddevice->settexturestagestate( 1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); Także mamy więc ustawienie poziomów tekstur i sposobu filtracji. No ale oprócz tego mnóstwo wywołań funkcji SetTextureStageState(), która to wywoływała u urządzenia różne dziwne stany a te z kolei powodowały takie a nie inne efekty na ekranie. No a teraz czas na nasz kod, który musimy wklepać, żeby osiągnąć ten same efekt: g_pd3ddevice->setpixelshader( PixelShader ); Uff!, czekałem na ten moment ;). Podoba się, prawda? Zamiast mnóstwa wywołań tej samej funkcji jedna linia! I cóż można dodać - jest i przejrzyściej, mniej klepania kodu, pliki są mniejsze - same zalety. Oczywiście to tylko na pierwszy rzut oka. Bo bez skompilowanego kodu naszego shadera nic nie zdziałamy tym wywołaniem a tylko możemy spowodować zawieszenie się albo wywalenie naszego programu. Ale przy założeniu, że kod takowy posiadamy wygląda to po prostu

3 3 DirectX Piel shader 2 elegancko, czyż nie? A co zrobić, że kod takowy posiadać? Otóż bardzo niewiele, trzeba wykonać wszystkie powyższe opisane przeze mnie czynności na jednym maleńkim pliku zawierającym kilka linii: ps.1.1 ; texture instructions tex t0 tex t1 ; arithmetic instructions mul r0, t0, t1 Tak, tak - to kod naszego pierwszego pixel shadera - nie ogarnia was zdziwienie? Jeszcze raz proponuję przyjrzeć się temu kawałowi z kodu multiteksturowania jednoprzebiegowego i tym kilku wyrazom, z których większość jest zaledwie dwuliterowa! ;). Aż trudno uwierzyć, że taka "pchełka" potrafi to samo, co tamten kawałek a przy bardzo niewielkiej zmianie potrafi o wiele więcej! No ale to się nazywa właśnie postęp technologii i to zarówno w programowaniu jak i sprzęcie - mi w każdym razie kojarzy się jak porównanie lampy elektronowej i współczesnego tranzystora ;). No ale koniec może zachwytów, bo wszystko pięknie działa a my jeszcze nie wiemy dlaczego, czas więc się dowiedzieć właśnie teraz. ps.1.1 Pierwszą instrukcją shadera jest, bez wyjątku czy dla wierzchołków czy pikseli zawsze instrukcja wersji. Mówi ona, w jakiej wersji shader jest napisany, co jest szczególnie ważne w przypadku pixel shaders, bo jak wiemy z lekcji poprzedniej w zależności od wersji shadera te same instrukcje czy rejestry mają niekiedy różne działanie! Oczywiście im wyższa wersja tym więcej różnych nowych rozkazów nam się pojawia. Ale ponieważ my dopiero zaczynamy więc wystartujemy może od wersji 1.1, która nie jest jeszcze aż tak skomplikowana, żeby nie dało jej się zrozumieć. Tak więc teraz, analizując kod naszego shadera będziemy sprawdzali w dokumentacji jak działają instrukcje w wersji 1.1. Jak wiemy także z poprzedniej lekcji pixel shader ma pewien określony porządek występowania instrukcji w kodzie. Najpierw jest oczywiście instrukcja wersji, potem definicje stałych (tych nie znajdziemy w naszym programie), potem instrukcje dotyczące tekstur a na końcu instrukcje arytmetyczne. Istnieje jeszcze instrukcja fazy, ale pojawia się ona w wyższych wersjach shaderów, więc na razie nie ma potrzeby jej dokładnie omawiać, na pewno jeszcze na nią przyjdzie czas. Skoro więc mieliśmy już instrukcje wersji a jak powiedziałem nie mamy w naszym kodzie deklaracji rejestrów pamięci stałej, więc kolej na instrukcje tekstur: ; texture instructions tex t0 tex t1 W naszym przykładzie jak już wałkujemy od samego początku, będziemy się bawić w multiteksturowanie. A skoro tak, to niewątpliwie będziemy mieli do czynienia z teksturą i to nie jedną. W programie głównym naszej aplikacji załadowaliśmy i zrobiliśmy co trzeba jeśli chodzi o tekstury. Czas więc aby dobrał się do nich nasz shader, bo do tego właśnie jest przeznaczony - przerabianie danych pikseli to jego ulubione zajęcie. Pamiętamy jak to wszystko działało w przypadku vertex shaders - tam było prosto. Figura miała x wierzchołków, z których o każdym wiedzieliśmy. Taki wierzchołek wpadał do vertex shadera i tam był przetwarzany i w każdym miejscu wiedzieliśmy co się z nim dzieje. A co w przypadku tekstur? Ogólnie mówiąc - też jest podobnie, tylko że chodzi o piksele, ale możemy się poczuć tutaj trochę zakręceni. Chodzi oczywiście o piksele tekstury czy obiektu (kolory wierzchołków), ale wiemy, że w tym momencie nie możemy pominąć tak ważnej sprawy jak rodzaj cieniowania zastosowanego dla obiektu jak i rodzaju filtrowania zastosowanego do tekstury. Przecież w zależności od odpowiednich ustawień uzyskamy zupełnie inne efekty na ekranie! Tutaj powstaje więc pytanie w jaki sposób pixel shader pobiera piksele z bryły i skąd wie, jakie mają być kolejne wartości. Tutaj trzeba trochę wyobraźni, ale poradzimy sobie z tym jakoś razem. Wyobraźmy sobie, że nasz pixel shader przetwarza piksele bryły, która nie ma nałożonych tekstur. Pobiera więc pixel, coś z nim robi i przekazuje na wyjście. Żeby shader miał jakiś sensowny czas działania ilość tych pikseli jest w jakiś sposób ograniczona, ale czy ktoś jest mi w stanie powiedzieć ile pikseli ma bryła zbudowana z określonych wierzchołków? Przyznam szczerze, że tak naprawdę to nie mam pojęcia, w jaki sposób shader to robi. Pobierając kolor z bryły analizuje on kolory wierzchołków i na ich podstawie jest w stanie określić konkretny kolor, który zostanie mu przekazany przez rejestr wejściowy. Czy w jakiś sposób bazuje on na położeniu bryły na ekranie, czy przelicza jakieś współrzędne z płaskich na przestrzenne czy może stosuje jeszcze jakieś magiczne sztuczki - mnie nie pytajcie. Ale jeszcze bardziej fascynującą rzeczą jest to, że my wcale nie musimy wiedzieć w jaki sposób się to dzieje! Pamiętamy lekcję o teksturowaniu i o mieszaniu kolorów wierzchołków z kolorem nakładanej tekstury? Wtedy urządzeniu ustawialiśmy odpowiedni sposób mieszania kolorów i w efekcie otrzymywaliśmy na przykład na ścianie teksturę zabarwioną na czerwono (od koloru wierzchołków). I wcale nie przejmowaliśmy się tym, w jaki sposób się to dzieje, po prostu kolory się mieszały i już. I tak samo postąpimy w tym przypadku, bo i efekt działania pixel shadera będzie dokładnie taki sam jak tej prostej sztuczki ze wspomnianej ze mnie lekcji. Nas po prostu będzie interesować to, żeby powiedzieć shaderowi skąd ma pobrać dane a resztę załatwi sam. Ale w przeciwieństwie do tamtej metody będziemy mieć jedną zaletę. Otóż będziemy mieli w ręku

4 4 DirectX Piel shader 2 aktualnie pobrany z bryły czy tekstury kolor w jakimś rejestrze. W którym dokładnie miejscu licząc w pikselach na bryle to nie będzie nas to obchodzić, bo nas nie interesują miejsca a wartości kolorów. My możemy sobie odpowiednio zareagować na pojawienie się koloru, bo będziemy po prostu znali jego wartość. Wracając zaś do naszego programu - widzimy najpierw komentarz (zasady są takie same, jak ze znanego niektórym asemblera - rozpoczyna się po prostu średnikiem). Następnie są dwie instrukcje tex. Dokumentacja mówi, że powodują one załadowanie koloru z zsamplowanej tekstury do rejestru tekstury - inaczej mówiąc pobierają kolor tekstury do rejestru docelowego, którym jest w przypadku rejestr tekstury tn. Aby było jednak możliwe pobranie tego koloru, musi być spełnionych kilka warunków. Po pierwsze - tekstura musi być przypisana do określonego poziomu tekstury (za to jak wiemy odpowiedzialna jest funkcja SetTexture()). Po drugie - poziom taki ma ustawione pewne atrybuty powodujące określony wygląd tekstury - zalicza się do nich sposób filtrowania, funkcje mieszania i tym podobne (za te atrybuty odpowiedzialny jest szereg wywołań funkcji SetTextureStageState()). Wywołując instrukcję tex nakazujemy pobranie koloru piksela z tekstury, która jest w odpowiedni sposób przekształcona dzięki atrybutom poziomu na którym się znajduje. Pozostaje jedno zasadnicze pytanie - jeśli mamy kilka poziomów tekstur, to skąd instrukcja wie, z jakiego poziomu ma pobrać odpowiednią próbkę? Odpowiedź na to pytanie znajdziemy w rejestrze docelowym - jak wiemy jego nazwa to tn, gdzie n jest numerem poziomu, z jakiego należy pobrać próbkę. I tutaj od razu mała uwaga - działa to tak tylko w przypadku shaderów od wersji 1.0 do 1.3. W przypadku wyższych już inne jest to działanie i numer rejestru niekoniecznie musi się zgadzać z numerem poziomu, z jakiego jest pobierany kolor. Ponieważ my jednak mieścimy się w dolnej granicy wersji więc na razie poprzestaniemy na tej mniej skomplikowanej wiedzy. Najpierw pobieramy do rejestru t0 kolor z poziomu numer 0 a następnie do rejestru t1 z poziomu jak wskazuje nazwa rejestru. ; arithmetic instructions mul r0, t0, t1 Mając jakieś kolory, możemy z nimi zrobić co nam żywnie się tylko podoba. Pamiętamy z opisu teoretycznego pixel shaders, że rejestrem wyjściowym shadera jest rejestr oznaczony jako r0 - jest to zwykły rejestr tymczasowy, uzbrojony jednak w tę dodatkową funkcję. Widać tutaj istotną różnicę w stosunku do vertex shadera, gdzie rejestrów wyjściowych było tyle, żeby objąć nimi wszystkie wartości wierzchołka. Pixel shader produkuje tylko jedną wartość - kolor, więc nie potrzeba w zasadzie żadnych specjalnych rejestrów wyjściowych. Jasne jest więc, że jeśli potraktujemy rejestr r0 jako rejestr docelowy jakiejś instrukcji i będzie to ostatnią instrukcją shadera to wynik będzie jednocześnie kolorem wyjściowym. I taką właśnie minisztuczkę sobie tutaj zastosujemy - potraktujemy r0 jako rejestr wyjściowy instrukcji mnożenia dwóch rejestrów tekstur, które zastosowaliśmy wcześniej. A co powstanie w wyniku mnożenia kolorów? - oczywiście - nowy kolor. W zależności od tego, co będą zawierały nasze tekstury wynik tego mnożenia będzie różny - wszystko przecież zależy od kolorów, jakie będą występować na teksturze. Przypatrzmy się naszym teksturom bliżej - jedna jest dosyć kolorowym przedstawicielem swojego gatunku, druga to czarno-biała bitmapa (oczywiście w sensie występowania na niej ilości kolorów). I teraz - co powstanie przez pomnożenie kolejnych pikseli obydwu tekstur? Kolor biały drugiej tekstury to będzie w rejestrze wejściowym czwórka liczb float postaci (1.0f, 1.0f, 1.0f, 1.0f). Jeśli pomnożymy to przez wartości pikseli pierwszej tekstury to da się zauważyć, że... nic się nie zmieni! To znaczy w wyniku dostaniemy dokładnie niezmienione wartości z tekstury tej bardziej kolorowej. Tak więc kolor biały będzie jakby kolorem przeźroczystym. Idźmy teraz w drugą stronę. Kolor czarny z drugiej tekstury w rejestrze będzie się przedstawiał jako (0.0f, 0.0f, 0.0f, 0.0f). Jeśli pomnożymy przez to kolory pierwszej tekstury to otrzymamy co? No właśnie - same zera. Czyli kolor czarny będzie zupełnie nieprzeźroczysty w tym momencie. W wyniku połączenia w taki sposób tych konkretnych tekstur dostaniemy to co widać na obrazku poniżej. * = Można więc powiedzieć, że jest to dokładnie to, o co nam chodziło, prawda? No i tak też jest w istocie, chcieliśmy mieć efekt multitekstury, to go otrzymaliśmy. A że odbyło się to w zasadzie za pomocą jednej instrukcji asemblera! więc tym bardziej należy nam się chwała, bo nic nie ma ważniejszego w grafice 3D niż szybkość i minimalizacja kosztów wykonania. Dostaliśmy dokładnie taki sam wynik, jak przy zastosowaniu funkcji mieszania z Direct3D. Oczywiście nie będzie tak w każdym przypadku - tutaj specyfika jednej z tekstur pozwoliła oszczędzić czas na obliczeniach a osiągnięty efekt zupełnie nas zadowala. Ale jeśli pragniemy mieć dokładnie takie działanie jak wynika z równania na mieszanie to nic nie stoi na przeszkodzie, żeby takie w kodzie shadera zaimplementować przecież. Zestaw instrukcji jest aż nadto potężny do osiągnięcia zamierzonego przez nas celu. Nie wspomnę już tutaj nawet o zastosowaniu wszelkiej maści modyfikatorów, co jednak w przypadku takich prostych tekstur nie dałoby dobrych rezultatów - a wręcz przeciwnie, zepsułoby nam zupełnie efekt. Ale zapewniam, że nie zapomnimy o nich i już niedługo będzie okazja je wykorzystać na pewno. I to byłby w zasadzie koniec naszego shadera. Przyznam szczerze, że bardzo obawiałem się tych dwóch tutoriali, ale po

5 5 DirectX Piel shader 2 bliższym zaprzyjaźnieniu się z pixel shaders trzeba stwierdzić, że nie taki diabeł straszny. Mam nadzieję, że Wy też tak uważacie? ;). Oczywiście przedstawiłem tutaj najmniejszy z możliwych scenariuszy jeśli dotyczy pixel shaders - to zalicza się w zasadzie do podstaw już dzisiaj i bez takich umiejętności lepiej nie pokazujmy się światu. Nie zastosowałem żadnym modyfikatorów i masek, ale o powodach już wspomniałem - nie dałoby to dobrego efektu. Oczywiście w kolejnych lekcjach bez tego się na pewno nie obejdzie, więc przyjdzie jeszcze czas to omówić. A na tym zakończylibyśmy naszą lekcję, choć dodam jeszcze kilka uwag na koniec. Przykład ten standardowo, jeśli chodzi o kod źródłowy działa na urządzeniu emulowanym w software, dlatego jest tak wolno. Posiadam niestety na razie kartę GeForce 2MX, która nie posiada wsparcia sprzętowego ani dla vertex ani pixel shaders, dlatego zabawę z pikselami będziemy kontynuowali na razie w ten sposób. Posiadacze kart od GeForce3 w górę oraz odpowiednich typów kart ATI mogą sobie we wiadomym miejscu przestawić i sprawdzić jak to wygląda na żywym sprzęcie. Oczywiście nie muszę wspominać, że jeśli ktoś chce sobie napisać shadery w wersji już nawet 3.0 (DX SDK 9.0 już oferuje takie możliwości) to może sobie uruchomić emulację w software, bo kart, które to obsługują jeszcze nie ma na świecie ;). Przy pisaniu shaderów, zwłaszcza pikselowych pamiętajmy zawsze o wersji shadera i sprawdzajmy jak działa dana instrukcja czy rejestr w konkretnej wersji, bo możemy się nieźle nagłowić szukając w kodzie błędu, gdy Direct3D nas o tym poinformuje podczas kompilacji. Pamiętajmy także o kolejności instrukcji, które muszą występować w określonym porządku w kodzie, ponieważ inaczej shader oczywiście nam się zbuntuje i się po prostu albo nie skompiluje albo spowoduje błędy programu. Pamiętajmy także o sposobie traktowania tekstur - tak jak wspomniałem obejmujmy je raczej całościowo niż patrząc na poszczególne piksele. Przeważnie chodzi nam o jakieś operacje, które dotyczą całej tekstury a nie pojedynczych jej pikseli, ale w razie potrzeby można oczywiście odpowiednio zareagować. Możliwości jakie dostaliśmy w zamian za wysiłek włożony w poznanie shaderów i to zarówno vertex jak i pixel będzie nam się teraz zwracał w sposób nie dający się policzyć. Możemy od tej chwili zupełnie zapomnieć o normalnym, znanym od lat przekształcaniu wierzchołków i tekstur. Od dzisiaj możemy osiągnąć każdy efekt, jaki tylko chcemy i to na o wiele niższym poziomie a co za tym idzie mieć większą kontrolę niż dotychczas. W kolejnych lekcjach na pewno poznamy sztuczki, które będą umożliwiały tworzenie o wiele bardziej fascynujących efektów niż dotychczas a wszystko to - za pomocą shaderów oczywiście. Jeszcze tak na zakończenie oczywiście tak aby zachować jakąś ustaloną konwencję i na dowód, że to naprawdę działa oczywiście screen i otrzymany efekt. A z wami się żegnam na dzisiaj i do następnego, bardzo odlotowego tutorialu ;), bye!

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 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

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

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

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

1 Wskaźniki. 1.1 Główne zastosowania wskaźników 1 Wskaźniki Wskaźnik (ang. pointer) jest obiektem (zmienną) przechowującym adres pamięci. Definiowanie wskaźników: typ *nazwa wskaznika; np.: int *wsk na x;, double *xxx;, char *znak;. Aby można było pracować

Bardziej szczegółowo

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja

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

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

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

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

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

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 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

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT Temat: Zaimplementować system kryptografii wizualnej http://www.cacr.math.uwaterloo.ca/~dstinson/visual.html Autor: Tomasz Mitręga NSMW Grupa 1 Sekcja 2 1. Temat projektu

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

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

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

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

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

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

Przykładowe zadanie z unikania blokad.

Przykładowe zadanie z unikania blokad. Przykładowe zadanie z unikania blokad. Mamy system operacyjny, a w nim cztery procesy (,,,) i dwa zasoby (,), przy czym dysponujemy trzema egzemplarzami zasobu i trzema egzemplarzami zasobu. Oto zapotrzebowanie

Bardziej szczegółowo

1 DirectX Cell Shading

1 DirectX Cell Shading 1 DirectX Cell Shading Po lekcji teoretycznej czas pokazać, co możemy zrobić w praktyce. Jak już wiemy tak naprawdę cieniowanie kreskówkowe nie stanowi wielkiego problemu i cały ambaras polega w zasadzie

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

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

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

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

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

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

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

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

4. Funkcje. Przykłady

4. Funkcje. Przykłady 4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność

Bardziej szczegółowo

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ D3DFVF_DIFFUSE D3DFVF_TEX1 )

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ D3DFVF_DIFFUSE D3DFVF_TEX1 ) 1 DirectX Vertex shader 2 Witam w dzisiejszej, mam nadzieję bardzo ciekawej lekcji. Od teorii do praktyki czyli w sumie prawidłowo przejdziemy sobie dzisiaj na przykładzie najprostszego vertex shadera.

Bardziej szczegółowo

Przekierowanie portów w routerze - podstawy

Przekierowanie portów w routerze - podstawy Przekierowanie portów w routerze - podstawy Wyobraźmy sobie, że posiadamy sieć domową i w tej sieci pracują dwa komputery oraz dwie kamery IP. Operator dostarcza nam łącze internetowe z jednym adresem

Bardziej szczegółowo

Implementacja filtru Canny ego

Implementacja filtru Canny ego ANALIZA I PRZETWARZANIE OBRAZÓW Implementacja filtru Canny ego Autor: Katarzyna Piotrowicz Kraków,2015-06-11 Spis treści 1. Wstęp... 1 2. Implementacja... 2 3. Przykłady... 3 Porównanie wykrytych krawędzi

Bardziej szczegółowo

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import Fraction.h #import <stdio.h> #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

1 DirectX Piel shader 1

1 DirectX Piel shader 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

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

Część 11. Rozwiązywanie problemów.

Część 11. Rozwiązywanie problemów. Część 11. Rozwiązywanie problemów. 3 Rozwiązywanie problemów. Czy jest jakiś problem, który trudno Ci rozwiązać? Jeżeli tak, napisz jaki to problem i czego próbowałeś, żeby go rozwiązać 4 Najlepsze metody

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

Typy, klasy typów, składnie w funkcji

Typy, klasy typów, składnie w funkcji Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas

Bardziej szczegółowo

praca zbiorowa pod kierunkiem EXCEL nowych punktów widzenia

praca zbiorowa pod kierunkiem EXCEL nowych punktów widzenia praca zbiorowa pod kierunkiem EXCEL 20 nowych punktów widzenia Mateusza Grabowskiego 1 EXCEL 20 nowych punktów widzenia praca zbiorowa pod kierunkiem Mateusza Grabowskiego 3 Cześć! To ja, Mateusz, pomysłodawca

Bardziej szczegółowo

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje: Program 6 Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje: Funkcja pobierz_osobe wczytuje dane osoby podanej jako argument. Funkcja wypisz_osobe

Bardziej szczegółowo

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

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

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

Organizacja czasu 1

Organizacja czasu 1 Organizacja czasu 1 Organizacja czasu Czyli jak optymalnie wykorzystać czas. Michał Mielniczuk 2 Do dzieła!!! W tym poradniku, podam Ci kilka sposobów na to jak optymalnie organizować zadania, by zyskać

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu. Krótki artykuł opisujący trzy podstawowe konwencje wywoływania funkcji C++ (a jest ich więcej). Konwencje wywoływania funkcji nie są tematem, na który można się szeroko rozpisać, jednak należy znać i odróżniać

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

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

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

Transkrypcja wideo: Co warto wiedzieć o sprzedaży mieszanej? Q&A https://www.youtube.com/watch?v=hwfkiyitvqa

Transkrypcja wideo: Co warto wiedzieć o sprzedaży mieszanej? Q&A https://www.youtube.com/watch?v=hwfkiyitvqa Transkrypcja wideo: Co warto wiedzieć o sprzedaży mieszanej? Q&A https://www.youtube.com/watch?v=hwfkiyitvqa Anna Pisu - infakt.pl: Cześć! W dzisiejszym odcinku księgowego Q&A doradca podatkowy infaktu

Bardziej szczegółowo

Kodu z klasą. Skarb w zatrutej wodzie, cz. 2. Scenariusz 6

Kodu z klasą. Skarb w zatrutej wodzie, cz. 2. Scenariusz 6 W scenariuszu nr 6 kontynuujemy pracę rozpoczętą na poprzednich zajęciach i ukończymy cały scenariusz. Dzisiaj przygotujemy zdarzenia, gdzie fabryka zatruwa wodę i zwierzęta stają się agresywne oraz zaprogramujemy

Bardziej szczegółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

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

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

dr inż. Ryszard Rębowski 1 WPROWADZENIE

dr inż. Ryszard Rębowski 1 WPROWADZENIE dr inż. Ryszard Rębowski 1 WPROWADZENIE Zarządzanie i Inżynieria Produkcji studia stacjonarne Konspekt do wykładu z Matematyki 1 1 Postać trygonometryczna liczby zespolonej zastosowania i przykłady 1 Wprowadzenie

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

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

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

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty. Przyszedł czas na rysowanie własnych figur, czyli prymitywy, obracanie bitmap, oraz alpha blending-czyli półprzezroczystość. Będę opisywał tylko rzeczy nowe-nie ma potrzeby abym się powtarzał. Zaczynajmny

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

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY.

W języku C/C++ pomiędzy wskaźnikami a tablicami istnieje bardzo ścisły związek. Do onumerowania elementów w tablicy służą tzw. INDEKSY. LEKCJA 12. Wskaźniki i tablice w C i C++. W czasie tej lekcji: 1. Dowiesz się więcej o zastosowaniu wskaźników. 2. Zrozumiesz, co mają wspólnego wskaźniki i tablice w języku C/C++. WSKAŹNIKI I TABLICE

Bardziej szczegółowo

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy Marek Żukowicz 14 marca 2018 Streszczenie Celem napisania artykułu jest próba podania konstruktywnego dowodu, który wyjaśnia, że niewielka

Bardziej szczegółowo

Symulator tabletu z systemem Windows 8.

Symulator tabletu z systemem Windows 8. Symulator tabletu z systemem Windows 8. Witam w mojej kolejnej publikacji, tym razem dowiesz się: - Jak uruchomić symulator tabletu z w pełni funkcjonalnym systemem operacyjnym Windows 8; - Jak wykorzystać

Bardziej szczegółowo

Maciej Piotr Jankowski

Maciej Piotr Jankowski Reduced Adder Graph Implementacja algorytmu RAG Maciej Piotr Jankowski 2005.12.22 Maciej Piotr Jankowski 1 Plan prezentacji 1. Wstęp 2. Implementacja 3. Usprawnienia optymalizacyjne 3.1. Tablica ekspansji

Bardziej szczegółowo

Liczby losowe i pętla while w języku Python

Liczby losowe i pętla while w języku Python Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak

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

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany. Przedstawiamy algorytmy porządkowania dowolnej liczby elementów, którymi mogą być liczby, jak również elementy o bardziej złożonej postaci (takie jak słowa i daty). Porządkowanie, nazywane również często

Bardziej szczegółowo

projekt biznesowy Mini-podręcznik z ćwiczeniami

projekt biznesowy Mini-podręcznik z ćwiczeniami DARMOWY FRAGMENT projekt biznesowy Mini-podręcznik z ćwiczeniami Od Autorki Cześć drogi Czytelniku! Witaj w darmowym fragmencie podręcznika Jak zacząć projekt biznesowy?! Jego pełna wersja, zbiera w jednym

Bardziej szczegółowo

Szeregi o wyrazach dodatnich. Kryteria zbieżności d'alemberta i Cauchy'ego

Szeregi o wyrazach dodatnich. Kryteria zbieżności d'alemberta i Cauchy'ego Szeregi o wyrazach dodatnich. Kryteria zbieżności d'alemberta i Cauchy'ego Przy założeniu, że wszystkie składniki szeregu jest rosnący. Wynika stąd natychmiast stwierdzenie: są dodatnie, ciąg jego sum

Bardziej szczegółowo

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. 8. Wektory Przykłady 8.1. Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana. Uwaga! Kod poniżej. To zadanie można rozwiązać przy użyciu wiedzy

Bardziej szczegółowo

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS www.informatyka.edu.pl

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS www.informatyka.edu.pl To jeden z ostatnich odcinków naszego kursu. Mam nadzieję, że pisanie własnego programu było ciekawym doświadczeniem. Zaproponowana w tym odcinku funkcja uatrakcyjni twój program. Stworzymy tak zwane okno

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

DirectX Efekty D3DX ID3DXEffect

DirectX Efekty D3DX ID3DXEffect 1 DirectX Efekty Zanim przystąpimy do dalszego zgłębiania tajemnic naszego ulubionego pakietu, nadszedł czas aby... ułatwić sobie nieco pracę. Ktoś pewnie pomyśli, że bredzę, no bo co można sobie w naszych

Bardziej szczegółowo

6. Pętle while. Przykłady

6. Pętle while. Przykłady 6. Pętle while Przykłady 6.1. Napisz program, który, bez użycia rekurencji, wypisze na ekran liczby naturalne od pewnego danego n do 0 włącznie, w kolejności malejącej, po jednej liczbie na linię. Uwaga!

Bardziej szczegółowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami 1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.

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

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1) W odcinku III tworzyliśmy paski narzędzi. Umieszczaliśmy na panelach ikony, reprezentujące czynności (charakterystyczne dla edytorów tekstu). Musimy teraz przypisać każdemu przyciskowi jego czynność (wycinanie,

Bardziej szczegółowo

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna Strona 1 z 9 «Przykładowe zadania do cz. III ćwiczeń z genetyki Java pierwsze kroki w programowaniu (01)» Kategoria: java, Tagi: eclipse - java - programowanie. Autor: Grzegorz, napisał dnia: February

Bardziej szczegółowo

Podstawowym zadaniem, które realizuje

Podstawowym zadaniem, które realizuje Funkcje wyszukiwania i adresu INDEKS Mariusz Jankowski autor strony internetowej poświęconej Excelowi i programowaniu w VBA; Bogdan Gilarski właściciel firmy szkoleniowej Perfect And Practical; Pytania:

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

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

Gra Labirynt - Zajęcia 4

Gra Labirynt - Zajęcia 4 Gra Labirynt - Zajęcia 4 Cel zajęć: Zaprogramowanie duszków-potworów, aby utrudniały przejście przez labirynt. Poznanie nowej funkcji, która umożliwi liczenie punktów za zdobyte skarby. Przekazywane umiejętności:

Bardziej szczegółowo

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja Część VIII C++ Przedrostkowa i przyrostkowa inkrementacja i dekrementacja W poprzednim ćwiczeniu operatory inkrementacji i dekrementacji występowały w wersji przyrostkowej. Istnieje inny sposób zapisu

Bardziej szczegółowo

Strona 1 z 7

Strona 1 z 7 1 z 7 www.fitnessmozgu.pl WSTĘP Czy zdarza Ci się, że kiedy spotykasz na swojej drodze nową wiedzę która Cię zaciekawi na początku masz duży entuzjazm ale kiedy Wchodzisz głębiej okazuje się, że z różnych

Bardziej szczegółowo

Praktyka programowania projekt

Praktyka programowania projekt Praktyka programowania projekt Zadanie projektowe nr. 2 Gra PacMan K. M. Ocetkiewicz, T Goluch 19 listopada 2012 Plan prezentacji Opis 2 zadania projektowego Plan prezentacji Opis 2 zadania projektowego

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

Definiowanie układu - czyli lekcja 1.

Definiowanie układu - czyli lekcja 1. Definiowanie układu - czyli lekcja 1. Ten krótki kurs obsługi programu chciałbym zacząć od prawidłowego zdefiniowania układu, ponieważ jest to pierwsza czynność jaką musimy wykonać po zetknięciu się z

Bardziej szczegółowo

Karty graficzne możemy podzielić na:

Karty graficzne możemy podzielić na: KARTY GRAFICZNE Karta graficzna karta rozszerzeo odpowiedzialna generowanie sygnału graficznego dla ekranu monitora. Podstawowym zadaniem karty graficznej jest odbiór i przetwarzanie otrzymywanych od komputera

Bardziej szczegółowo

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków ZAWARTOŚCI 3 PLIKOW W WORDZIE: MAIN.CPP: #include #include #include pamięci // Potrzebne do memset oraz memcpy, czyli kopiowania bloków #include "Rysowanie_BMP.h" using

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

Zasady programowania Dokumentacja

Zasady programowania Dokumentacja Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika

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

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

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