i managed to load jpg images and use them as textures in vulkan, however different images give different results, with some images it works just fine, with others it does not map well.
here is the code block related to image loading and format transition:-
void Vulkan::createTextureImage()
{
SDL_Surface *tempImg;
SDL_RWops *rwop;
rwop = SDL_RWFromFile("Textures/img1.jpg", "rb");
tempImg = IMG_LoadJPG_RW(rwop);
SDL_Surface *image = SDL_ConvertSurfaceFormat(tempImg, SDL_PIXELFORMAT_ABGR8888, 0);
VkDeviceSize imageSize = image->format->BytesPerPixel * image->h * image->w;
if (!image)
{
throw std::runtime_error("failed to load texture image!");
}
VkImage stagingImage;
VkDeviceMemory staingImageMemory;
createImage(
image->w, image->h,
VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_TILING_LINEAR,
VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
stagingImage,
staingImageMemory);
std::cout << "the image size is " << imageSize << std::endl;
void * data;
vkMapMemory(device, staingImageMemory, 0, imageSize, 0, &data);
memcpy(data, image->pixels, (size_t)imageSize);
vkUnmapMemory(device, staingImageMemory);
createImage(
image->w, image->h,
VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
textureImage,
textureImageMemory);
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
copyImage(stagingImage, textureImage, image->w, image->h);
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
}
the only modification i have done is to flip the V component of the texture to fix the mirrored images