/* task that renders a single screen tile */ Vec3fa renderPixelStandard(float x, float y, const ISPCCamera& camera, RayStats& stats) { /* initialize sampler */ RandomSampler sampler; RandomSampler_init(sampler, (int)x, (int)y, 0); /* initialize ray */ Ray ray(Vec3fa(camera.xfm.p), Vec3fa(normalize(x*camera.xfm.l.vx + y*camera.xfm.l.vy + camera.xfm.l.vz)), 0.0f, inf, RandomSampler_get1D(sampler)); /* intersect ray with scene */ RTCIntersectContext context; rtcInitIntersectContext(&context); context.flags = g_iflags_coherent; rtcIntersect1(g_scene,&context,RTCRayHit_(ray)); RayStats_addRay(stats); /* shade background black */ if (ray.geomID == RTC_INVALID_GEOMETRY_ID) { return Vec3fa(0.0f); } /* shade all rays that hit something */ Vec3fa color = Vec3fa(0.5f); /* compute differential geometry */ DifferentialGeometry dg; dg.geomID = ray.geomID; dg.primID = ray.primID; dg.u = ray.u; dg.v = ray.v; dg.P = ray.org+ray.tfar*ray.dir; dg.Ng = ray.Ng; dg.Ns = ray.Ng; if (g_use_smooth_normals) if (ray.geomID != RTC_INVALID_GEOMETRY_ID) // FIXME: workaround for ISPC bug, location reached with empty execution mask { Vec3fa dPdu,dPdv; unsigned int geomID = ray.geomID; { rtcInterpolate1(rtcGetGeometry(g_scene,geomID),ray.primID,ray.u,ray.v,RTC_BUFFER_TYPE_VERTEX,0,nullptr,&dPdu.x,&dPdv.x,3); } dg.Ns = cross(dPdv,dPdu); } int materialID = postIntersect(ray,dg); dg.Ng = face_forward(ray.dir,normalize(dg.Ng)); dg.Ns = face_forward(ray.dir,normalize(dg.Ns)); /* shade */ if (g_ispc_scene->materials[materialID]->type == MATERIAL_OBJ) { ISPCOBJMaterial* material = (ISPCOBJMaterial*) g_ispc_scene->materials[materialID]; color = Vec3fa(material->Kd); } return color*dot(neg(ray.dir),dg.Ns); }
task main() { face_forward(); return; }