void runCuda() { if (camchanged) { iteration = 0; Camera &cam = renderState->camera; glm::vec3 v = cam.view; glm::vec3 u = cam.up; glm::vec3 r = glm::cross(v, u); glm::mat4 rotmat = glm::rotate(theta, r) * glm::rotate(phi, u); cam.view = glm::vec3(rotmat * glm::vec4(v, 0.f)); cam.up = glm::vec3(rotmat * glm::vec4(u, 0.f)); cam.position += cammove.x * r + cammove.y * u + cammove.z * v; // Camera to grid center float distance = cam.resolution.x / 2 / tan(cam.fov.x / 2); cam.toGrid = glm::vec3(cam.view.x*distance, cam.view.y*distance, cam.view.z*distance); // Find camera right vector float rAngle = -PI / 2; float qx = cam.view.x * sin(rAngle / 2); float qy = cam.view.y * sin(rAngle / 2); float qz = cam.view.z * sin(rAngle / 2); float qw = cos(rAngle / 2); glm::quat q = glm::quat(qw, qx, qy, qz); cam.right = q * cam.up; theta = phi = 0; cammove = glm::vec3(); camchanged = false; } // Map OpenGL buffer object for writing from CUDA on a single GPU // No data is moved (Win & Linux). When mapped to CUDA, OpenGL should not use this buffer if (iteration == 0) { pathtraceFree(); pathtraceInit(scene); } if (iteration < renderState->iterations) { uchar4 *pbo_dptr = NULL; iteration++; cudaGLMapBufferObject((void**)&pbo_dptr, pbo); // execute the kernel int frame = 0; pathtrace(pbo_dptr, frame, iteration); // unmap buffer object cudaGLUnmapBufferObject(pbo); } else { saveImage(); pathtraceFree(); cudaDeviceReset(); exit(EXIT_SUCCESS); } }
void runCuda() { if (camchanged) { iteration = 0; Camera &cam = renderState->camera; glm::vec3 v = cam.view; glm::vec3 u = cam.up; glm::vec3 r = glm::cross(v, u); glm::mat4 rotmat = glm::rotate(theta, r) * glm::rotate(phi, u); cam.view = glm::vec3(rotmat * glm::vec4(v, 0.f)); cam.up = glm::vec3(rotmat * glm::vec4(u, 0.f)); cam.position += cammove.x * r + cammove.y * u + cammove.z * v; theta = phi = 0; cammove = glm::vec3(); camchanged = false; } // Map OpenGL buffer object for writing from CUDA on a single GPU // No data is moved (Win & Linux). When mapped to CUDA, OpenGL should not use this buffer if (iteration == 0) { pathtraceFree(); pathtraceInit(scene); } if (iteration < renderState->iterations) { uchar4 *pbo_dptr = NULL; iteration++; cudaGLMapBufferObject((void**)&pbo_dptr, pbo); // execute the kernel if( scene->blur ) { for( int frame = 0; frame<(scene->frames); frame++ ){ pathtrace(pbo_dptr, frame, scene->frames, iteration); //printf("frame is : %d", frame); } } else { pathtrace(pbo_dptr, 0, 0, iteration); } // unmap buffer object cudaGLUnmapBufferObject(pbo); } else { saveImage(); pathtraceFree(); cudaDeviceReset(); exit(EXIT_SUCCESS); } }