Thursday, November 24, 2011

2011 updates

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, 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.

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));
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) );