Stereoscopic virtual reality rendering, export to Collada and obj files and many other new features available

by abenedik 1. July 2016 23:42

I am very happy that I can present you some great new features of new versions of Ab3d.PowerToys and Ab3d.DXEngine.

The greatest new features of this release are:

- Support for stereoscopic rendering for 3D TV and for red-cyan glasses,
- Ultra-quality settings with new super-sampling mode that improve render quality,
- Improved support for rendering over Remote desktop.,
- Export WPF 3D models to Collada (.dae), obj, ply and stl files (using Assimp exporter).


Stereoscopic rendering

Ad3d.DXEngine just got support for split-screen and anaglyph rendering. Those are the first two steps into the virtual reality world.

Split-screen rendering allows viewing the 3D scene on 3D TV screens. The following screenshot shows a simple generated 3D screen:

Split-screen virtual reality with Ab3d.DXEngine rendering


The virtual reality 3D effect can be also achieved with using red-cyan (or some other colors) glasses and with using the Anaglyph rendering mode:

Anaglyph virtual reality with Ab3d.DXEngine rendering


I also checked the requirements for NVIDIA 3D Vision. But unfortunately it requires an exclusive full screen rendering mode and does not work in maximized borderless window mode that is the only full screen mode possible by WPF. But the good news is that it looks like it will be possible to add support for Oculus Rift and Vive. So if you like virtual reality, stay tuned for the future version.


Super-sampling mode

DirectX usually uses multi-sampling (MSAA) that improves the quality of the edges with producing nice anti-aliased edges. Instead of using multi-sampling it is also possible to use post-processing techniques (for example FXAA or SMAA) to produce nice soft edges. But neither multi-sampling nor anti-aliasing post processing do not solve the problem where small details are can be lost when objects are rendered far away from the camera.

This problem is visible on the left side of the following screenshot:

Supersampling with DXEngine DirectX rendering

The solution to this problem is to use super-sampling – as shown on the rights side. Super-sampling solves this problem with calculating color (executing pixel shader) for each sample – this means multiple times for each pixel. This effectively gives the same results as if the image would be rendered at a bigger resolution and then scale the image down to the target resolution.


Remote desktop

I would also like to mention that the new version of Ab3d.DXEngine library improves support for rendering over remote desktop. Previously the 3D scene was visible through remote desktop only when DirectXOverlay PresentationType way used. But this presentation type has a serious drawback because it does not allow to mix 3D content with other 2D WPF content – for example render 2D controls on top of 3D scene. With the new version, the remote desktop works well also with DirectXImage PresentationType – this allows showing 3D scene that is mixed with other 2D controls. Note that this requires .Net target framework 4.5 or later and using the .net 4.5 build of Ab3d.DXEngine library.

Those three new features were in my opinion the best new features of this release for Ab3d.DXEngine. But as always there are more new features and fixes available. The following is the full list of all other changes:

  • Simplified setting line depth bias with SetDXAttribute(DXAttributeType.LineDepthBias, depthBias) method - this can prevent z-fighting when rendering 3D lines on top of solid objects.
  • Added Ab3d.DirectX.DXDiagnostics.CaptureNextFrame and IsCaptureFrameSupported methods to programmatically captures the next rendered frame with Visual Studio Graphics Debugging (this also allows capturing frames for DirectXImage PresentationType).
  • Added support for Visibility property on objects derived from UIElement3D .
  • Added IsMaterialSortingEnabled property to DXScene to control if sorting objects by their materials is enabled. Enabling sorting improves performance because objects with the same materials are rendered one after another (this reduces the required DirectX state changes), but when you want to have determined order of rendering you can disable the sorting.
  • Improved automatically updating WireframeVisual3D when LineThickenss or LineColor is changed.
  • Improved hardware rendering of 3D lines - depth problems could occur when long lines are crossing the near plane (one end of the line is behind the line).
  • Added Clone method to GraphicsProfile to simplify creating your custom graphic profiles that are based on default graphics profiles.
  • Added ExecutePixelShaderPerSample to DXScene and to GraphicsProfile - this allows turning multisampling into supersampling for better shader quality (used by new UltraQualityHardwareRendering).
  • Prevented throwing exception when ImageBrush uses a texture with relative Uri.
  • Fixed using EmissiveMaterial properties on materials that do not have DiffuseMaterial (under some circumstances).
  • Fixed using Opacity or alpha value for EmissiveMaterial.
  • Changed some properties and methods in RenderingContext class and in some RenderingSteps - if you are an advanced DXEngine user and use custom rendering steps, you can contact us to get a full list of changes.


Export 3D models to Collada, obj, ply and stl files

This release also brings many new features to the Ab3d.PowerToys library.

The most important new feature is added ability to export WPF 3D models to Collada (.dae), obj, ply and stl files. This was really a highly requested feature. It allows creation of 3D models with WPF 3D and Ab3d.PowerToys that can be exported and used in some other 3D modelling application.

The code that does the exporting is using the great open source Assimp library. 

As with Ab3d.DXEngine, this release of Ab3d.PowerToys also has quite long list of improvements and fixes – the following is the full list of changes:

  • Added support for texture coordinates generation in extruded mesh - use new ExtrudeTextureCoordinatesGenerationType.
  • Added ConeTubeVisual3D - it can be used to create Visual3D that represents a 3D Tube with different top and bottom radius.
  • Added a new constructor to TubeMesh3D that takes different inner and outer radius of top and bottom of the tube.
  • Added IsXAxisShown, IsYAxisShown and IsZAxisShown properties to ModelMoverVisual3D to allow showing only specifed arrows.
  • Added MeshUtils.GenerateCylindricalTextureCoordinates method that generates TextureCoordinates based on the Cylindrical projection.
  • Added MeshUtils.Project3DPointsTo2DPlane to project 3D positions to a 2D plane.
  • Improved EventManager3D to call MouseLeave, MouseEnter and other events when the camera is changed by MouseWheel.
  • Added UpdateHitObjects method to EventManager3D - it can be used to manually update the current 3D object behind the mouse position - this is useful when camera is changed without changing the mouse position.
  • Improved FreezeMeshGeometry3D property on BoxVisual3D and SphereVisual3D so that they do not to be set before all other properties.
  • Added ModelUtils.HasAnyLight method that checks the Viewport3D, Visual3D or Model and returns true if any light is defined (it is possible to exclude AmbientLight).
  • Changed default AssimpWpfImporter.AssimpPostProcessSteps from PostProcessSteps.FlipUVs | PostProcessSteps.GenerateSmoothNormals | PostProcessSteps.Triangulate to PostProcessSteps.Triangulate.
  • Improved automatically setting shapeYVector in an overload of CreateExtrudedMeshGeometry that does not have the shapeYVector parameter.
  • Fixed problems with ModelMoverVisual3D when it is shown inside DXEngine and AxisLength, AxisRadius or AxisArrowRadius are changed after the ModelMoverVisual3D is already shown.
  • Fixed recreating 3D lines in cases when the parent ModelVisual3D is removed from Viewport3D, then the camera is changed and the parent ModelVisual3D is added to the scene again.


I hope that you like the new features and stay tuned for next version. The plan is to add support for shadow mapping and great new ways to animate the camera in 3D space.

Tags: , ,

Ab3d.PowerToys | DXEngine