„SzgGrafVizsga20120613” változatai közötti eltérés
a autoedit v2: fájlhivatkozások egységesítése, az új közvetlenül az adott fájlra mutat |
|||
(Egy közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva) | |||
2. sor: | 2. sor: | ||
==1. Feladat== | ==1. Feladat== | ||
Írjon Cg nyelven olyan csúcspont-árnyaló és képpont-árnyaló programokat, amelyekkel az alábbi [[OpenGL]] kód egy teljes képernyőt | Írjon Cg nyelven olyan csúcspont-árnyaló és képpont-árnyaló programokat, amelyekkel az alábbi [[OpenGL]] kód egy teljes képernyőt lefedő téglalapot rajzol. | ||
glBegin(GL_QUADS); | glBegin(GL_QUADS); | ||
56. sor: | 56. sor: | ||
Ezzel a két programmal, a megadott vertexekkel a következő képet kaptam:<br/> | Ezzel a két programmal, a megadott vertexekkel a következő képet kaptam:<br/> | ||
<br/> | <br/> | ||
[[ | [[File:grafika_vertex_shader_korgyuru.png]]<br/> | ||
<br/> | <br/> | ||
A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet. | A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet. |
A lap jelenlegi, 2017. július 12., 14:23-kori változata
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
1. Feladat
Írjon Cg nyelven olyan csúcspont-árnyaló és képpont-árnyaló programokat, amelyekkel az alábbi OpenGL kód egy teljes képernyőt lefedő téglalapot rajzol.
glBegin(GL_QUADS);
glVertex2f(0.0f, 1.0f);
glVertex2f(0.0f, 0.0f);
glVertex2f(1.0f, 1.0f);
glVertex2f(1.0f, 0.0f);
glEnd();
A képpont színe legyen fekete, kivéve egy (normalizált eszközkoordinátákban) origó középpontú, 0.7 belső sugarú és 0.2 széles körgyűrűben, ahol a szín legyen fehér.
(15 pont)
Egy megoldás, amely közel jó eredményt ad:
Csúcspont árnyaló:
void vertex(in float4 position : POSITION,
out float4 oPosition : POSITION,
out float4 posTexcoord : TEXCOORD0)
{
if (position.x == 0.0) //x irányú nyújtás
position.x = -1.0;
if (position.y == 0.0) //y irányú nyújtás
position.y = -1.0;
oPosition = position; //végső pozíció kiadása (erre rajzol majd)
posTexcoord = oPosition; //pozíció a fragmens shadernak
}
Képpont árnyaló:
void fragment(in float4 position : TEXCOORD0,
out float4 oColor : COLOR)
{
float P = position.x * position.x + position.y * position.y; //x2 + y2
float innerR = 0.7 * 0.7; //r2
float outerR = 0.9 * 0.9; //R2
if (P >= innerR && P <= outerR) //a pontnak az r sugarú körön kívül és az R sugarú körön belül kell lennie
oColor = float4(1, 1, 1, 1);
else
oColor = float4(0, 0, 0, 1);
}
Mivel a fragmens shader alapból nem kapja meg a pozíciókat, csak a textúrakoordinátákat, ezért trükközni kell egy kicsit. A vertex shaderből a módosított pozícióvektort visszaadom, mint egy textúrakoordinátát, így már elérhető a fragmens shaderből is. Azért kell mindenképpen átadni, mert a vertex shader csak a csúcspontokat kezeli, tehát az csak a négy koordinátát kapja meg, és nyilván a négy sarok nincs benne a gyűrűben, tehát ha ott végeznénk a számításokat, akkor az egész kép fekete lenne. A fragmens shader viszont az összes képpontot kezeli, így ott elvégezhető a számolás.
Ezzel a két programmal, a megadott vertexekkel a következő képet kaptam:
A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet.
--Gabesz852 (vita) 2014. január 22., 15:12 (UTC)
2. Feladat
Írjon C++ függvényt, ami pontosan meghatározza, hogy egy r0 pontból *v* sebességgel kilőtt pontszerű gumilövedéknek _t_ idő múlva mi lesz a pozíciója. A lövedék egy síklapok határolta, konvex szobában pattog. A síklapok _N_ száma, ni normálvektorai és a tartalmazó síkok ξi origótól vett távolságai adottak. A normálvektorok a szoba belseje felé mutatnak, az origó a szobán belül van. A lövedék egyenes vonalban, egyenletes sebességgel mozog, amíg falnak nem ütközik. A falról visszapattan, de a sebesség falra merőleges komponensének 50%-át elveszti (a maradék 50% meg megfordul). Ne használjon közelítő, diszkrét idejű szimulációt, a feladatot sugárkövetési feladatként oldja meg!
(15 pont)
Bónusz kérdések (1 pont darabja)
a) Melyik a legtelítettebb szín és miért?
A fehér, mert az minden színt tartalmaz. Ha prizmába belelövünk egy fehér fénynyalábot, a szivárvány színeire bontva jön ki a másik oldalon.
b) Nevezzen meg egy G0 folytonos interpoláló görbét, ami teljesíti a konvex burok tulajdonságait is!
G0 folytonosság: két görbeszakasz értéke intervallumhatáron megegyezik.
Konvex burok tulajdonság: nem lép ki a kontrollpontok alkotta konvex sokszög határából.
Interpoláló: érinti a kontrollpontokat.
Ezeket a tulajdonságokat teljesíti pl. a törtvonal is (simán összekötöd a csomópontokat egyenes szakaszokkal).
c) Mi a környezet-leképezés (environment mapping)?
Ideális tükröket lehet így szimulálni. Külön leképzéssel meghatározzuk, hogy mi látszik a tükörirányban, majd a képet textúraként rátesszük a tükröző objektumra.
d) Mi a különbség a teljes visszaverődés és az ideális visszaverődés között?
Ideális visszaverődés: csak ideális tükörnél fordul elő; a beesési irány, a felületi normális és a kilépési irány egy síkban van, és a beesési szög megegyezik a kilépési szöggel.
Teljes visszaverődés: az optikailag sűrűbb anyagból a fény nem tud kilépni a ritkább anyagba. Amikor sugárkövetésnél a fénytörési irányt számolod, és a gyökjel alatti tag (1-(1-cos2alfa)/(n2)) negatív, akkor áll fenn. A tört fény mennyisége is hozzáadódik a visszaverődéshez. Így működik az üvegszál.
Idő: 60 perc
-- Main.voros - 2012.06.13.
--Gabesz852 (vita) 2014. január 22., 15:40 (UTC)