Grafikus csővezeték (Általános áttekintés) Grafikus csővezeték (Általános áttekintés)

Hasonló dokumentumok
Számítógépes grafika

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

3. Osztályok II. Programozás II

HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl

Grafikus csővezeték és az OpenGL függvénykönyvtár

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Tanács Attila. Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Grafikus csővezeték 1 / 44

ISA szimulátor objektum-orientált modell (C++)

Programozás II. 2. Dr. Iványi Péter

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Pénzügyi algoritmusok

OOP #14 (referencia-elv)

Nincs szinkronizáció és kommunikáció Csővezeték alkalmazása Párhuzamosítás

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

és az instanceof operátor

2D képszintézis. Szirmay-Kalos László

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

C++ programozási nyelv Konstruktorok-destruktorok

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

OpenGL Compute Shader-ek. Valasek Gábor

Az alábbi kód egy JSON objektumot definiál, amiből az adtokat JavaScript segítségével a weboldal tartalmába ágyazzuk.

Szoftvertechnológia alapjai Java előadások

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Pénzügyi algoritmusok

GPGPU alapok. GPGPU alapok Grafikus kártyák evolúciója GPU programozás sajátosságai

2. Generáció ( ) 3. Generáció (2001) NVIDIA TNT2, ATI Rage, 3dfx Voodoo3. Klár Gergely

A bemutatott példa a Phong modell egy egyszerűsített változatát alkalmazza a Blinn-Phong-féle megközelítést

Plakátok, részecskerendszerek. Szécsi László

Bevezetés a programozásba I.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Algoritmusok raszteres grafikához

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

Féléves feladat. Miről lesz szó? Bemutatkozás és követelmények

1. Alapok. Programozás II

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java II. I A Java programozási nyelv alapelemei

Matematikai programok

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozás II. ATM példa Dr. Iványi Péter

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Általános áttekintés. Általános áttekintés

1. Jelölje meg az összes igaz állítást a következők közül!

Programozási nyelvek Java

Programozás C és C++ -ban

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Általános áttekintés. A módszer lényege

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Matematikai programok

Grafikus csővezeték 2 / 77

GPU Lab. 11. fejezet. Vizualizáció. Lectures on Modern Scientific Programming Wigner RCP November D. Berényi M. F.

Programozás Minta programterv a 2. házi feladathoz 1.

OSZTOTT 2D RASZTERIZÁCIÓS MODELL TÖBBMAGOS PROCESSZOROK SZÁMÁRA

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Az MTA Cloud a tudományos alkalmazások támogatására. Kacsuk Péter MTA SZTAKI

4. Öröklődés. Programozás II

Objektumorientált programozás C# nyelven

Számítógép és programozás 2

Magas szintű optimalizálás

A C# programozási nyelv alapjai

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Objektumorientált programozás C# nyelven

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Már megismert fogalmak áttekintése

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

14.2. OpenGL 3D: Mozgás a modellben

Párhuzamos és Grid rendszerek

C programozási nyelv

Számítógépes Graka - 4. Gyak

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

BME MOGI Gépészeti informatika 13.

GRAFIKA PROGRAMOZÁSA. Bemutatkozás és követelmények. Dr. Mileff Péter

Tájékoztató. Használható segédeszköz: -

A C# PROGRAMOZÁSI NYELV

C++ programok fordítása

Valasek Gábor

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Klár Gergely 2010/2011. tavaszi félév

5-6. ea Created by mrjrm & Pogácsa, frissítette: Félix

C++ programozási nyelv

Mintavételes szabályozás mikrovezérlő segítségével

Java grafikai lehetőségek

117. AA Megoldó Alfréd AA 117.

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Java II. I A Java programozási nyelv alapelemei

Bevezetés a programozásba I.

OOP: Java 8.Gy: Abstract osztályok, interfészek

GPU Lab. 14. fejezet. OpenCL textúra használat. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Feldspar: Nyelv digitális jelfeldolgozáshoz

Iman 3.0 szoftverdokumentáció

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Átírás:

Dr. Mileff Péter 2 Grafikus csővezeték (Általános áttekintés) A grafikus csővezeték(graphics pipeline): feldolgozási szakaszok egy elméleti modellje ezen keresztül küldjük a grafikai adatokat, hogy megkapjuk a várt eredményt Végeredmény: pixelek összessége a képernyőn Megvalósításai: 1. Szoftveres: CPU segítségével Korai korszak 2. Hardveres: a GPU-ban Mai korszak 3. A kettő kombinációjaként Átmeneti időszak (mai korszak) Grafikus csővezeték (Általános áttekintés) A feldolgozási szakaszok: nem mások, mint adat átalakítási folyamatok térbeli koordinátákkal kezdünk és rasztergrafikus képet kapunk eredményképpen. A valóságban összetett folyamatok együttese A csővezeték modell folyamatosan változik: Az adott technológiai fejlődés indukálja Pl. a GPU-k fejlődésének iránya nagyban befolyásolja, hogy mely feladatokat kell szétbontani, melyeket pedig összevonni Kezdetben: csakis szoftveres (fix funkcionalitású, fixed function pipeline) futószalag támogatás volt a jellemző - CPU A GPU-k megjelenésével és fejlődésével ez megváltozott 3 4 1

Grafikus csővezeték (Általános áttekintés) OpenGL ES 1.0 fixed pipeline A csővezeték általános modellje 5 6 OpenGL ES 2.0 programozható csővezeték Grafikus csővezeték (Általános áttekintés) A fix funkciós csővezeték: nagy hátránya az volt, hogy a GPU-val csakis rögzített művelet végrehajtása volt lehetőség. A GPU-k egyre gyorsabbak lettek: nőtt az igény arra, hogy a futószalagot valamilyen módon programozni is lehessen A programozhatóság mértéke kezdetben minimális volt A lehetőségek az évek során folyamatosan bővültek: Kialakultak az árnyaló nyelvek a csővezeték így egyre inkább programozhatóvá vált. 7 8 2

Grafikus csővezeték (Általános áttekintés) Grafikus csővezeték (Általános áttekintés) A folyamatos fejlődés miatt a csővezetékek is átalakultak A teljes programozhatóság irányába A döntés a miénk: A készítendő grafikus alkalmazás esetén ki kell választani, hogy mely grafikus API-ra akarunk építeni és annak milyen verzióit szeretnénk támogatni. A csővezeték és a funkciók hardveres támogatása ugyanis ettől függ. Példa 1: szeretnénk Vertex Buffer Object (VBO) típusú adattárolást alkalmazni Asztali gépek: az OpenGL 1.5-től magasabb verziószámot támogató videokártyák esetén tehetjük meg. Mobileszközök: az OpenGL ES 1.1-től magasabb chipek támogatják csak. Példa 2: Vertex és fragment programokat csak az OpenGL ES 2.0-tól tudunk futtatni. 9 10 OpenGL 3.0 újításai A hardverek erőteljes fejlődése miatt igény merült fel az API átalakítására olyan módú átalakításra, hogy a hardver változásokat jobban tudja követni közelebb kerülni a hardverhez. Getting back to the bare metal for performance - Michael Gold az Nvidia részéről. Megoldás: El kell tüntetni azokat a funkciókat, amelyeket már alig használnak, csak a kompatibilitás rétegben meghagyni. 11 12 3

OpenGL 3.0 újításai OpenGL 3.0 újításai A 3.0-tól szakítottak a fix funkciós csővezetékkel Mit jelent ez? a fix futószalag bizonyos részeit nem használhatjuk ezen részek implementációját a programozónak kell elvégeznie az árnyaló nyelv segítségével. Új objektum modell került az OpenGL 3.0 középpontjába. Két fő oka: az egész rendszer és a driver teljesítményének növelése, a kliensoldali objektum kezelés könnyítése és robusztussá tétele. A teljesítmény növelésének eszközei: egyazon objektumhoz tartozó összes tulajdonságot magában foglalja Pl. VAO Vertex Array Object Opengl 3.2 ezeket atomi egységként adja át az API-nak. Így biztosítható az átadott objektumok teljessége, elkerülve a banális, ám nehezen felderíthető programozói hibákat. Az általános cél: csökkentsük a driver által keltett többletterheléseket, egységesítve és egyszerűsítve az objektumok kezelését a programozó szemszögéből. 13 14 OpenGL 3.0 újításai Néhány példa az elhagyott funkciókból: glbegin/glend, gltranslate, glrotate, glidentity, glcolor3f, stb. Ezek pontos leírását az OpenGL aktuális specifikációjából nyerhetjük ki. 15 16 4

Programozható párhuzamos processzorok Vertex processzor általános modellje Egy GPU kétféle programozható processzorral rendelkezik vertex és fragment processzorok Vertex processzor: a vertex streameken hajtják végre a műveleteiket Pl. eltolás, forgatás, stb A processzor egy vertex programot hajt végre, vertex shader csúcspont árnyaló Egy fragment stream outputot állít elő, amit a fragment processzor egy fragment program segítségével dolgoz fel, fragment shader pixel árnyaló és állítja elő az egyes pixelek végleges színét. 17 18 Programozható párhuzamos processzorok Fregment processzor általános modellje Fragment processzor (Pixel processzor): olyan programozható egység, amely a textúrázáshoz előkészített képtöredékek feldolgozására szolgál. Általánosan elterjedt, hogy több fragment processzor foglal helyet a GPU-ban. Tipikusan feladata: a geometriailag előkészített potenciális képpontok színének manipulálása, minden pixelre végrehajt egy felhasználói programot. 19 20 5

Árnyaló nyelvek Segítségükkel programozhatjuk a GPU vertex és fragment processzorait Lehetővé a fix funkciós csővezeték kihagyását a programozó számára. Nyelvek jellemzői: Kezdetben nem voltak magas szintű nyelvek, csakis Assembly nyelvel lehetett shader programot írni. A mai kialakult nyelvek sokévnyi fejlődés eredményei, három fő meghatározó irányból fejlődtek ki: 1. Általános programozási nyelvek 2. A grafikus interfész nyelvek 3. Maguk az árnyalók 21 22 Árnyaló nyelvek Árnyaló nyelvek fejlődése A programok közös nyelvi alapja a C nyelv A szintaktika és szemantika szempontjából a mai legfőbb árnyaló nyelvek is ezen alapulnak Ismertebb nyelvek: CG (C for Graphics) NVIDIA Első GPU árnyaló nyelvek egyike GLSL (GLslang) OPENGL HLSL (High Level Shading Language) MICROSOFT XBOX XNA DirectX 23 24 6

OpenGL Assembly Language (Példa pregment árnyalóra) GLSL Language (Példa pregment árnyalóra)!!arbfp1.0 TEMP color; MUL color, fragment.texcoord[0].y, 2.0; ADD color, 1.0, -color; ABS color, color; ADD result.color, 1.0, -color; MOV result.color.a, 1.0; END #version 120 void main(void) { gl_fragcolor = vec4(1.0, 0.0, 0.0, 1.0); 25 26 GLSL nyelv OpenGL Shading Language (gyakran glslang) Az OpenGLARB szervezet hozta létre az OpenGL 1.4 kiterjesztéseként Később az OpenGL 2.0-nél már teljes mértékben a szabvány részévé vált. Jellemzője: magas szintű árnyaló nyelv, a C nyelv szintaktikáján alapszik A fejlesztőknek lehetővé teszi, hogy közvetlen módon vezéreljék a grafikus csővezetéket anélkül, hogy assembly-t vagy valamilyen hardver közeli nyelvet keljen használniuk. 27 28 7

GLSL nyelv GLSL árnyalók alkalmazása Jellemzője (folytatás): Platformfüggetlen, támogatja többek között a GNU/Linux, Windows és Mac OS X operációs rendszereket. A GLSL-ben írt shaderek bármely grafikus kártyán használhatóak, amelyek támogatják a GLSL-t. Minden grafikus kártya driver tartalmazza a GLSL fordítót, így a grafikus kártya gyártók optimalizálhatják a fordító által előállított kódot a kártya architektúrájának megfelelően. A shader programok alapvetően az adatpárhuzamosságra épülnek, a párhuzamosság módja driver implementáció függő. Különbözően lehetnek optimalizálva a párhuzamosan futó programok közti kommunikációt nem támogatják. A programok reprezentációja szöveges nyelven történik. C nyelv szintaktikáján alapul A kódolás során csúcs- és pixelárnyalókat kell írnunk Akár külön fájlban, akár a programkódban karakterláncként tárolva. Általában azonban az árnyalókat külön fájlban helyezik el Például: akarmi.vert, akarmi.frag. A fájl kiterjesztés nem releváns tartalma fogja eldönteni, hogy melyik típusú árnyalóról van szó. Enne ellenére célszerű a kiterjesztésben is jelezni ezt 29 30 GLSL árnyalók alkalmazása GLSL árnyalók alkalmazása Az árnyalók forrásszövege: az UTF-8 kódolású Unicode karakterek egy részhalmazát tartalmazhatják. A forráskód ezen jelekből alkotott string több sorban helyezkedhet el. Tartalmazhatnak direktívákat a fordítónak, változó deklarációkat, stb a fájl elején. A változókat különböző minősítőkkel is elláthatjuk Pl. tárolás, memória, precizitás, layout jelezve annak egyéb tulajdonságait Minden árnyalónak rendelkezni kell egy main függvénnyel, jelzi a program belépési pontját Árnyalók használata: Az árnyaló fájlok betöltését a felhasználónak saját kezűleg kell elvégeznie Az OpenGL erre közvetlen lehetőséget nem biztosít. Jelentése: a fájlok memóriába való olvasását kell manuálisan megtenni az OpenGL innen már biztosít lehetőséget a tényleges shader objektum létrehozására. 31 32 8

GLSL Mintapélda Mire lesz szükség? 1. Egy egyszerű shader osztály Képes eltárolni a betöltött shaderek azonosítóit és az objektumokat. 2. Árnyaló fájlok betöltése a hdd-ről 3. OpenGL objektumok létrehozása a megfelelő árnyalóknak hibakezeléssel 4. egy példában Árnyalók aktiválása és deaktiválása 33 34 /// Simple Shader class class CShader { /** Global ID for Shader */ unsigned int m_ishaderid; /** Fragment Shader name */ string m_pfragmentshader; /** Vertex Shader name */ string m_pvertexshader; /** OpenGL Shader handler */ GLuint m_pshaderhandler; public:... Shader osztály (C++) Mit célszerű tárolni? a grafikus motor számára az osztályt egyedileg azonosító id-t (m_ishaderid), a shaderek fájlneveit, az OpenGL belső shader azonosítóját, egy előjel nélküli szám. 35 36 9

(árnyalók betöltése) bool CShader::setShaders(string fragment_shader, string vertex_shader){ GLuint v,f; /** Loading vertex shader source file */ m_pvertexshader = LoadShaderSource(vertex_shader.c_str()); if (m_pvertexshader.c_str() == NULL) { cout << "\nerror: Cannot Load vertex shader: " << vertex_shader.c_str() << endl; return false; /** Loading fragment shader source file */ m_pfragmentshader = LoadShaderSource(fragment_shader.c_str()); if (m_pfragmentshader.c_str() == NULL){ cout << "\nerror: Cannot Load fragment shader: " << fragment_shader.c_str() << endl; return false; (árnyalók betöltése) /** If everything was good, we initialize shader */ const char *vv = m_pvertexshader.c_str(); const char *ff = m_pfragmentshader.c_str(); v = glcreateshader(gl_vertex_shader); f = glcreateshader(gl_fragment_shader); A shader források betöltése után az OpenGL shader objektumok létrehozását a glcreateshader függvénnyel tehetjük meg. A függvény paramétere a létrehozandó shader objektum típusa (jelen példában vertex és fragment). 37 38 (árnyalók betöltése) glshadersource(v, 1, &vv, NULL); glshadersource(f, 1, &ff, NULL); A betöltött szövegek shader objektumokhoz való társítása történik a glshadersource függvény segítségével. Paraméterek: A shader objektum, amelyhez a forrást társítani szeretnénk, A társítani kívánt szövegforrások száma. Ezt követi a forrás szöveg, Majd egy NULL érték, azt jelenti, hogy az OpenGL a forrás szöveget NULL karakterrel zárt. glcompileshader(v); (árnyalók betöltése) A fenti sorral pedig megtörténik a fordítása a kódnak. Majd pedig a hibakezelés következik: GLint status; glgetshaderiv(v, GL_COMPILE_STATUS, &status); if (status == GL_FALSE) { GLint infologlength; glgetshaderiv(v, GL_INFO_LOG_LENGTH, &infologlength); GLchar *strinfolog = new GLchar[infoLogLength + 1]; glgetshaderinfolog(v, infologlength, NULL, strinfolog); printf("\nerror: Compile failure in %s shader: %s ", vertex_shader.c_str(), strinfolog); delete[] strinfolog; return false; 39 40 10

(árnyalók betöltése) Ugyanez a fregment shader -re is elvégezve: glcompileshader(f); glgetshaderiv(f, GL_COMPILE_STATUS, &status); if (status == GL_FALSE){ GLint infologlength; glgetshaderiv(f, GL_INFO_LOG_LENGTH, &infologlength); GLchar *strinfolog = new GLchar[infoLogLength + 1]; glgetshaderinfolog(f, infologlength, NULL, strinfolog); printf("\nerror: Compile failure in %s shader: %s",fragment_shader.c_str(),strinfolog); (árnyalók betöltése) A hibakezelés után már csak a shader program létrehozása maradt hátra: m_pshaderhandler = glcreateprogram(); glattachshader(m_pshaderhandler,v); glattachshader(m_pshaderhandler,f); gllinkprogram(m_pshaderhandler); Első lépésként egy üres program objektumot hozunk létre, majd a korábban létrehozott shader objektumokat társítjuk a programhoz. delete[] strinfolog; return false; 41 42 (árnyalók betöltése) Végezetül a program linkelése következik és státuszának ellenőrzése: glgetprogramiv(m_pshaderhandler, GL_LINK_STATUS, &status); if (status == GL_FALSE){ GLint infologlength; glgetprogramiv(m_pshaderhandler, GL_INFO_LOG_LENGTH, &infologlength); GLchar *strinfolog = new GLchar[infoLogLength + 1]; glgetprograminfolog(m_pshaderhandler, infologlength, NULL, strinfolog); printf("\nerror: Linker failure in %s shader: %s", fragment_shader.c_str(), strinfolog); delete[] strinfolog; return false; return true; Mintapélda: 2D textúrázott négyzet kirajzolása Textúra szín (RGB) állítása árnyaló segítségével Régi glbegin/glend páros alkalmazása 43 44 11

Az alkalmazás során három fontos lépést kell követni: Árnyaló aktiválása, paraméterek átadása: kiválasztjuk a megfelelő árnyalót és átadjuk a szükséges paramétereket Objektumok rajzolása: kirajzolunk minden olyan objektumot, amelyre érvényes lesz az árnyaló hatása Árnyaló kikapcsolása: amennyiben az árnyaló már nem szükséges, ki kell kapcsolni. Az árnyalók kikapcsolása kulcsfontosságú: ennek hiányában a később kirajzolt elemek megjelenítésében ez gondot okozhat. Tipikusan ilyen hiba: a kirajzolt objektum(ok) után a grafikus user interface más színű lesz. Mivel a user interface-t mindig legkésőbb kell kirajzolni, mert az kerül legfölülre, így általában itt szokott jelentkezni a kérdéses probléma. Mi történik akkor ha az árnyaló hibás? A vázolt betöltő jelzi a fordítási hibát, de ennek ellenére a szoftver futni fog. Legtöbb esetben a megjelenítés ilyenkor visszakapcsol a grafikus API beépített funkcióira. Például fények esetében a fix funkciós árnyalásra. 45 46 void DrawQuad() { //glcolor4f(red,green,blue,alpha); // Fixed pipeline!!! glactivetexture(gl_texture0); // Bind to Texture Unit 0 glbindtexture(gl_texture_2d, textureid); // Bind texture A GPU első textúrázó egységéhez rendeljük a korábban betöltött textúra azonosítóját. A fenti sor jelentené a fix funkciós csővezeték használatát. Aktiválva és a shader kódot kikommentezve ugyanazt az eredményt kell kapjuk. Egyszerre nincs értembe használni, mert úgyis a shader program lesz az elsődleges. // Using shaders Gluint shandler = shader->m_pshaderhandler; gluseprogram(shandler); gluniform4f(glgetuniformlocation(shandler, "color"),red,green,blue,alpha); 47 48 12

Ezt követően kirajzoljuk a négyzetet a megszokott módon: Az árnyalót gluseprogram segítségével tudjuk használatba venni megadva a használni kívánt shader azonosítóját. Az utasítás jelzi az OpenGL-nek hogy a következő renderelési utasításokra az árnyaló lesz alkalmazva a fix funkciós csővezeték helyett. A textúra színeinek módosítása: az árnyalónak átadjuk az aktuális RGBA változók értékét a gluniform4f függvény segítségével. A programsor az aktuális árnyalóban megkeresi a color változó helyét, és áttölti a megadott színértékeket. glbegin(gl_quads); gltexcoord2f(0, 1); glvertex2f(0, 256); gltexcoord2f(1, 1); glvertex2f(256, 256); gltexcoord2f(1, 0); glvertex2f(256, 0); gltexcoord2f(0, 0); glvertex2f(0, 0); glend(); // Disable shader effect gluseprogram(0); 49 50 (Vertex árnyaló) Vertex árnyaló: feladata nagyon egyszerű Szeretnénk a textúra koordinátákat elérni a pixel árnyalóban is: így ezt a v_texcoord változóban tároljuk lekérve a 0-ás textúrázó egységtől. Azért a nullástól, mert a kirajzoláskor ehhez az egységhez kötöttük a textúrát A változó varying minősítéssel van ellátva. Az ftransform() függvény szerepe pedig a vertex-ek transzformálása a megfelelő 3D koordinátákra. Lényegében mátrixok szorzását rejti el, a következő kód azonos vele: gl_position = gl_modelviewprojectionmatrix * gl_vertex; Vagy: gl_position = gl_projectionmatrix * gl_modelviewmatrix * gl_vertex; varying vec2 v_texcoord; void main(){ v_texcoord = gl_multitexcoord0.xy; gl_position = ftransform(); // Deprecated from GLSL 1.40 51 52 13

(Pixel árnyaló) Pixel árnyaló: feladata nagyon egyszerű feladata az, hogy a textúra képpontjait és a beállított színt kombinálja egymással. Ehhez nem kell mást tenni, mint a összeszorozni a két értéket. A kódban a texcolor változó fogja tárolni az aktuális textúra pixel színét. A fájl elején uniform minősítéssel ellátott color változó a shader-nek a felhasználói programból átadott szín. A végleges pixel színt a gl_fragcolor-nak adva adhatjuk meg. uniform sampler2d diffusetex; uniform vec4 color; varying vec2 v_texcoord; void main(){ vec4 texcolor = texture2d(diffusetex,v_texcoord); gl_fragcolor = texcolor *color; 53 54 Shader programok optimalizálása Shader programok optimalizálása A magas teljesítmény érdekében az árnyalókkal a megfelelő módon kell bánni. Az árnyalók gyakori váltása költséges a GPU számára! A túl sok árnyaló váltás megöli a grafikai rajzolás teljesítményét Váltás: például az egyik objektum az X shader-tt alkalmazza a kirajzoláshoz, a másik pedig Y-t. Egy komplex grafikai alkalmazás (pl. játék) esetén ezeket célszerű optimalizálni Az optimalizálás alapja: ha az előzőleg használt shader megegyezik azzal az shader-rel, amivel most akarok rajzolni, akkor nem kell a shader-eket váltani. Megvalósítása: egy logikai rajzolási csoportba kell gyűjteni azon objektumokat, amelyek azonos árnyalót igényelnek. A rajzolás folyamatát az egyes listákra külön végezzük el: 1. a lista elején aktiváljuk az árnyalót (gluseprogram), 2. majd kirajzoljuk az összes objektumot, 3. végül pedig lezárjuk az árnyalót. Az így kialakított rendszerben az árnyaló váltások száma minimális lesz 55 56 14

57 15