Jump to content

  • Log In with Google      Sign In   
  • Create Account

Handeling sRGB textures correctly


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Chris_F   Members   -  Reputation: 2369

Like
0Likes
Like

Posted 03 March 2012 - 07:48 PM

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

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.

Sponsor:

#2 MJP   Moderators   -  Reputation: 11338

Like
1Likes
Like

Posted 03 March 2012 - 08:16 PM

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.

#3 Chris_F   Members   -  Reputation: 2369

Like
0Likes
Like

Posted 03 March 2012 - 08:31 PM

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

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.

#4 MJP   Moderators   -  Reputation: 11338

Like
0Likes
Like

Posted 04 March 2012 - 12:33 AM

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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS