This post is an update on various things. First, as many have heard judging from my emails, I had a serious car accident about 5 weeks ago. I am back at work at NVIDIA and am 98% recovered. Lessons: drive carefully and have a car with side air bags :) Also, for those of you in the car market, here is a great site for crash ratings.

Happily, Peter-Pike Sloan just joined me as an office mate at NVIDIA! Feel free to suggest here what problems you think we should work on :) You can note his new affiliation at google scholar, which has a new cool way to fix attributions etc (so please join and update your data): new google scholar. This is part of a trend in NVIDIA hiring the smartest Finns in graphics with Kari Pulli leading our vision and computational photography efforts now!

Peter-Pike and his student Brad Loos have a new paper linked here. I think this is likely to become one of the most influential rendering papers ever, but even if I turn out to be wrong, it's worth a read.

While I was on medical leave I wrote a short post-apocalypse novel for my daughter. It was a lot of fun and I made it a Kindle book (you can read that on anything with a free reader). It's aimed at 12 year olds, but feel free to read it. Here is a link to ebook The Book of Max. Note it is $2.99 and I don't want to make any money off graphics people so email me if you want me to send you a gift chit for it.

## Thursday, November 24, 2011

## Thursday, February 24, 2011

### New I3D paper posted

I just posted a recent i3d paper:

paper page

The basic idea on this paper is to take a stochastic sampled set of samples from a stochastic rasterizer or a ray tracer and use a signal dependent blur. The take-away is: you can do a sweep algorithm because front effects back more than vice-versa.

paper page

The basic idea on this paper is to take a stochastic sampled set of samples from a stochastic rasterizer or a ray tracer and use a signal dependent blur. The take-away is: you can do a sweep algorithm because front effects back more than vice-versa.

## Tuesday, January 18, 2011

### Improved code for concentric map

If you need to warp points on a square to a disk, many people use Ken Chiu's and my code from jgt:

/* seedx, seedy is point on [0,1]^2. x, y is point on radius 1 disk */

void to_unit_disk( double seedx, double seedy, double *x, double *y )

{

double phi, r;

double a = 2*seedx - 1; >/* (a,b) is now on [-1,1]^2 */

double b = 2*seedy - 1;

if (a > -b) { /* region 1 or 2 */

if (a > b) { /* region 1, also |a| > |b| */

r = a;

phi = (M_PI/4 ) * (b/a);

}

else { /* region 2, also |b| > |a| */

phi = (M_PI/4) * (2 - (a/b));

}

}

else { /* region 3 or 4 */

if (a < b) /* region 3, also |a| >= |b|, a != 0

r = -a;

phi = (M_PI/4) * (4 + (b/a));

}

else { /* region 4, |b| >= |a|, but a==0 and b==0 could occur.

r = -b;

if (b != 0)

phi = (M_PI/4) * (6 - (a/b));

else

phi = 0;

}

}

*x = r * cos(phi);

*y = r * sin(phi);

}

Dave Cline recently sent me a neat trick that uses negative radii and I think is correct. Let me know if you try it. (cut and pasted from his mail)

Vector2 ToUnitDisk(Vector2 O) {

float phi,r;

float a = 2*O.x - 1;

float b = 2*O.y - 1;

if (a*a> b*b) { // use squares instead of absolute values

r = a;

phi = (PI/4)*(b/a);

} else {

r = b;

phi = (PI/4)*(a/b) + (PI/2);

}

return Vector2( r*cos(phi), r*sin(phi) );

}

/* seedx, seedy is point on [0,1]^2. x, y is point on radius 1 disk */

void to_unit_disk( double seedx, double seedy, double *x, double *y )

{

double phi, r;

double a = 2*seedx - 1; >/* (a,b) is now on [-1,1]^2 */

double b = 2*seedy - 1;

if (a > -b) { /* region 1 or 2 */

if (a > b) { /* region 1, also |a| > |b| */

r = a;

phi = (M_PI/4 ) * (b/a);

}

else { /* region 2, also |b| > |a| */

phi = (M_PI/4) * (2 - (a/b));

}

}

else { /* region 3 or 4 */

if (a < b) /* region 3, also |a| >= |b|, a != 0

r = -a;

phi = (M_PI/4) * (4 + (b/a));

}

else { /* region 4, |b| >= |a|, but a==0 and b==0 could occur.

r = -b;

if (b != 0)

phi = (M_PI/4) * (6 - (a/b));

else

phi = 0;

}

}

*x = r * cos(phi);

*y = r * sin(phi);

}

Dave Cline recently sent me a neat trick that uses negative radii and I think is correct. Let me know if you try it. (cut and pasted from his mail)

Vector2 ToUnitDisk(Vector2 O) {

float phi,r;

float a = 2*O.x - 1;

float b = 2*O.y - 1;

if (a*a> b*b) { // use squares instead of absolute values

r = a;

phi = (PI/4)*(b/a);

} else {

r = b;

phi = (PI/4)*(a/b) + (PI/2);

}

return Vector2( r*cos(phi), r*sin(phi) );

}

Subscribe to:
Posts (Atom)