Compare commits

...

3 Commits

Author SHA1 Message Date
ink-soul 86b0ae386b Merge branch 'main' of https://gitea.inksoul.top/inksoul/plumageRender into headless 2024-04-12 10:04:34 +08:00
ink-soul d4beea0076 添加ktx环境贴图 2024-04-11 18:24:19 +08:00
ink-soul 02d6974134 修复模型自旋转,允许相机根据模型自适应距离
已知问题:加载其他ktx环境贴图会发生贴图倒置的情况
2024-04-11 16:28:54 +08:00
15 changed files with 35 additions and 22 deletions

View File

@ -2196,7 +2196,7 @@ void VulkanExampleBase::handleMouseMove(int32_t x, int32_t y)
camera.translate(glm::vec3(-0.0f, 0.0f, dy * .005f * camera.movementSpeed));
}
if (mouseButtons.middle) {
camera.translate(glm::vec3(-dx * 0.01f, -dy * 0.01f, 0.0f));
camera.translate(glm::vec3(-dx * 0.01f, dy * 0.01f, 0.0f));
}
mousePos = glm::vec2((float)x, (float)y);
}

View File

@ -124,7 +124,7 @@ public:
bool outputPNGimage = false;
uint32_t endFrameIndex = 75;
bool enableSaveToImageSequeue = true; // 图片序列开关(暂时弃用)
uint32_t outputFrameCount = 75; // 图片序列结束帧
uint32_t outputFrameCount = 100; // 图片序列结束帧
bool takeScreenShot = false; // 截屏(暂时弃用)
uint32_t startFrameCount = 1; // 图片序列开始帧

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -196,13 +196,14 @@ PlumageRender::PlumageRender()
{
std::cout << "Loading scene from " << filename << std::endl;
models.scene.destroy(device);
animationIndex = 0;
animationTimer = 0.0f;
auto tStart = std::chrono::high_resolution_clock::now();
models.scene.loadFromFile(filename, vulkanDevice, queue);
auto tFileLoad = std::chrono::duration<double, std::milli>(std::chrono::high_resolution_clock::now() - tStart).count();
std::cout << "Loading took " << tFileLoad << " ms" << std::endl;
camera.setPosition({ 0.0f, 0.0f, -1.0f });
camera.setPosition({ 0.0f, 0.0f, -6.0f });
camera.setRotation({ 0.0f, 0.0f, 0.0f });
}
@ -262,7 +263,7 @@ PlumageRender::PlumageRender()
loadScene(sceneFile.c_str());
models.skybox.loadFromFile(PlumageRender::filePath.skyboxModleFilePath, vulkanDevice, queue);
loadEnvironment(envMapFile.c_str());
}
@ -684,17 +685,17 @@ PlumageRender::PlumageRender()
switch (target) {
case IRRADIANCE:
format = VK_FORMAT_R32G32B32A32_SFLOAT;
dim = 64;
dim = 128;
break;
case PREFILTEREDENV:
format = VK_FORMAT_R16G16B16A16_SFLOAT;
dim = 512;
dim = 4096;
break;
};
const uint32_t numMips = static_cast<uint32_t>(floor(log2(dim))) + 1;
// Create target cubemap
// Create target cubemap static_cast<uint32_t>(floor(log2(dim))) +
{
// Image
VkImageCreateInfo imageCI{};
@ -1084,7 +1085,7 @@ PlumageRender::PlumageRender()
break;
case PREFILTEREDENV:
prefilterPushBlock.mvp = glm::perspective((float)(M_PI / 2.0), 1.0f, 0.1f, 512.0f) * matrices[f];
prefilterPushBlock.roughness = (float)m / (float)(numMips - 1);
prefilterPushBlock.roughness = 0.0;//(float)m / (float)(numMips - 1);
vkCmdPushConstants(cmdBuf, pipelinelayout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PrefilterPushBlock), &prefilterPushBlock);
break;
};
@ -1211,7 +1212,7 @@ PlumageRender::PlumageRender()
auto tStart = std::chrono::high_resolution_clock::now();
const VkFormat format = VK_FORMAT_R16G16_SFLOAT;
const int32_t dim = 512;
const int32_t dim = 2048;
// Image
VkImageCreateInfo imageCI{};
@ -1480,23 +1481,35 @@ PlumageRender::PlumageRender()
shaderDataScene.projection = camera.matrices.perspective;
shaderDataScene.view = camera.matrices.view;
float modelSize = std::max(models.scene.aabb[0][0], std::max(models.scene.aabb[1][1], models.scene.aabb[2][2]));
// Center and scale model
float scale = (1.0f / std::max(models.scene.aabb[0][0], std::max(models.scene.aabb[1][1], models.scene.aabb[2][2]))) * 0.5f;
float scale = (1.0f / modelSize ) * 0.5f;
glm::vec3 translate = -glm::vec3(models.scene.aabb[3][0], models.scene.aabb[3][1], models.scene.aabb[3][2]);
translate += -0.5f * glm::vec3(models.scene.aabb[0][0], models.scene.aabb[1][1], models.scene.aabb[2][2]);
//camera.setPosition(glm::vec3(0, 0, -modelSize - 2));
shaderDataScene.model = glm::mat4(1.0f);
shaderDataScene.model[0][0] = scale;
shaderDataScene.model[1][1] = scale;
shaderDataScene.model[2][2] = scale;
shaderDataScene.model = glm::translate(shaderDataScene.model, translate);
if (settings.rotateModel)
{
shaderDataScene.model = glm::mat4(1.0f);
shaderDataScene.model = glm::rotate(shaderDataScene.model, glm::radians(modelrot), glm::vec3(0, 1, 0));
}
shaderDataScene.camPos = glm::vec3(
-camera.position.z * sin(glm::radians(camera.rotation.y)) * cos(glm::radians(camera.rotation.x)),
-camera.position.z * sin(glm::radians(camera.rotation.x)),
camera.position.z * cos(glm::radians(camera.rotation.y)) * cos(glm::radians(camera.rotation.x))
);
// Skybox
shaderDataSkybox.projection = camera.matrices.perspective;
shaderDataSkybox.view = camera.matrices.view;
@ -1510,6 +1523,7 @@ PlumageRender::PlumageRender()
sin(glm::radians(lightSource.rotation.y)),
cos(glm::radians(lightSource.rotation.x)) * cos(glm::radians(lightSource.rotation.y)),
0.0f);
}
void PlumageRender::windowResized()
@ -1530,8 +1544,7 @@ PlumageRender::PlumageRender()
camera.setPerspective(45.0f, (float)width / (float)height, 0.1f, 256.0f);
camera.rotationSpeed = 0.25f;
camera.movementSpeed = 0.1f;
camera.setPosition({ 0.0f, 0.0f, -1.0f });
camera.setRotation({ 0.0f, 0.0f, 0.0f });
waitFences.resize(renderAhead);
presentCompleteSemaphores.resize(renderAhead);
@ -2009,11 +2022,11 @@ PlumageRender::PlumageRender()
frameIndex += 1;
frameIndex %= renderAhead;
if (!paused) {
if (settings.rotateModel) {
modelrot.y += frameTimer * 35.0f;
if (modelrot.y > 360.0f) {
modelrot.y -= 360.0f;
modelrot += frameTimer * 2.0f;
if (modelrot > 360.0f) {
modelrot -= 360.0f;
}
}
if ((animate) && (models.scene.animations.size() > 0)) {
@ -2027,7 +2040,7 @@ PlumageRender::PlumageRender()
if (settings.rotateModel) {
updateUniformBuffers();
}
}
if (camera.updated) {
updateUniformBuffers();
}

View File

@ -82,7 +82,7 @@ public:
float exposure = 4.5f;
float gamma = 2.2f;
float prefilteredCubeMipLevels;
float scaleIBLAmbient = 1.0f;
float scaleIBLAmbient = 2.0f;
float debugViewInputs = 0;
float debugViewEquation = 0;
} shaderData;
@ -144,10 +144,10 @@ public:
struct FilePath
{ //model path
std::string glTFModelFilePath = getAssetPath() + "models/DamagedHelmet/DamagedHelmet.gltf";
std::string glTFModelFilePath = getAssetPath() + "models/sauvage_perfume.glb";
std::string modelVertShaderPath = getAssetPath() + "buster_drone/shaders/glsl/mesh.vert.spv";
std::string modelFragShaderPath = getAssetPath() + "buster_drone/shaders/glsl/mesh.frag.spv";
//ui
std::string uiVertShaderPath = getAssetPath() + "shaders/ui.vert.spv";
std::string uiFragShaderPath = getAssetPath() + "shaders/ui.frag.spv";
@ -174,7 +174,7 @@ public:
std::string brdfVertShaderPath = getAssetPath() + "shaders/genbrdflut.vert.spv";
std::string brdfFragShaderPath = getAssetPath() + "shaders/genbrdflut.frag.spv";
// environment map texture
std::string envMapFilePath = getAssetPath() + "environments/papermill.ktx";
std::string envMapFilePath = getAssetPath() + "environments/kloofendal_43d_clear_puresky_hdr16f_cube.ktx";
std::string emptyEnvmapFilePath = getAssetPath() + "textures/empty.ktx";
// pbr shader
std::string pbrVertShaderPath = getAssetPath() + "shaders/pbr.vert.spv";
@ -197,7 +197,7 @@ public:
} filePath;
glm::vec3 modelrot = glm::vec3(0.0f);
float modelrot = 0.0f;
glm::vec3 modelPos = glm::vec3(0.0f);