[vtkusers] Offscreen GPU Volume Rendering Mac OS X generates black images
Chris Hafey
chafey at gmail.com
Thu Sep 25 09:39:04 EDT 2014
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
>>>>>>> <http://www.kitware.com/company/team/chaudhary.html>*
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>>
>>>>>
>>>>> *| Aashish Chaudhary | Technical Leader | Kitware Inc.
>>>>> *
>>>>> *| http://www.kitware.com/company/team/chaudhary.html
>>>>> <http://www.kitware.com/company/team/chaudhary.html>*
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>>
>>>
>>> *| Aashish Chaudhary | Technical Leader | Kitware Inc.
>>> *
>>> *| http://www.kitware.com/company/team/chaudhary.html
>>> <http://www.kitware.com/company/team/chaudhary.html>*
>>>
>>
>>
>
>
> --
>
>
>
> *| Aashish Chaudhary | Technical Leader | Kitware Inc. *
> *| http://www.kitware.com/company/team/chaudhary.html
> <http://www.kitware.com/company/team/chaudhary.html>*
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140925/59ce764f/attachment.html>
More information about the vtkusers
mailing list