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

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.

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?

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.

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 😐

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.

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.

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.

> 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.

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.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.

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.

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.

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