[vtkusers] Offscreen GPU Volume Rendering Mac OS X generates black images
Chris Hafey
chafey at gmail.com
Tue Sep 30 17:04:54 EDT 2014
Hi Aashish and vtkusers,
Just checking in to see if anyone has been able to reproduce this issue or see anything I am doing wrong. I would love to get this working on Mac OS X - thanks for any assistance!
Chris
On Sep 25, 2014, at 8:39 AM, Chris Hafey <chafey at gmail.com> wrote:
> The follow code will reproduce the problem - change the line commented out near the top to switch between GPU and RayCast rendering to see it working and not working. Let me know if you need a CMakefile and DICOM files (I assume you have DICOM files and can plug this code into an existing project if needed )
>
> #include <string>
>
> #include <fstream>
>
> #include <vtkSmartPointer.h>
>
> #include <vtkImageSlabReslice.h>
>
> #include <vtkRenderer.h>
>
> #include <vtkRenderWindow.h>
>
> #include <vtkPiecewiseFunction.h>
>
> #include <vtkColorTransferFunction.h>
>
> #include <vtkImageData.h>
>
> #include <vtkMatrix4x4.h>
>
> #include <vtkWindowToImageFilter.h>
>
> #include <vtkDICOMImageReader.h>
>
> #include <vtkSmartVolumeMapper.h>
>
> #include <vtkJPEGWriter.h>
>
> #include <vtkCamera.h>
>
> #include <vtkVolumeProperty.h>
>
> #include <vtkUnsignedCharArray.h>
>
>
>
> int main(int argc, char** argv)
>
> {
>
>
>
> //int renderMode =vtkSmartVolumeMapper::RayCastRenderMode; // this works
>
> int renderMode =vtkSmartVolumeMapper::GPURenderMode; // this generates black image
>
>
> // Read the DICOM Data
>
> vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
>
> reader->SetDirectoryName("/Users/chafey/DICOM/Volume3");
>
> reader->Update();
>
> vtkSmartPointer<vtkImageData> imageData(reader->GetOutput());
>
>
> // Translate origin to center of volume
>
> double xSpacing, ySpacing, zSpacing;
>
> imageData->GetSpacing(xSpacing, ySpacing, zSpacing);
>
> int* dims = imageData->GetDimensions();
>
> double xCenter = dims[0] * xSpacing / 2.0;
>
> double yCenter = dims[1] * ySpacing / 2.0;
>
> double zCenter = dims[2] * zSpacing / 2.0;
>
> imageData->SetOrigin(-xCenter, -yCenter, -zCenter);
>
>
>
> // Setup the renderer for offscreen rendering
>
> vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
>
>
> // Setup the render window
>
> vtkSmartPointer<vtkRenderWindow> render_window = vtkSmartPointer<vtkRenderWindow>::New();
>
> render_window->SetOffScreenRendering(1);
>
> render_window->AddRenderer(renderer);
>
> render_window->SetSize(512, 512);
>
>
> // Setup the volume mapper
>
> vtkSmartPointer<vtkSmartVolumeMapper> volume_mapper = vtkSmartPointer<vtkSmartVolumeMapper>::New();
>
> volume_mapper->SetRequestedRenderMode(renderMode);
>
> volume_mapper->SetInputData(imageData);
>
>
>
>
> // Setup the volume
>
> vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
>
> volume->SetMapper(volume_mapper);
>
> renderer->AddViewProp(volume);
>
>
> // Render the image
>
> render_window->Render();
>
> vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = vtkSmartPointer<vtkWindowToImageFilter>::New();
>
> windowToImageFilter->SetInput(render_window);
>
> windowToImageFilter->Update();
>
>
> // Create a JPEG in memory
>
> vtkSmartPointer<vtkJPEGWriter> writer = vtkSmartPointer<vtkJPEGWriter>::New();
>
> writer->WriteToMemoryOn();
>
> writer->SetInputConnection(windowToImageFilter->GetOutputPort());
>
> writer->Write();
>
> vtkSmartPointer<vtkUnsignedCharArray> dataPtr = writer->GetResult();
>
> dataPtr->Squeeze();
>
>
> // write the jpeg to disk
>
> ofstream myFile ("image.jpg", ios::out | ios::binary);
>
> myFile.write ((const char*)dataPtr->GetPointer(0), dataPtr->GetSize());
>
>
> return 0;
>
> }
>
>
> On Thu, Sep 25, 2014 at 7:42 AM, Aashish Chaudhary <aashish.chaudhary at kitware.com> wrote:
> On Thu, Sep 25, 2014 at 8:38 AM, Chris Hafey <chafey at gmail.com> wrote:
> No errors on the console. I will work on a standalone example. Can you please clarify whether or not I should be using mesa / osmesa for GPU rendering on Mac OS X?
>
> In theory your regular driver should work with the offscreen rendering setting. As per my understanding, that will just not open the window but will create a context in which the rendering is performed. But if the image is black and if it is not if you don't set that flag then it means the context was not created properly. VTK should have given you a error but may be it is fooled by the system itself.
>
> You can try osmesa, make sure that VTK detects it, and see if that works.
>
> - Aashish
>
> Chris
>
> On Thu, Sep 25, 2014 at 7:37 AM, Aashish Chaudhary <aashish.chaudhary at kitware.com> wrote:
> This is good to know. Do you get any errors on the console? A standalone example will be nice.
>
> - Aashish
>
> On Thu, Sep 25, 2014 at 8:32 AM, Chris Hafey <chafey at gmail.com> wrote:
> I am enabling off screen rendering by calling SetOffScreenRendering(1) on the vtkRenderWindow. Should I be using osmesa? I can create a standalone example to reproduce if needed.
>
> Chris
>
> On Thu, Sep 25, 2014 at 7:21 AM, Aashish Chaudhary <aashish.chaudhary at kitware.com> wrote:
> No problem. How did you enable the offscreen? Can you post your code somewhere?
>
> Thanks,
> Aashish
>
> On Thu, Sep 25, 2014 at 8:05 AM, Chris Hafey <chafey at gmail.com> wrote:
> Hi Aashish,
> Forgive my ignorance but I don't know much about osmesa or whether I am using it. I am using VTK as built by homebrew and don't see any options related to osmesa. I have not installed osmesa on the machine. No errors or warnings are issued on the console.
>
> Chris
>
> On Thu, Sep 25, 2014 at 6:46 AM, Aashish Chaudhary <aashish.chaudhary at kitware.com> wrote:
> Hi Chris,
>
> Are you using osmesa for the offscreen rendering? Are you getting any error on the console?
>
> Thanks
>
>
> On Thu, Sep 25, 2014 at 7:32 AM, Chris Hafey <chafey at gmail.com> wrote:
> VTK 6.1.0
> Mac OS X Mavericks 10.9.5
> Macbook Pro 2012 Retina with nVidia GeForce GT 650M 1024 MB
>
> My program uses VTK to do off screen volume rendering of medical images. I suspect this is a bug in VTK and not my software because:
> 1) GPURenderMode works fine on Windows (both in a VM running on same Mac and on two other Windows 7 boxes with an nVidia GPUs)
> 2) RayCastRenderMode works fine on Mac OS X
> 3) TextureRenderMode works fine on Mac OS X
>
> I tried searching the mailing list and google and couldn't find anything. The rendering code is about as basic as it can be - it simply sets the color, opacity, clip planes and matrix. Any ideas on what I might be doing wrong or how I can debug?
>
> Thanks
>
> Chris Hafey
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
>
>
>
> --
> | Aashish Chaudhary
> | Technical Leader
> | Kitware Inc.
> | http://www.kitware.com/company/team/chaudhary.html
>
>
>
>
> --
> | Aashish Chaudhary
> | Technical Leader
> | Kitware Inc.
> | http://www.kitware.com/company/team/chaudhary.html
>
>
>
>
> --
> | Aashish Chaudhary
> | Technical Leader
> | Kitware Inc.
> | http://www.kitware.com/company/team/chaudhary.html
>
>
>
>
> --
> | Aashish Chaudhary
> | Technical Leader
> | Kitware Inc.
> | http://www.kitware.com/company/team/chaudhary.html
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140930/5fb5ceae/attachment.html>
More information about the vtkusers
mailing list