添加输出图片为png格式的支持

pull/3/head
ink-soul 2024-03-28 17:52:33 +08:00
parent aff5dee7d4
commit 6e34140783
6 changed files with 1793 additions and 32 deletions

View File

@ -9,6 +9,7 @@ include_directories(external)
include_directories(external/glm) include_directories(external/glm)
include_directories(external/gli) include_directories(external/gli)
include_directories(external/imgui) include_directories(external/imgui)
include_directories(external/stb)
include_directories(external/tinygltf) include_directories(external/tinygltf)
include_directories(external/ktx/include) include_directories(external/ktx/include)
include_directories(external/ktx/other_include) include_directories(external/ktx/other_include)

View File

@ -119,7 +119,7 @@ public:
bool multiSampling = true; // 多重采样 bool multiSampling = true; // 多重采样
bool rotateModel = true; // 模型自旋转(暂时失效) bool rotateModel = true; // 模型自旋转(暂时失效)
bool headless = false; // 无头开关 bool headless = false; // 无头开关
bool outputPNGimage = true;
bool enableSaveToImageSequeue = false; // 图片序列开关(暂时弃用) bool enableSaveToImageSequeue = false; // 图片序列开关(暂时弃用)
uint32_t outputFrameCount = 75; // 图片序列结束帧 uint32_t outputFrameCount = 75; // 图片序列结束帧
bool takeScreenShot = false; // 截屏(暂时弃用) bool takeScreenShot = false; // 截屏(暂时弃用)

Binary file not shown.

1724
external/stb/stb_image_write.h vendored 100644

File diff suppressed because it is too large Load Diff

View File

@ -1755,42 +1755,55 @@ PlumageRender::PlumageRender()
vkMapMemory(device, dstImageMemory, 0, VK_WHOLE_SIZE, 0, (void**)&data); vkMapMemory(device, dstImageMemory, 0, VK_WHOLE_SIZE, 0, (void**)&data);
data += subResourceLayout.offset; data += subResourceLayout.offset;
std::ofstream file(filePath, std::ios::out | std::ios::binary);
// ppm header if (settings.outputPNGimage)
file << "P6\n" << width << "\n" << height << "\n" << 255 << "\n";
// If source is BGR (destination is always RGB) and we can't use blit (which does automatic conversion), we'll have to manually swizzle color components
bool colorSwizzle = false;
// Check if source is BGR
// Note: Not complete, only contains most common and basic BGR surface formats for demonstration purposes
if (!supportsBlit)
{ {
std::vector<VkFormat> formatsBGR = { VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM }; stbi_write_png(filePath.c_str(), width, height, 4, data, static_cast<int>(subResourceLayout.rowPitch));
colorSwizzle = (std::find(formatsBGR.begin(), formatsBGR.end(), swapChain.colorFormat) != formatsBGR.end());
} }
else
// ppm binary pixel data
for (uint32_t y = 0; y < height; y++)
{ {
unsigned int* row = (unsigned int*)data;
for (uint32_t x = 0; x < width; x++) std::ofstream file(filePath, std::ios::out | std::ios::binary);
// ppm header
file << "P6\n" << width << "\n" << height << "\n" << 255 << "\n";
// If source is BGR (destination is always RGB) and we can't use blit (which does automatic conversion), we'll have to manually swizzle color components
bool colorSwizzle = false;
// Check if source is BGR
// Note: Not complete, only contains most common and basic BGR surface formats for demonstration purposes
if (!supportsBlit)
{ {
if (colorSwizzle) std::vector<VkFormat> formatsBGR = { VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM };
{ colorSwizzle = (std::find(formatsBGR.begin(), formatsBGR.end(), swapChain.colorFormat) != formatsBGR.end());
file.write((char*)row + 2, 1);
file.write((char*)row + 1, 1);
file.write((char*)row, 1);
}
else
{
file.write((char*)row, 3);
}
row++;
} }
data += subResourceLayout.rowPitch;
// ppm binary pixel data
for (uint32_t y = 0; y < height; y++)
{
unsigned int* row = (unsigned int*)data;
for (uint32_t x = 0; x < width; x++)
{
if (colorSwizzle)
{
file.write((char*)row + 2, 1);
file.write((char*)row + 1, 1);
file.write((char*)row, 1);
}
else
{
file.write((char*)row, 3);
}
row++;
}
data += subResourceLayout.rowPitch;
}
file.close();
} }
file.close();
std::cout << "Screenshot saved to " << filePath << std::endl; std::cout << "Screenshot saved to " << filePath << std::endl;
@ -1821,7 +1834,18 @@ PlumageRender::PlumageRender()
return; return;
} }
signal.imageSequenceOutputComplete = true; signal.imageSequenceOutputComplete = true;
std::string fileName = "/%dresult.ppm";
std::string fileName;
if (settings.outputPNGimage)
{
fileName = "/%dresult.png";
}
else
{
fileName = "/%dresult.ppm";
}
filePath.totalImageOutputPath = filePath.deviceSpecFilePath + fileName; filePath.totalImageOutputPath = filePath.deviceSpecFilePath + fileName;
return; return;
} }
@ -1829,7 +1853,16 @@ PlumageRender::PlumageRender()
{ {
std::filesystem::create_directories(filePath.deviceSpecFilePath.c_str()); std::filesystem::create_directories(filePath.deviceSpecFilePath.c_str());
} }
std::string fileName ="/" + std::to_string(savedFrameCounter) + "result.ppm"; std::string fileNameSuffix;
if (settings.outputPNGimage)
{
fileNameSuffix = "result.png";
}
else
{
fileNameSuffix = "dresult.ppm";
}
std::string fileName ="/" + std::to_string(savedFrameCounter) + fileNameSuffix;
filePath.totalImageOutputPath = filePath.deviceSpecFilePath + fileName; filePath.totalImageOutputPath = filePath.deviceSpecFilePath + fileName;
//std::cout << outputPath << std::endl; //std::cout << outputPath << std::endl;
writeImageToFile(filePath.totalImageOutputPath.c_str()); writeImageToFile(filePath.totalImageOutputPath.c_str());

View File

@ -9,6 +9,9 @@
#include<dirent.h> #include<dirent.h>
#endif #endif
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb/stb_image_write.h"
#include <stdio.h> #include <stdio.h>