Aedoro
Aedoro

Reputation: 898

Vulkan vkCreateImage with 3 components

I am trying to use vkCreateImage with a 3-component image (rgb). But all the the rgb formats give:

vkCreateImage format parameter (VK_FORMAT_R8G8B8_xxxx) is an unsupported format

Does this mean that I have to reshape the data in memory? So add an empty byte after each 3, and then load it as RGBA? I also noticed R8 and R8G8 formats do work, so I would guess the only reason RGB is not supported because 3 is not a power of two.

Before I actually do this reshaping of the data I'd like to know for sure that this is the only way, because it is not very good for performance and maybe there is some offset or padding value somewhere that will help loading the RGB data into an RGBA format. So can somebody confirm the reshaping into RGBA is a necessary step to load RGB formats (albeit with 33% overhead)?

Thanks in advance.

Upvotes: 4

Views: 1608

Answers (1)

Nicol Bolas
Nicol Bolas

Reputation: 473447

First, you're supposed to check to see what is supported before you try to create an image. You shouldn't rely on validation layers to stop you; that's just a debugging aid to catch something when you forgot to check. What is and is not supported is dynamic, not static. It's based on your implementation. So you have to ask every time your application starts whether the formats you intend to use are available.

And if they are not, then you must plan accordingly.

Second, yes, if your implementation does not support 3-channel formats, then you'll need to emulate them with a 4-channel format. You will have to re-adjust your data to fit your new format.

If you don't like doing that, I'm sure there are image editors you can use to load your image, add an opaque alpha of 1.0, and save it again.

Upvotes: 3

Related Questions