void ambient_occlusion(vec *col, const Isect *isect) { int i, j; int ntheta = AOBENCH_NAO_SAMPLES; int nphi = AOBENCH_NAO_SAMPLES; aobfloat eps = 0.0001; vec p; p.x = isect->p.x + eps * isect->n.x; p.y = isect->p.y + eps * isect->n.y; p.z = isect->p.z + eps * isect->n.z; vec basis[3]; orthoBasis(basis, isect->n); aobfloat occlusion = 0.0; for (j = 0; j < ntheta; j++) { for (i = 0; i < nphi; i++) { aobfloat theta = sqrt(drand48()); aobfloat phi = 2.0 * M_PI * drand48(); aobfloat x = cos(phi) * theta; aobfloat y = sin(phi) * theta; aobfloat z = sqrt(1.0 - theta * theta); // local -> global aobfloat rx = x * basis[0].x + y * basis[1].x + z * basis[2].x; aobfloat ry = x * basis[0].y + y * basis[1].y + z * basis[2].y; aobfloat rz = x * basis[0].z + y * basis[1].z + z * basis[2].z; Ray ray; ray.org = p; ray.dir.x = rx; ray.dir.y = ry; ray.dir.z = rz; Isect occIsect; occIsect.t = 1.0e+17; occIsect.hit = 0; ray_sphere_intersect(&occIsect, &ray, &spheres[0]); ray_sphere_intersect(&occIsect, &ray, &spheres[1]); ray_sphere_intersect(&occIsect, &ray, &spheres[2]); ray_plane_intersect (&occIsect, &ray, &plane); if (occIsect.hit) occlusion += 1.0; } } occlusion = (ntheta * nphi - occlusion) / (aobfloat)(ntheta * nphi); col->x = occlusion; col->y = occlusion; col->z = occlusion; }
static float ambient_occlusion(Isect &isect, Plane &plane, Sphere spheres[3]) { float eps = 0.0001f; vec p, n; vec basis[3]; float occlusion = 0.0; p = isect.p + eps * isect.n; orthoBasis(basis, isect.n); static const int ntheta = NAO_SAMPLES; static const int nphi = NAO_SAMPLES; for (int j = 0; j < ntheta; j++) { for (int i = 0; i < nphi; i++) { Ray ray; Isect occIsect; float theta = sqrtf(drand48()); float phi = 2.0f * M_PI * drand48(); float x = cosf(phi) * theta; float y = sinf(phi) * theta; float z = sqrtf(1.0f - theta * theta); // local . global float rx = x * basis[0].x + y * basis[1].x + z * basis[2].x; float ry = x * basis[0].y + y * basis[1].y + z * basis[2].y; float rz = x * basis[0].z + y * basis[1].z + z * basis[2].z; ray.org = p; ray.dir.x = rx; ray.dir.y = ry; ray.dir.z = rz; occIsect.t = 1.0e+17f; occIsect.hit = 0; for (int snum = 0; snum < 3; ++snum) ray_sphere_intersect(occIsect, ray, spheres[snum]); ray_plane_intersect (occIsect, ray, plane); if (occIsect.hit) occlusion += 1.f; } } occlusion = (ntheta * nphi - occlusion) / (float)(ntheta * nphi); return occlusion; }
static void ambient_occlusion(vec *col, const Isect *isect) { int i, j; int ntheta = NAO_SAMPLES; int nphi = NAO_SAMPLES; double eps = 0.0001; vec p; ao_vmultsadd(&p, isect->n, eps, isect->p); /* p.x = isect->p.x + eps * isect->n.x; p.y = isect->p.y + eps * isect->n.y; p.z = isect->p.z + eps * isect->n.z; */ vec basis[3]; orthoBasis(basis, isect->n); double occlusion = 0.0; for (j = 0; j < ntheta; j++) { for (i = 0; i < nphi; i++) { double theta = sqrt(drand48()); double phi = 2.0 * M_PI * drand48(); double x = cos(phi) * theta; double y = sin(phi) * theta; double z = sqrt(1.0 - theta * theta); // TODO // local -> global double rx = x * basis[0].x + y * basis[1].x + z * basis[2].x; double ry = x * basis[0].y + y * basis[1].y + z * basis[2].y; double rz = x * basis[0].z + y * basis[1].z + z * basis[2].z; Ray ray; ray.org = p; ray.dir.x = rx; ray.dir.y = ry; ray.dir.z = rz; Isect occIsect; occIsect.t = 1.0e+17; occIsect.hit = 0; ray_sphere_intersect(&occIsect, &ray, &spheres[0]); ray_sphere_intersect(&occIsect, &ray, &spheres[1]); ray_sphere_intersect(&occIsect, &ray, &spheres[2]); ray_plane_intersect (&occIsect, &ray, &plane); if (occIsect.hit) occlusion += 1.0; } } occlusion = (ntheta * nphi - occlusion) / (double)(ntheta * nphi); col->x = occlusion; col->y = occlusion; col->z = occlusion; }