//---------------------------------------------------------------------------- bool GpuGaussianBlur3::OnInitialize () { if (!WindowApplication3::OnInitialize()) { return false; } // Get any command-line parameters. bool useDirichlet = false; if (TheCommand) { // usage for Dirichlet: GpuGaussianBlur3 -d // usage for Neumann: GpuGaussianBlur3 useDirichlet = TheCommand->GetBoolean("d") != 0; } // Load the image to be blurred. The image is known to be 128x128x64. #ifdef WM5_LITTLE_ENDIAN std::string imageName = Environment::GetPathR( "Head.x128y128z64.short.le.raw"); #else std::string imageName = Environment::GetPathR( "Head.x128y128z64.short.be.raw"); #endif assertion(imageName != "", "Cannot find or open image file\n"); FILE* inFile = fopen(imageName.c_str(), "rb"); int numVoxels = 128*128*64; short* rawData = new1<short>(numVoxels); fread(rawData, sizeof(short), numVoxels, inFile); fclose(inFile); // For the test image, smin = -1117 and smax = 2248. Let us compute them // anyway (you would do this generally for any input image). short smin = rawData[0], smax = rawData[0]; int i; for (int i = 1; i < numVoxels; ++i) { if (rawData[i] < smin) { smin = rawData[i]; } else if (rawData[i] > smax) { smax = rawData[i]; } } float trn = (float)smin; float mult = 1.0f/((float)smax - (float)smin); Float4* imageData = new1<Float4>(numVoxels); for (i = 0; i < numVoxels; ++i) { float gray = ((float)rawData[i] - trn)*mult; imageData[i] = Float4(gray, gray, gray, gray); } delete1(rawData); // Create the image processor. mIP = new0 ImageProcessing3(128, 128, 8, 8, imageData, CreateBlurPixelShader(), Float4(0.0f, 1.0f, 0.0f, 0.0f), useDirichlet); delete1(imageData); SetBlurInput(); #ifdef WM5_USE_OPENGL mIP->Initialize(mRenderer, true); #else mIP->Initialize(mRenderer); #endif return true; }
//---------------------------------------------------------------------------- bool GpuGaussianBlur2::OnInitialize () { if (!WindowApplication3::OnInitialize()) { return false; } bool useDirichlet = false; if (TheCommand) { // usage for Dirichlet: GpuGaussianBlur2 -d // usage for Neumann: GpuGaussianBlur2 useDirichlet = TheCommand->GetBoolean("d") != 0; } // Load the image to be blurred. The image is known to be 256x256. #ifdef WM5_LITTLE_ENDIAN std::string imageName = Environment::GetPathR( "Head.x256y256.short.le.raw"); #else std::string imageName = Environment::GetPathR( "Head.x256y256.short.be.raw"); #endif assertion(imageName != "", "Cannot find or open image file\n"); FILE* inFile = fopen(imageName.c_str(), "rb"); int numPixels = 256*256; short* rawData = new1<short>(numPixels); fread(rawData, sizeof(short), numPixels, inFile); fclose(inFile); // For the test image, smin = 0 and smax = 1024. Let us compute them // anyway (you would do this generally for any input image). short smin = rawData[0], smax = rawData[0]; int i; for (int i = 1; i < numPixels; ++i) { if (rawData[i] < smin) { smin = rawData[i]; } else if (rawData[i] > smax) { smax = rawData[i]; } } float trn = (float)smin; float mult = 1.0f/((float)smax - (float)smin); Float4* imageData = new1<Float4>(numPixels); for (i = 0; i < numPixels; ++i) { float gray = ((float)rawData[i] - trn)*mult; imageData[i] = Float4(gray, gray, gray, gray); } delete1(rawData); // Create the screen objects for image processing. mIP = new0 ImageProcessing2(256, 256, imageData, CreateBlurPixelShader(), useDirichlet); delete1(imageData); SetBlurInput(); mIP->Initialize(mRenderer); return true; }