void BeginRender() { Color24 *temp; temp = renderImage.GetPixels(); float *zBuffer = renderImage.GetZBuffer(); Color materialColor; Color24 newColor; for (int i = 0; i < camera.imgWidth; i++) { for (int j = 0; j < camera.imgHeight; j++) { Ray currentRay = ComputeCameraRay(i, j); HitInfo hInfo; hInfo.Init(); bool value = TraceRay(currentRay, hInfo, &rootNode); if (value) { hInfo.node->FromNodeCoords(hInfo); const Material *m = hInfo.node->GetMaterial(); materialColor = m->Shade(currentRay, hInfo, lights); temp[camera.imgWidth*j + i].r = (materialColor.r)*255; temp[camera.imgWidth*j + i].g = (materialColor.g)*255; temp[camera.imgWidth*j + i].b = (materialColor.b)*255; } else { temp[camera.imgWidth*j + i].r = 0; temp[camera.imgWidth*j + i].g = 0; temp[camera.imgWidth*j + i].b = 0; } zBuffer[camera.imgWidth*j + i] = hInfo.z; } } renderImage.ComputeZBufferImage(); renderImage.SaveImage("Output"); }
void Renderer::startRendering(size_t i_threadCount) { threadCount = i_threadCount; mThreadHandle = ThreadHandle(threadCount); imageWidth = renderImage.GetWidth(); imageHeight = renderImage.GetHeight(); noOfRowsToRenderPerThread = imageHeight / threadCount; renderingImage = renderImage.GetPixels(); zBufferImage = renderImage.GetZBuffer(); sampleCountImage = renderImage.GetSampleCount(); operationCountImage = renderImage.GetOperationCountImage(); myEngine::Timing::Clock *clock = myEngine::Timing::Clock::createAndStart(); /*for (int i = 0; i < renderImage.GetHeight(); ++i) { for (int j = 0; j < renderImage.GetWidth(); ++j) { calculatePixelColor(rootNode,lights,j, i); } }*/ int *threadVal = new int[threadCount]; for (size_t i = 0; i < threadCount; i++) { threadVal[i] = i; std::cout << "\nPassing Value to thread" << threadVal[i]; mThreadHandle.thread[i] = CreateThread(nullptr, 0, static_cast<LPTHREAD_START_ROUTINE>(renderPixel), &threadVal[i], CREATE_SUSPENDED, nullptr); } for (size_t i = 0; i < threadCount;i++) { ResumeThread(mThreadHandle.thread[i]); } std::cout << "Wait Val"<<std::endl << WaitForMultipleObjects(threadCount, mThreadHandle.thread, TRUE, INFINITE) << std::endl;; std::cout << "Wait finished"; if (WaitForMultipleObjects(threadCount + 1, mThreadHandle.thread, TRUE, INFINITE)) { mThreadHandle.destroyThread(); } TCHAR* mutexName = __T("WritingMutex"); HANDLE mutexHandle = OpenMutex(MUTEX_ALL_ACCESS, FALSE, mutexName); CloseHandle(mutexHandle); renderImage.SaveImage("RayCasted.ppm"); renderImage.ComputeZBufferImage(); renderImage.SaveZImage("RayCastWithZ.ppm"); renderImage.ComputeSampleCountImage(); renderImage.SaveSampleCountImage("SampleCountImage.ppm"); clock->updateDeltaTime(); double time = clock->getdeltaTime(); printf("Time to render ray casting %f", clock->getdeltaTime()); }
void PrintPixelData(int x, int y) { if ( x < renderImage.GetWidth() && y < renderImage.GetHeight() ) { Color24 *colors = renderImage.GetPixels(); float *zbuffer = renderImage.GetZBuffer(); int i = y*renderImage.GetWidth() + x; printf("Pixel [ %d, %d ] Color24: %d, %d, %d Z: %f\n", x, y, colors[i].r, colors[i].g, colors[i].b, zbuffer[i] ); } else { printf("-- Invalid pixel (%d,%d) --\n",x,y); } }