При доступе к zbuffer в VTK чёрное изображение
В настоящее время я пишу приложение на C++, которое будет читать в файле.obj и отображать буфер z как изображение глубины в изображение.png.
Тем не менее, изображение черное. Я попробовал это на машине с GTX 1050 и GTX 1080, оба раза полученное изображение, и окно рендеринга черное.
Я использую MinGW для компиляции, а также попробовал его с компилятором MSCV без удачи.
Код выглядит следующим образом:
#include <QtCore>
#include <QtMath>
#include <vtkSmartPointer.h>
#include <vtkCamera.h>
#include <vtkOBJReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkBMPWriter.h>
#include <vtkPNGWriter.h>
#include <vtkWindowToImageFilter.h>
#include <vtkImageShiftScale.h>
#include <vtkTransformFilter.h>
#include <vtkTransform.h>
#include <vtkWindowLevelLookupTable.h>
#include <vtkImageMapToColors.h>
#include <vtkImageHistogramStatistics.h>
#include <vtkImageExport.h>
#include <vtkImageCast.h>
int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);
QCoreApplication::setApplicationName("ModelToDepthGenerator");
QCoreApplication::setApplicationVersion("1.0");
double nearClippingPlane = 1;
double farClippingPlane = 5000;
double clippingDistance = farClippingPlane-nearClippingPlane;
// Read file
vtkSmartPointer<vtkOBJReader> fileReader = vtkSmartPointer<vtkOBJReader>::New();
fileReader->SetFileName("..\\modeltodepthgenerator\\ManMesh.obj");
//Build visualization enviroment
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(fileReader->GetOutputPort());
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
transform->Identity();
transform->Translate(0,0,2500);
actor->SetUserTransform(transform);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
//change camera viewpoint
vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 0);
camera->SetFocalPoint(0, 0, nearClippingPlane);
camera->SetViewUp(0, 1, 0);
camera->SetClippingRange(nearClippingPlane, farClippingPlane);
renderer->SetActiveCamera(camera);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->SetSize(512, 424);
renWin->AddRenderer(renderer);
renWin->Render();
renWin->WaitForCompletion();
// Create Depth Map
vtkSmartPointer<vtkWindowToImageFilter> zFilter = vtkSmartPointer<vtkWindowToImageFilter>::New();
zFilter->SetInput(renWin);
zFilter->SetMagnification(1);
zFilter->SetShouldRerender(1);
zFilter->SetInputBufferTypeToZBuffer();
vtkSmartPointer<vtkImageShiftScale> scale = vtkSmartPointer<vtkImageShiftScale>::New();
scale->SetOutputScalarTypeToUnsignedShort();
scale->SetInputConnection(zFilter->GetOutputPort());
scale->SetShift(nearClippingPlane/clippingDistance);
scale->SetScale(clippingDistance);
// Write depth map as a image
vtkSmartPointer<vtkPNGWriter> imageWriter = vtkSmartPointer<vtkPNGWriter>::New();
imageWriter->SetFileName("outdepth.png");
imageWriter->SetInputConnection(scale->GetOutputPort());
imageWriter->Write();
vtkSmartPointer<vtkWindowToImageFilter> rgbFilter = vtkSmartPointer<vtkWindowToImageFilter>::New();
rgbFilter->SetInput(renWin);
rgbFilter->SetMagnification(1);
rgbFilter->SetShouldRerender(1);
rgbFilter->SetInputBufferTypeToRGBA();
//Write out render
vtkSmartPointer<vtkPNGWriter> imageRenderWriter = vtkSmartPointer<vtkPNGWriter>::New();
imageRenderWriter->SetFileName("outrender.png");
imageRenderWriter->SetInputConnection(rgbFilter->GetOutputPort());
imageRenderWriter->Write();
return 0;
}
Файл.obj можно загрузить с https://free3d.com/download-page.php?url=male-base-mesh-6682.
Объект находится между диапазонами отсечения объекта, поэтому я не знаю, что вызывает эту ошибку.