Я хочу экспортировать 3D-сцену из Viewport3D в растровое изображение.
Очевидный способ сделать это - использовать RenderTargetBitmap, однако при этом качество экспортируемого растрового изображения значительно ниже, чем изображение на экране. Оглядываясь в Интернете, кажется, что RenderTargetBitmap не использует преимущества аппаратного рендеринга. Это означает, что рендеринг выполняется на Tier 0 . Это означает отсутствие mip-mapping и т. Д., Следовательно, снижение качества экспортируемого изображения.
Кто-нибудь знает, как экспортировать растровое изображение Viewport3D с качеством на экране?
Разъяснение
Хотя приведенный ниже пример этого не показывает, Мне нужно в конечном итоге экспортировать растровое изображение Viewport3D в файл. Как я понимаю, единственный способ сделать это - вставить изображение в нечто это происходит от BitmapSource. Приведенные ниже примеры показывают, что повышение качества экспорта с использованием RenderTargetBitmap улучшает изображение, но, поскольку рендеринг все еще выполняется в программном обеспечении, он слишком медленный.
Есть ли способ экспортировать визуализированную 3D-сцену в файл с использованием аппаратного рендеринга? Конечно, это должно быть возможно?
Вы можете увидеть проблему с этим xaml:
<Window x:Class="RenderTargetBitmapProblem.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="400" Width="500">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Viewport3D Name="viewport3D">
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,3"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<AmbientLight Color="White"/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,-10,0 1,-10,0 -1,20,0 1,20,0"
TextureCoordinates="0,1 0,0 1,1 1,0"
TriangleIndices="0,1,2 1,3,2"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="http://www.wyrmcorp.com/galleries/illusions/Hermann%20Grid.png"
TileMode="Tile" Viewport="0,0,0.25,0.25"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
</ModelVisual3D.Content>
<ModelVisual3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="1,0,0" Angle="-82"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</ModelVisual3D.Transform>
</ModelVisual3D>
</Viewport3D>
<Image Name="rtbImage" Visibility="Collapsed"/>
<Button Grid.Row="1" Click="Button_Click">RenderTargetBitmap!</Button>
</Grid>
</Window>
И этот код:
private void Button_Click(object sender, RoutedEventArgs e)
{
RenderTargetBitmap bmp = new RenderTargetBitmap((int)viewport3D.ActualWidth,
(int)viewport3D.ActualHeight, 96, 96, PixelFormats.Default);
bmp.Render(viewport3D);
rtbImage.Source = bmp;
viewport3D.Visibility = Visibility.Collapsed;
rtbImage.Visibility = Visibility.Visible;
}