Advancements in Technology and Rendering Time Efficiency

Ray-tracing
Szirmay-Kalos László
As technology advances, the
rendering time remains constant
.”
Jim Blinn
Illumination of an abstract light source
Directional = constant
;  
Point = decreases with the square of the distance
If occluded, zero
Local illumination: rough surfaces,
abstract light sources
For each 
abstract light source
pixel
Illumination of an abstract light source
Directional = constant
;  
Point = decreases with the square of the distance
If occluded, zero
For each 
abstract light source
Local illumination: rough surfaces,
abstract light sources
pixel
Ambient term
Local illumination
+ ambient term
GI
Visibility
Hit
 
firstIntersect
(
Ray
 ray)
 {
  
Hit
 bestHit;
  
for(
Intersectable
 
* obj 
: 
objects
)
 {
    
Hit
 hit = obj->
intersect
(ray
); 
//  
hit.
t 
< 0 
if no intersection
    if(hit.t > 0 && (bestHit.t < 0 || hit.t < bestHit.t))
 
bestHit = hit;
  }
 
 
if (dot(ray.dir, bestHit.normal) > 0) bestHit.normal *= -1;
  return 
bestH
it;
}
struct 
Ray
 {
  vec3 
start
;
  vec3 
dir
; 
// 
unit vector
  bool out;
 
// 
outside?
};
struct 
Hit 
{
  float 
t
;
  vec
3 
position
;
  
vec
3 
normal
;
  Material* 
material
;
  Hit
() { t = -1; }
};
Let it face towards us
!
if (
N
 
 
dir
 
> 0) {
N
 = -
N
}
pixel
Object 
= 
Intersectable
struct Intersectable 
{
  Material* 
material
;
  virtual 
Hit
 
intersect
(const 
Ray& ray
) = 0;
};
Ray - Sphere intersection
No root           1 root          2 roots
Only for sphere
!
struct 
Intersectable 
{
  Material* 
material
;
  virtual 
Hit
 
intersect
(const 
Ray
& ray)=0;
};
class 
Sphere
 : public 
Intersectable 
{
  
vec
3 
center
;
  float 
radius
;
public:
  
Hit
 
intersect
(const 
Ray
& ray) {
    
 
Hit hit;
 
vec3 dist = ray.start - center;
 
float a = dot(ray.dir,ray.dir);
 
float b = dot(dist, ray.dir) * 2;
 
float c = dot(dist, dist) - radius * radius;
 
float discr = b * b - 4 * a * c;
 
if (discr < 0) return hit; else discr = sqrtf(discr);
 
float t1 = (-b + discr)/2/a, t2 = (-b - discr)/2/a;
 
if (t1 <= 0) return hit; // t1>=t2 for sure
 
hit.t = (t2 > 0) ? t2 : t1;
 
hit.position = ray.start + ray.dir * hit.t;
 
hit.normal = (hit.position - center)/radius;
 
hit.material = material;
 
return hit;
   }
};
Sphere as
Intersectable
Implicit surfaces
Triangle
Render( )
     for each pixel 
p
 
Ray r = g
etR
ay( eye 
 pixel p )
      
 
color = 
trace
(ray)
 
WritePixel(
p
, color)
     endfor
end
ray
color
p
p
Ray tracing: Render
eye
Real world: user+screen
Virtual world: eye+window
C
amera: 
g
etRay
eye
lookat
right
up
p
 = 
lookat
 + 
right 
+ 
up
, 
            
, 
 
in [
-1
,1]
   
=
 lookat
 + 
(2
X/XM
-1)
right 
+ 
(2
Y/YM
-1)
up
Ray dir =
 normalize(
p – eye
)
p
X
Y
XM
YM
p
Normalized device coordinates
fov/2
vec
3 
trace
(Ray ray)
 
{
    
Hit 
hit = firstIntersect
(ray);
  
  
if(
hit.t
 < 0)
 
return 
L
a
;
 
// nothing
    
[
r
 
, 
N
 
,
 
k
a 
, 
k
d
 
, 
k
s
 , shine
] 
 
hit
;
    vec
3 
out
Rad
 
= 
k
a
 
*
 L
a
;
  
  
for(
each light source 
l
){
    
    
Ray shadowRay(
r
 
+ 
N
,
 
L
l
);
        
Hit shadowHit = 
firstIntersect
(shadowRay);
        
if(shadowHit.t < 0 || shadowHit.t > 
|
r
 - 
y
l
| 
)
    
   
     outRa
d +=
  
  
}
    
return 
outRad
;
}
ray
 
N
 
-ray.dir = 
V
 
Shadow
trace
 
L
in
L
in
 
*{
k
d 
(
L
l
 
N
)
+
+
k
s 
(
(
H
l
N
)
+
)
shine
}
 
DirectLight ()
l
 
N
Homework 
2
: Luxo Grandpa
Write a ray tracing program that renders a paraboloid
lamp, planar table and arbitrary quadratic or polygonal
object
s
 on the table. A point light source is in the focal
point of the paraboloid and casts shadows. In addition to
the point source, the scene is illuminated by an ambient
source. Objects can be diffuse-specular, or reflective or
refractive.
Radiance from 
reflection direction
Radiance from
refraction direction
Fresnel
1-Fresnel
Recursive ray-tracing
 
 
Shadow ray
 
Reflection
ray
 
Refraction ray
DirectLight()
vec
3 
trace
(Ray ray)
 
{
  
Hit 
hit
 = 
firstIntersect
(ray);
  if(
hit.t
 < 0)
 
return 
L
a
;
 
// nothing
  
vec3 outRad(
0, 0, 0);
  if(hit.material->rough) 
outRad
  
=
  
DirectLight(hit)
;
  if(hit.material->reflective){
    vec
3 ref
le
ctionDir = 
ref
le
ct
(
ray.dir
,
N
);
    
Ray 
reflectRay
(
r
 + 
N
, ref
le
ctionDir, ray.out);
    outRad
 +=
 
trace
(reflectRay)*
Fresnel
(
ray.dir,
N
);
  
}
  
if(hit.material->refractive)
 
{
    ior = (ray.out) ? n.x : 1/n.x;
    vec
3 refractionDir = 
refract
(
ray.dir
,
N
,ior);
    if (length(refractionDir) > 0) {
    
   Ray 
refractRay
(
r
 
- 
N
, refractionDir, !ray.out);
    
   
outRad
 +=
 
trace
(refractRay)*(vec3(1,1,1)–
F
resnel
(
ray.dir,
N
));
    }
  
}
  
return 
outRad
;
}
ray
 
N
 
V
trace
vec
3 
trace
(Ray ray
, 
int d
=0
)
 
{
  if (d > maxdepth) return 
L
a
;
  
Hit 
hit
 = 
firstIntersect
(ray);
  if(
hit.t
 < 0)
 
return 
L
a
;
 
// nothing
  
vec3 outRad(
0, 0, 0);
  if(hit.material->rough) 
outRad
  
=
  
DirectLight(hit)
;
  if(hit.material->reflective){
    vec
3 ref
le
ctionDir = 
ref
le
ct
(
ray.dir
,
N
);
    
Ray 
reflectRay
(
r
 + 
N
, ref
le
ctionDir, ray.out);
    outRad
 +=
 
trace
(reflectRay
,d+1
)*
Fresnel
(
ray.dir,
N
);
  
}
  
if(hit.material->refractive)
 
{
    ior = (ray.out) ? n.x : 1/n.x;
    vec
3 refractionDir = 
refract
(
ray.dir
,
N
,ior);
    if (length(refractionDir) > 0) {
    
   Ray 
refractRay
(
r
 
- 
N
, refractionDir, !ray.out);
    
   
outRad
 +=
 
trace
(refractRay
,d+1
)*(vec3(1,1,1)–
F
resnel
(
ray.dir,
N
));
    }
  
}
  
return 
outRad
;
}
ray
N
V
trace
Paul Heckbert
’s
business card
typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02};
 
struct sphere{ vec cen,color;double rad,kd,ks,kt,kl,ir}*s,
*best,sph[]={0.,6.,.5,1.,1.,1.,.9, .05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8, 1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,
.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1., 1.,5.,0.,0.,0.,.5,1.5,};yx;
 
double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A ,B;
{return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B;
 
{B.x+=a* A.x;B.y+=a*A.y;B.z+=a*A.z;return B;}
vec vunit(A)vec A;{return vcomb(1./sqrt( vdot(A,A)),A,black);}struct sphere
 
*intersect(P,D)vec P,D;{best=0;tmin=1e30;
s= sph+5;while(s-->sph)b=vdot(D,U=vcomb(-1.,P,s->cen)),u=b*b-vdot(U,U)+s->rad*s ->rad,u=u>0?sqrt(u):1e31,u=b-u>
1e-7?b-u:b+u,tmin=u>=1e-7&&u<tmin?best=s,u: tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color; 
struct sphere*s,*l;if(!level--)return black;if(s=intersect(P,D));else return amb;color=amb;eta=s->ir;d= -vdot(D,N=vunit(vcomb
(-1.,P=vcomb(tmin,D,P),s->cen )));if(d<0)N=vcomb(-1.,N,black),eta=1/eta,d= -d;l=sph+5;while(l-->sph)if((e=l ->kl*vdot(N,
U=vunit(vcomb(-1.,P,l->cen))))>0&&intersect(P,U)==l)color=vcomb(e ,l->color,color);U=s->color;color.x*=U.x;color.y*=
U.y;color.z*=U.z;e=1-eta* eta*(1-d*d);return vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt (e),N,black))):
black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->kd, color,vcomb(s->kl,U,black))));}
main(){printf("%d %d\n",32,32);while(yx<32*32) U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/114.5915590261),
U=vcomb(255., trace(3,black,vunit(U)),black),printf("%.0f %.0f %.0f\n",U);}/*minray!*/
 
OO decomposition
Scene
La
b
uild()
render()
f
irstIntersect()
t
race()
Intersectable
Hit
 intersect
()
Camera
eye, lookat,
up, right,
XM,YM
getRay()
Light
p, Lout, type
g
et
LightDir
()
g
etInRad()
getDist()
Sphere
center, R
intersect()
Mesh
intersect()
heterogeneous
collection
o
bject
s
Material
n,
 kappa
ka, 
k
d, ks, shine
reflective
refractive
rough
reflect()
refract()
Fresnel ()
shade()
CPU
GPU
Slide Note

Ray-tracing is a fundamental algorithm to render 3D scenes in a realistic way. It is the basis of many photorealistic rendering methods and are used extensively in movie production rendering.

Embed
Share

As technology progresses, rendering time remains constant in the field of computer graphics. Concepts like local illumination for rough surfaces and abstract light sources, ray-sphere intersection, and structuring of intersectable objects are discussed. The process involves ray tracing and handling of light sources to achieve realistic visual effects efficiently.


Uploaded on Sep 22, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. As technology advances, the rendering time remains constant. Jim Blinn Ray-tracing Szirmay-Kalos L szl

  2. Local illumination: rough surfaces, abstract light sources ?? pixel For each ??? abstract light source ???? ? ? ????? ??(?? ,?,?) cos+ ??? ?(?) Illumination of an abstract light source Directional = constant; Point = decreases with the square of the distance If occluded, zero

  3. Local illumination: rough surfaces, abstract light sources pixel For each ?? abstract light source ?? ? ? ????? {?? (?? ?)++?? ((?? ?)+)? ???} ?(?) Illumination of an abstract light source Directional = constant; Point = decreases with the square of the distance If occluded, zero

  4. GI Ambient term Local illumination + ambient term ????? ??(??,?,?) cos+ ???+ ?? ?? ?(?)

  5. struct Ray { vec3 start; vec3 dir; // unit vector bool out; // outside? }; Visibility pixel struct Hit { float t; vec3 position; vec3 normal; Material* material; Hit() { t = -1; } }; ????? ???(?) = ????? + ??? ?, ? > 0 Hit firstIntersect(Ray ray) { Hit bestHit; for(Intersectable * obj : objects) { Hit hit = obj->intersect(ray); // hit.t < 0 if no intersection if(hit.t > 0 && (bestHit.t < 0 || hit.t < bestHit.t)) bestHit = hit; } if (dot(ray.dir, bestHit.normal) > 0) bestHit.normal *= -1; return bestHit; } Let it face towards us! if (N dir > 0) {N = -N}

  6. Object = Intersectable struct Intersectable { Material* material; virtual Hit intersect(const Ray& ray) = 0; };

  7. Ray - Sphere intersection |? ?|2= ?2 ? ? ? No root 1 root 2 roots ???(?) = ????? + ??? ? |???(?) ?|2= (????? + ??? ? ?) (????? + ??? ? ?) = ?2 (??? ???)?2+ 2((????? ?) ???)? + (????? ?) (????? ?) ?2= 0 Wanted: the smaller from the positive roots Only for sphere! Surface normal: ? = (??? ? ?)/?

  8. struct Intersectable { Material* material; virtual Hit intersect(const Ray& ray)=0; }; Sphere as Intersectable class Sphere : public Intersectable { vec3 center; float radius; public: Hit intersect(const Ray& ray) { Hit hit; vec3 dist = ray.start - center; float a = dot(ray.dir,ray.dir); float b = dot(dist, ray.dir) * 2; float c = dot(dist, dist) - radius * radius; float discr = b * b - 4 * a * c; if (discr < 0) return hit; else discr = sqrtf(discr); float t1 = (-b + discr)/2/a, t2 = (-b - discr)/2/a; if (t1 <= 0) return hit; // t1>=t2 for sure hit.t = (t2 > 0) ? t2 : t1; hit.position = ray.start + ray.dir * hit.t; hit.normal = (hit.position - center)/radius; hit.material = material; return hit; } };

  9. Implicit surfaces Surface points:? ? = 0 Ray: ???(?) = ? + ? ? Ray parameter or the intersection ? : ? ? + ? ? = 0 Intersection point: ? = ???(? ) = ? + ? ? Normal vector = ?? ? Quadratic surfaces: ? ? = ?,1 ? [?,1]?= 0 Ray parameter of the intersection: ? + ? ? ,1 ? [? + ? ? ,1]?= 0 ?,0 ? [?,0]?(? )2+ 2 ?,1 ? ?,0?? + ?,1 ? ?,1?= 0 Normal vector: ?? ? = ? [? ,1]?first three coordinates.

  10. Triangle ? = (?? ??) (?? ??) ?? ?? ? ? ???(?) = ????? + ??? ? ?? ?? ?? (? ??) ? = 0 ?? ? =(?? ?????) ? ??? ? 1. Plane intersection: (???(?) ??) ? = 0, ? > 0 2. A metsz spont a h romsz g n bel l van-e? ((?? ??) (? ??)) ? > 0 ((?? ??) (? ??)) ? > 0 ((?? ??) (? ??)) ? > 0 Surface normal: ? or shading normals

  11. Ray tracing: Render Virtual world: eye+window Real world: user+screen ray p eye Render( ) for each pixel p Ray r = getRay( eye pixel p ) color = trace(ray) WritePixel(p, color) endfor end p color

  12. Camera: getRay YM up fov/2 lookat right eye Y p p X XM Normalized device coordinates p = lookat + right + up, = lookat + (2X/XM-1) right + (2Y/YM-1) up , in [-1,1] Ray dir = normalize(p eye)

  13. -ray.dir = V trace N Lin yl ray N Ll r vec3 trace(Ray ray) { Hit hit = firstIntersect(ray); if(hit.t < 0) return La; // nothing [r, N,ka , kd , ks , shine] hit; vec3 outRad = ka* La; for(each light source l){ Ray shadowRay(r + N , Ll); Hit shadowHit = firstIntersect(shadowRay); if(shadowHit.t < 0 || shadowHit.t > |r - yl| ) outRad += } return outRad; } DirectLight () Shadow Lin *{kd (Ll N)++ks ((Hl N)+)shine} l

  14. Homework 2: Luxo Grandpa Write a ray tracing program that renders a paraboloid lamp, planar table and arbitrary quadratic or polygonal objects on the table. A point light source is in the focal point of the paraboloid and casts shadows. In addition to the point source, the scene is illuminated by an ambient source. Objects can be diffuse-specular, or reflective or refractive.

  15. Recursive ray-tracing Refraction ray ? ???? ? ?? ? ? Reflection ray Shadow ray DirectLight() ????? ?? ?? ?++ ?? ?? ?+? ??? ?(? ?) ???(?) + (1 ?(? ?)) ???(?) ? ? ?? ??+ Radiance from refraction direction Radiance from reflection direction 1-Fresnel Fresnel

  16. trace V N yl vec3 trace(Ray ray) { ray Hit hit = firstIntersect(ray); if(hit.t < 0) return La; // nothing vec3 outRad(0, 0, 0); if(hit.material->rough) outRad = DirectLight(hit); Ll r if(hit.material->reflective){ vec3 reflectionDir = reflect(ray.dir,N); Ray reflectRay(r + N , reflectionDir, ray.out); outRad += trace(reflectRay)*Fresnel(ray.dir,N); } if(hit.material->refractive) { ior = (ray.out) ? n.x : 1/n.x; vec3 refractionDir = refract(ray.dir,N,ior); if (length(refractionDir) > 0) { Ray refractRay(r - N , refractionDir, !ray.out); outRad += trace(refractRay)*(vec3(1,1,1) Fresnel(ray.dir,N)); } } return outRad; }

  17. trace V N yl vec3 trace(Ray ray, int d=0) { if (d > maxdepth) return La; Hit hit = firstIntersect(ray); if(hit.t < 0) return La; // nothing vec3 outRad(0, 0, 0); if(hit.material->rough) outRad = DirectLight(hit); ray Ll r if(hit.material->reflective){ vec3 reflectionDir = reflect(ray.dir,N); Ray reflectRay(r + N , reflectionDir, ray.out); outRad += trace(reflectRay,d+1)*Fresnel(ray.dir,N); } if(hit.material->refractive) { ior = (ray.out) ? n.x : 1/n.x; vec3 refractionDir = refract(ray.dir,N,ior); if (length(refractionDir) > 0) { Ray refractRay(r - N , refractionDir, !ray.out); outRad += trace(refractRay,d+1)*(vec3(1,1,1) Fresnel(ray.dir,N)); } } return outRad; }

  18. Paul Heckberts business card typedef struct{double x,y,z}vec;vec U,black,amb={.02,.02,.02}; struct sphere{ vec cen,color;double rad,kd,ks,kt,kl,ir}*s, *best,sph[]={0.,6.,.5,1.,1.,1.,.9, .05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8, 1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1., .8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1., 1.,5.,0.,0.,0.,.5,1.5,};yx; double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A ,B; {return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B; {B.x+=a* A.x;B.y+=a*A.y;B.z+=a*A.z;return B;} vec vunit(A)vec A;{return vcomb(1./sqrt( vdot(A,A)),A,black);}struct sphere *intersect(P,D)vec P,D;{best=0;tmin=1e30; s= sph+5;while(s-->sph)b=vdot(D,U=vcomb(-1.,P,s->cen)),u=b*b-vdot(U,U)+s->rad*s ->rad,u=u>0?sqrt(u):1e31,u=b-u> 1e-7?b-u:b+u,tmin=u>=1e-7&&u<tmin?best=s,u: tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color; struct sphere*s,*l;if(!level--)return black;if(s=intersect(P,D));else return amb;color=amb;eta=s->ir;d= -vdot(D,N=vunit(vcomb (-1.,P=vcomb(tmin,D,P),s->cen )));if(d<0)N=vcomb(-1.,N,black),eta=1/eta,d= -d;l=sph+5;while(l-->sph)if((e=l ->kl*vdot(N, U=vunit(vcomb(-1.,P,l->cen))))>0&&intersect(P,U)==l)color=vcomb(e ,l->color,color);U=s->color;color.x*=U.x;color.y*= U.y;color.z*=U.z;e=1-eta* eta*(1-d*d);return vcomb(s->kt,e>0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt (e),N,black))): black,vcomb(s->ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s->kd, color,vcomb(s->kl,U,black))));} main(){printf("%d %d\n",32,32);while(yx<32*32) U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/114.5915590261), U=vcomb(255., trace(3,black,vunit(U)),black),printf("%.0f %.0f %.0f\n",U);}/*minray!*/

  19. OO decomposition Material n, kappa ka, kd, ks, shine reflective refractive rough Scene La build() render() firstIntersect() trace() heterogeneous collection Intersectable Hit intersect() reflect() refract() Fresnel () shade() objects Sphere center, R intersect() Mesh Camera eye, lookat, up, right, XM,YM getRay() Light p, Lout, type getLightDir() getInRad() getDist() intersect() CPU GPU CPU GPU

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#