Dynamic Shader Linkage
One of the problems game developers face today is with the flexibility of shaders and their scalability as they get evermore complex. For example, if multiple shaders are needed in a certain scenario, a large “über” shader is often used because it combines all of the shaders that may be needed in that scenario into one piece of code.
However, the downside with this approach is that it results in incredibly complex shaders that are not only more inefficient (from a performance perspective) than individual shaders, but they are also very difficult to debug. The other solution is to write many specialised shaders that not only cover all scenarios, but also different classes of hardware as well.
For performance reasons, you don’t want to use an incredibly complex shader on hardware that won’t be able to work through it quick enough. The best solution is to use something that’s much simpler for lower classes of hardware – this ends up becoming overcomplicated and there are overheads associated with switching shaders. Understandably though, this can result in a lot of extra work – the über shader is the easiest option for the developer when it comes to writing the code, but it’s not exactly an ideal solution as described above.
Microsoft believes the answer to this problem is subroutines, enabling developers to link shaders together – it means developers can create simpler, more specialised shaders for the different classes of hardware being targeted, while also reducing the amount of register usage compared to a single shader that rules them all
. Hopefully, this should mean developers can be a little more ambitious when they’re writing shaders but it’s unlikely to have any direct impact on gamers.
Improved Texture Compression
It’s been a long time since Microsoft updated DirectX’s texture compression algorithms and, after listening to developer feedback, the company felt improvements were long overdue. Of the complaints filed by the development community, Microsoft took notice of the lack of support for HDR texture formats and also the fact that, when multi-texturing, the results are often incredibly blocky, regardless of the original texture’s resolution.
To fulfil these needs, D3D11 will introduce two new texture formats—BC6 (or BC6H) and BC7. The former is a high-definition texture format that is unfortunately not lossless; instead, it offers 6:1 compression with 16bpc (bits per channel) – this will enable efficient but relatively high quality texturing in scenes where there is extensive use of high-dynamic range lighting, but it won’t be exactly like it was originally.
BC7, on the other hand, is an LDR (low dynamic range) texture format and offers 3:1 compression for RGB. What’s more, BC7 can be used in conjunction with alpha at a slight loss in quality—4:1 compared to the aforementioned 3:1 compression ratio—but it will still maintain a very high quality.
In addition to this, Microsoft has said that texture decompression in DirectX 11 must be done in a way that’s completely accurate with the API’s specification. The reason for this is to further increase texture decompression quality because, until DirectX 11 arrives, there is some leeway for hardware vendors to “tweak” the way DirectX 10 (and earlier) hardware handles texture decompression.