Számítógépes grafika és képfeldolgozás - Vizsga, 2015.01.06.
Amennyiben ki tudjátok egészíteni, vagy hibás számolást találtok nyugodtan változtassátok a cikket.
1. Feladat
Írjon OpenGL programrészletet, amely az alábbi textúrázott (glEnable(GL_TEXTURE_2D)), megvilágított (glEnable(GL_LIGHTING)) diffúz harmadrendű felületet jeleníti meg, mégpedig 2*100*100 háromszögre tesszellálva. A harmadrendű felület egyenlete:
A teljes textúrát rá kell húzni a felületre, amely a felület diffúz visszaverődési tényezőit tartalmazza. Feltételezheti, hogy a textúrát és a transzformációkat már feltöltöttük a GPU-ra, a szempozíció z koordinátája 1-nél nagyobb, a lookat pont az origo, a mélységbuffer algoritmus engedélyezve van, a hátsólap eldobás viszont tiltva, valamint a fényforrásokat már beállítottuk (glLight). Megoldandó viszont az anyagtulajdonságok beállítása (2p), a textúrázási környezet beállítása (1p) és a csővezeték táplálása (7p). A normálvektort analitikusan kell számítani.
A javasolt OpenGL függvények: glBegin, glEnd, glVertex, glNormal, glTexCoord, glMaterial, glTexEnv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, ...);
2. Feladat
Az alábbi programban az eye, lookat, Right és Up a világ-koordinátarendszerbeli kameraparaméterek, jelentésük a nevükből következően értelemszerű. Mit csinál (mit jelenít meg) a program? (3p) Alakítsa át úgy, hogy az sugárkövetéssel egy világ-koordinátarendszerben lévő ellipszoidot jelenítséen meg, amelynek súlypontja (1, 2, 3), főtengelyei a koordinátatengelyekkel párhuzamosak és hosszuk 4, 5, 6. Az ellipszoid diffúz+Blinn típusú, kd=(0.1, 0.1, 0.1), ks=(2,3,4), shininess=200. A teret irányfényforrás világítja meg az (1,2,3) irányból, melynek intenzitása (3,3,3). Jelölje meg azokat a programsorokat, amelyeket változás nélkül felhasználhat és azokat, amelyeket ki kell törölni (3p). Csak az új részeket kell megírni, a sugármetszést és a normálvektort analitikusan kell számolni (14p).
| Display függvény | Vertex shader | Pixel shader |
void Display() {
glBegin( GL_QUADS );
Vector p = lookat-Right+Up;
glTexCoord3f(p.x, p.y, p.z);
glVertex3f(-1, 1, 0);
p = lookat-Right-Up;
glTexCoord3f(p.x, p.y, p.z);
glVertex3f(-1, -1, 0);
p = lookat + Right - Up;
glTexCoord3f(p.x, p.y, p.z);
glVertex3f(1, -1, 0);
p = lookat + Right + Up;
glTexCoord3f(p.x, p.y, p.z);
glVertex3f(1, 1, 0);
glEnd();
}
|
void main(
in float4 hPosIn : POSITION,
in float3 wPosIn : TEXCOORD0,
out float4 hPosOut: POSITION,
out float3 wPosOut: TEXCOORD0 )
{
hPosOut = hPosIn;
wPosOut = wPosIn;
}
|
void main( in float3 p : TEXCOORD0,
uniform sampler3D volume,
uniform float3 eye,
out float3 color : COLOR )
{
float3 dir = normalize(p - eye);
float3 t0 = (float3(0,0,0)-eye)/dir;
float3 t1 = (float3(1,1,1)-eye)/dir;
float3 ti = min(t0, t1);
float3 to = max(t0, t1);
float ey = max(max(ti.x, ti.y), ti.z);
float ex = min(min(to.x, to.y), to.z);
color = float3(0,0,0);
if (ex > ey) {
float3 q, normal;
float dt = (ex - ey) / 128;
for(t = ey; t < ex; t += dt) {
if ( color.r == 0 ) {
q = eye + raydir * t;
if (tex3D(volume, q).r > 0.1)
color = float(1, 0, 0);
}
}
}
|