[Re:] [lenox:] OpenCL Raytrace 'benchmark' v0.03 - Photon Mapping - BLOGOUT fórum

üzenetek

hozzászólások


d3tto
(csendes tag)

Ha már erre jártam, adot néhány használható ötletet, ami később jól jöhet.

Sokszor nem a CUDA tesz gyorsabbá egy programot, hanem néhány utasítás. Sokan nem ismerik a step(a,b)-t, ahol attól függően, hogy melyik paraméter a nagyobb 1 vagy 0 kerül a vektor komponensébe.
Ezzel az egyszerű utasítással egyszerre 3 IF-et lehet helyettesíteni.

Egy bounding box ellenőrzés, ami ennyi lenne:
if(pont.x >=bbox.min.x)
if(pont.y >=bbox.min.y)
if(pont.z >=bbox.min.z)
if(pont.x <=bbox.max.x)
if(pont.y <=bbox.max.y)
if(pont.z <=bbox.max.z) OKE

ennyire redukálódik:
float3 e=step(bbox.min, pont) + step(pont,bbox.max)
e.x=e.x+e.y+e.z
if(e==6) OKE

A futási idő sokkal rövidebb.

Egy raytracelt sugár és egy bounding box metszéspontját pedig így kapjuk meg a legrövidebben:
bbox.minmax=lerp(bbox.min,bbox.max,ray_orientation)
float3 e=(bbox.minmax-eye)/ray
float u=max(e.x,max(e.y,e.z))

Az első sor meghatározza, hogy a sugár a boxot melyik oldalról fogja eltalálni. A második EGYSZERRE számolja a box eye felé eső 3 oldalának a távolságát. Mivel mind egyenként egy-egy skalárművelet lenne, így egy időben elvégezhető a három egyszerre. A harmadik sor meghatározza, hogy melyik metszéspont van a legtávolabb. Ez kell nekünk, ebből kiszámítható az a pont, ahol a sugár metszi a boxot.

float3 pont=eye+ray*u
Ezután már csak az elején leírt ellenőrzést kell végrehajtani.
Ez így sokkal rövidebb, mint amit a neten általában találsz.

üzenetek