Skip to content

Effects And Shaders

tomspilman edited this page Nov 14, 2012 · 18 revisions

Overview

A core element of Microsoft XNA is the effect system which is used for all rendering.

For MonoGame we have the burden of supporting stock and custom effects for desktop GLSL, mobile GLSL, DirectX HLSL, and custom formats like that of the PlayStation Suite. There currently is no effect system or shader language that supports all the platforms we require forcing us to build a new custom effect system.

MGFX

MGFX is MonoGame's own "FX" runtime and file format which has the following core goals:

  • Support a similar technique, passes, shaders structure as Microsoft FX files.
  • Have a textual format for ease of editing.
  • Have a compiled and optimized binary format for runtime use.
  • Be cross-platform and support multiple shader languages and bytecodes.
  • Easy to extend for future platforms and features.

Stock Effects

The following stock effects in MonoGame and fully supported on all current platforms:

  • BasicEffect
  • AlphaTestEffect
  • DualTextureEffect
  • EnvironmentMapEffect
  • SkinnedEffect

Under the hood these effects use the same system and tools as one would for a custom Effect. The source and pre-compiled versions of these effects can be found in the 'MonoGame.Framework\Graphics\Effect\Resources' folder.

If your game requires an extra little bit of performance you can easily hand edit the existing effects to remove unnecessary features or optimize for specific hardware and rebuild them with the MGFX tool.

Custom Effects

To use a custom effect with MonoGame you must do one of the following (not both):

  • Process your effect file with the 2MGFX tool then load it like the stock effects.
  • Run the effect file thru the MonoGame Effect content processor for use with the ContentManager.

Shader Writing Tips

These are some tips for converting shaders for use with MonoGame.

  • Use the DX11 feature levels vs_4_0_level_9_1 or ps_4_0_level_9_1 when targeting Windows 8 Metro applications and wanting to support all devices. Higher shader models work, but might not run on all Windows 8 systems.
  • When targeting Windows Phone 8 you can use vs_4_0_level_9_3 or ps_4_0_level_9_3.
  • We currently do not support sampler filter and address modes defined in the FX file. Set those from your game code instead.
  • We currently do not support setting render states from the FX file. Set those from your game code instead.

2MGFX

The 2MGFX tool is used to build a MonoGame Effect from an input Microsoft FX or MGFX file. Note it does not generate an XNB file for use with the ContentManager (see the MonoGame Effect content processor). The command line options are:

2MGFX <srcfile> <dstfile> [/DEBUG] [/DX11]

Roadmap

There is still work to be done for better support of custom effects and shaders in MonoGame:

  • Implement textual MGFX format for direct editing of effects.
  • Make automated tests for custom effects.
  • Support PlayStation Suite shaders in MGFX tools and formats.
  • String table all strings stored in MGFX files to save more space.
  • Support pre-compiled GLSL assembly instead of GLSL code.