Selecting Reach vs. HiDef

When you create a Windows Phone game project, XNA defaults to Reach profile. When you create a Windows or Xbox 360 project, it defaults to HiDef. But it is also possible to target Reach from a Windows or Xbox game! There are two reasons you might want to do this:

  • If you want to distribute your Windows game and have it run on a wide range of computers that do not support HiDef functionality
  • If you are developing on Windows or Xbox, but plan on later porting to Windows Phone, and want to make sure you don’t accidentally use graphics features that are not supported on the phone

To use Reach on Windows or Xbox:

  • Right-click your project in Solution Explorer
  • Choose Properties
  • Focus the XNA Game Studio tab, and make your selection


You can also choose profiles at runtime, by setting GraphicsDeviceManager.GraphicsProfile from your Game constructor. It is usually better to specify this via the project properties, though.

  • If you do not explicitly set GraphicsDeviceManager.GraphicsProfile, it defaults to whatever was chosen in the project properties
  • Project properties also control the Content Pipeline build process, so it knows how to validate things like max texture size and supported formats
  • HiDef is a superset of Reach, so if you build content for Reach, you can load the resulting .xnb files into a HiDef graphics device
  • The reverse is not true: you cannot load content that was built for HiDef into a Reach graphics device

Comments (28)

  1. JulianR says:

    Hehe, if you speak of the devil. I was just figuring out why my shaders refused to compile with the error "XNA Framework Reach profile does not support vertex shader model 3.0". An odd thing though: when I fixed that by following this blog post, they still refused to compile as the shader compiler didn't like me naming a pixelshader 'PixelShader'. When I renamed it 'PS', it compiled.

  2. braddabug says:

    What's the best way to fallback to Reach if HiDef isn't supported? Can we build assets using Reach even when the rest of the game is built with HiDef, and then at runtime detect if HiDef isn't supported and switch to Reach?

  3. braddabug says:

    Maybe an "opt-in" approach would work better than an "opt-out." So you build the game with Reach, then at runtime determine if HiDef is supported, and if it is switch to HiDef.

  4. ShawnHargreaves says:

    > the shader compiler didn't like me naming a pixelshader 'PixelShader'

    Correct. 'PixelShader' is a reserved word in HLSL, so you can't use this for your own symbol names.

  5. ShawnHargreaves says:

    > What's the best way to fallback to Reach if HiDef isn't supported?

    Write code in your game constructor that checks which profile the adapter supports and sets GraphicsDeviceManager.GraphicsProfile accordingly.

    If all your content fits into Reach rules, you can build everything for Reach.

    If you have some content that needs to be built only for HiDef, you will need to make one more more library projects, so you can split the content up, building one library for Reach and the other for HiDef.

  6. RayB says:

    I know this probably isn't the correct place to ask this, but I'm getting the same error that JulianR was, except that when I follow both directions, I'm still receiving the error that vertex shader model 3.0 isn't supported. In this version of the beta, is it possible to set the content project to just ignore them if building for a certain platform or even conditionally build techniques based on their version? My project used to work perfectly until this version of the beta 😐

  7. ShawnHargreaves says:

    Hi Ray,

    The error "XNA Framework Reach profile does not support vertex shader model 3.0" means that the Content Pipeline is building using Reach, not HiDef. Make sure you have changed this in the project properties for whichever project contains the content that is giving this error. If that content is built by a game library, you need to set this on the library itself, not just the game that references that library.

  8. RayB says:

    Is there a place on line I can look a bit more into this? My VS seems to be quite stubborn on using Reach no matter what I tell it to do 🙂

  9. ShawnHargreaves says:

    Ray: you can manually inspect your project XML files to see for sure what settings are stored in them. Also if you upgraded from an earlier CTP, try recreating new projects to make sure you don't have any legacy CTP stuff getting in the way.

  10. RayB says:

    Thanks for the help! I had to recreate the CTP instead of upgrading from the previous one! I owe you ten internets 🙂

  11. JulianR says:

    > Correct. 'PixelShader' is a reserved word in HLSL, so you can't use this for your own symbol names.

    Figured as much, it's just that they compiled just fine under XNA 3.0, so I was a little surprised 🙂

  12. Chris Romstock says:

    How can I get a project that uses shader model 3.0 to run on a GPU that doesn't support DX10? With HiDef selected, XNA tells me my GPU (Geforce 7600 GT) isn't supported and with Reach selected it tells me shader model 3.0 isn't supported. The same project worked perfectly with XNA 3.1.

  13. ShawnHargreaves says:

    > How can I get a project that uses shader model 3.0 to run on a GPU that doesn't support DX10?

    The short answer is you cannot.  XNA 4 has only two graphics feature levels: Reach and HiDef. If your card does not support HiDef, you will only be able to run Reach games on it, which means you cannot use any HiDef features (such as shader model 3).

    One of the costs of simplifying the hardware caps matrix is less flexibility when it comes to hardware that falls in the gaps between our feature levels. Fortunately, though, the install base of shader model 3 DX9 GPUs (which lie in between Reach and HiDef) is now quite small, and shrinking all the time…

    If you want to make a HiDef game with GS4, you will have to upgrade to a more recent GPU.

  14. spongman says:

    do you have any sample code for point sprites in reach & hidef?

  15. ShawnHargreaves says:

    > do you have any sample code for point sprites in reach & hidef?

    Game Studio 4.0 does not support point sprites at all (see…/point-sprites-in-xna-game-studio-4-0.aspx for details), so no, no sample code for them.

  16. x2oop says:

    Hi, I have a few questions.

    – Will the final version of XNA 4.0 will support Windows XP?

    – If so, will we be able to use HiDef and Shader Model 3.0 on Windows XP (assuming that one has GPU that supports DX10), or Windows XP users are forced to Reach?

  17. MichaelT says:

    I would be a very happy camper if someone could tell me how to get a hidef graphicsdevice using F# and XNA. I got everything to work with F# and XNA except that. Is it even possible?

  18. MichaelT says:

    Never mind, I found it:

    graphics.GraphicsProfile <- GraphicsProfile.HiDef

    It is a case of "finding it when you no longer need it" 🙂

  19. Bela Kampis says:

    Hi Shawn, first off great blog, I`ve been using it a lot to help me develop this WPF + XNA 4 game I`m working on. I`m having a problem with xnb files copied over from one content project to another.

    What I needed to do was select the Reach profile because the game has to run on a fairly old set of Dell laptops that have very limited GPU capabilities. Thus I have to modify all my textures to use power of two sizes and rebuild them. I can now load the textures fine in a test project that I use just to validate the graphics device can handle the textures and load them properly, but when I copy over the folder of all these .xnbs to my game folder, each time I try and use the content manager via a Reach profile to load one of the textures, it says they are still created for a Hidef profile and I am in Reach. I don`t understand at all what`s happening. When I run the game in hidef with the hidef-built versions on my desktop, it can load the textures fine and I don`t need to limit them to power of twos or 2048×2048 sizes. The exact same code keeps throwing these exceptions, saying that I should be loading these resources in Hidef when I rebuilt them and they load fine in Reach via a real Game-based XNA project.

    Any ideas?

    My exact exception is :

    {Microsoft.Xna.Framework.Content.ContentLoadException: Error loading "_____". This file was compiled for the HiDef profile, and cannot be loaded into a Reach GraphicsDevice.

      at Microsoft.Xna.Framework.Graphics.GraphicsContentHelper.GraphicsDeviceFromContentReader(ContentReader contentReader)

      at Microsoft.Xna.Framework.Content.Texture2DReader.Read(ContentReader input, Texture2D existingInstance)

      at Microsoft.Xna.Framework.Content.ContentReader.InvokeReader[T](ContentTypeReader reader, Object existingInstance)

      at Microsoft.Xna.Framework.Content.ContentReader.ReadObjectInternal[T](Object existingInstance)

      at Microsoft.Xna.Framework.Content.ContentReader.ReadObject[T]()

      at Microsoft.Xna.Framework.Content.ContentReader.ReadAsset[T]()

      at Microsoft.Xna.Framework.Content.ContentManager.ReadAsset[T](String assetName, Action`1 recordDisposableObject)

      at Microsoft.Xna.Framework.Content.ContentManager.Load[T](String assetName)

      at _______.TextureManager.LoadAlphaTexture(String path) in ____________________.cs:line 182}

    I did a search for any files containing hidef and it looks like the default content importer assumes a HIdef graphics interpretation unless Reach is explicitly stated. So that if you aren`t using a Content pipeline reference in your project and just instantiating a ContentManager in code, it will throw this type of exception. Is there a way to set my content manager to interpret the XNB files as they truly are, i.e. compiled as Reach? I can`t figure it out.

  20. ShawnHargreaves says:

    Bela: this error means that whatever project you are using to build these .xnb files is set to HiDef as opposed to Reach profile, in its Visual Studio properties.

    btw. I would recommend the forums for getting help with issues like this: that's a better place than blog comments for tech support discussions!

  21. Niinii says:

    Thanx you little bit help me ^_^

  22. Team TFE says:

    It'd be nice if there was a way to get the fatbat's hack functionality officially added. I.e. we should be able to develop for hi-def on a non compliant machine as an option. My card is fully capable of everything required by hidef except two (unused) requirements. Since I'm devloping for xbox360, it's frustrating to be artificially limited by the dev machine rather than the final platform. You're basically forcing us to release a lower quality game due to this limitation, which is a lose-lose for everyone.

  23. Anon says:

    I'm sorry but I'm really starting to rage at this.. Y.. I don't have this interface. All I'm trying to swap the thing so it'll run a certain popular game going about. Nor do I see any connection between this and any programme in the XNA game studio programme folder.

  24. unknown says:

    hello! when i did it after the program show me an other error….

    that: No suitale graphics card found.

         Unable to create the graphics device.

    please answer me How can i fix it!


    sorry bad english. 😉

  25. Mati Rehman says:

    Thanks for the help , worked for me 🙂

  26. anonymous13 says:

    can anyone tell me how can i change profile?

  27. Branden says:

    If you start a new project and then up top on go to "Project" your project name should be the 2nd to last one it would say something like windowsgame1 properties… you can get to it and change it like the first post said

  28. MiRiKan says:

    Thanks! this it it what i need!