„SzgGrafVizsga20120613” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
14. sor: 14. sor:
 
glVertex2f(1.0f, 0.0f);
 
glVertex2f(1.0f, 0.0f);
  
glEnd;
+
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.
 
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)
 
(15 pont)
 +
 +
Egy megoldás, amely közel 100%-os 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;      //x^2 + y^2
 +
float innerR = 0.7 * 0.7;                                          //r^2
 +
float outerR = 0.9 * 0.9;                                          //R^2
 +
 +
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:
 +
 +
[[:File:grafika_vertex_shader_korgyuru.png]]
 +
 +
A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet.
 +
--[[Szerkesztő:Gabesz852|Gabesz852]] ([[Szerkesztővita:Gabesz852|vita]]) 2014. január 22., 15:12 (UTC)
  
 
==2. Feladat==
 
==2. Feladat==

A lap 2014. január 22., 15:12-kori változata

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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 feledő 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 100%-os 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; //x^2 + y^2 float innerR = 0.7 * 0.7; //r^2 float outerR = 0.9 * 0.9; //R^2

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:

File:grafika_vertex_shader_korgyuru.png

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?

b) Nevezzen meg egy Go folytonos interpoláló görbét, ami teljesíti a konvex burok tulajdonságait is!

c) Mi a környezet-leképezés (environment mapping)?

d) Mi a különbség a teljes visszaverődés és az ideális visszaverődés között?


Idő: 60 perc


-- Main.voros - 2012.06.13.