添加输出图片为png格式的支持
parent
aff5dee7d4
commit
6e34140783
|
@ -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)
|
||||||
|
|
|
@ -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.
File diff suppressed because it is too large
Load Diff
|
@ -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());
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue