Handeling sRGB textures correctly

This topic is 2789 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

I'm a bit confused about how to properly handle sRGB textures, specifically diffuse textures that are DXT1 encoded.

I'm not 100% sure how the DDS files should be generated. I'm using the texconv tool that comes with the SDK. Since my source image is a sRGB image created in photoshop, I think I should use both the -srgbi and -srgbo flags when encoding the texture.

Next I tried to load the texture like so:

 D3DX11CreateShaderResourceViewFromFile(pDevice, "diffuse.dds", NULL, NULL, &pTextureRV1, NULL); 

I have a DXGI_FORMAT_R8G8B8A8_UNORM_SRGB framebuffer format and the diffuse texture is not being displayed correctly (it's too dark). I can only guess that D3DX11CreateShaderResourceViewFromFile is not automatically detecting that the image is sRGB.

So next I tried this:

 D3DX11_IMAGE_LOAD_INFO loadInfo; loadInfo.Width = D3DX11_DEFAULT; loadInfo.Height = D3DX11_DEFAULT; loadInfo.Depth = D3DX11_DEFAULT; loadInfo.FirstMipLevel = D3DX11_DEFAULT; loadInfo.MipLevels = D3DX11_DEFAULT; loadInfo.Usage = D3D11_USAGE_IMMUTABLE; loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE; loadInfo.CpuAccessFlags = 0; loadInfo.MiscFlags = 0; loadInfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; loadInfo.Filter = D3DX11_FILTER_SRGB_IN | D3DX11_FILTER_SRGB_OUT | D3DX11_FILTER_NONE; loadInfo.MipFilter = D3DX11_DEFAULT; loadInfo.pSrcInfo = NULL; D3DX11CreateShaderResourceViewFromFile(pDevice, "diffuse.dds", &loadInfo, NULL, &pTextureRV1, NULL); 

This seems to work, but I notice that is take a much longer to load the texture. Before it loaded almost instantly, but now it takes a second or two to load.

Share on other sites
You probably don't want to use that old texconv tool. It can only output the old D3D9-style DDS format, which can't use sRGB texture formats. You'll want to use the new D3D10-style DDS format, which is supported by the extended texture conversion tool (texconvex.exe). Or you can make your own tool using D3DX11SaveTextureToFile, or the new DirectXTex library. There's also a new version of the texconv tool in the DirectXTex download.

Also, the reason your loading is taking long is probably because it's generating mipmaps. I think you have to specify exactly the number of mips of in the file (which you can get using D3DX11GetImageInfoFromFile) if you don't want it to generate new mips.

Share on other sites
The texconvex tool that came in the SDK doesn't seem to work for me. Sometimes it refuses to load a image and simply gives a cryptic error message reading [file name] FAILED (887c0002). When it manages to actually output an image, the texture file is blank (full of zeros). It doesn't matter what format I try or what images I use.

I figured out the reason it was taking a relatively long time to load the texture. In my D3DX11_IMAGE_LOAD_INFO structure I had set the format to DXGI_FORMAT_R8G8B8A8_UNORM_SRGB when it should have been DXGI_FORMAT_BC1_UNORM_SRGB. Using D3DX11GetImageInfoFromFile gets rid of that problem.

I took a look at DirectXTex, unfortunately I was unable to compile the source. I am using VS2010 Express and it does not support OpenMP. I think I may just write my own texture tool instead.

Share on other sites
That's too bad about the texture conversion tool. You're probably better off writing your own tool anyway...it's not very hard to do, and it'll let you handle things the way that makes sense for your needs.

I didn't realize that DirectXTex required OpenMP. It looks like it's set up to compile without OpenMP enabled, so you might be able to disable it in the project and get it to compile in the express version.

• Game Developer Survey

We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a \$15 incentive for your time and insights. Click here to start!

• 15
• 12
• 9
• 11
• 15