Commit 7757e059 authored by Lukas Tietze's avatar Lukas Tietze

Kleinere Fixes

parent 1d34724f
......@@ -2,6 +2,7 @@
#define Softness (0.2)
#define NShadowSamples (4)
#define NGlobalLightSamples (0)
layout(location = 1) rayPayloadInNV bool isShadowed;
layout(binding = 0, set = 0) uniform accelerationStructureNV topLevelAS;
......
......@@ -6,14 +6,28 @@ int main()
{
lib::AppCreateInfo info;
info.shaderInfo.raygenShader.type = lib::ShaderType::Raygen_GLSL;
info.shaderInfo.raygenShader.path = "./assets/shaders/raygen.rgen";
info.shaderInfo.missShader.type = lib::ShaderType::Miss_GLSL;
info.shaderInfo.missShader.path = "./assets/shaders/miss.rmiss";
info.shaderInfo.closestHitShader.type = lib::ShaderType::ClosestHit_GLSL;
info.shaderInfo.closestHitShader.path = "./assets/shaders/closestHitDefault.rchit";
info.shaderInfo.shadowMissShader.type = lib::ShaderType::Miss_GLSL;
info.shaderInfo.shadowMissShader.path = "./assets/shaders/shadow.rmiss";
info.shaderTable.raygenShader.type = lib::ShaderType::Raygen_GLSL;
info.shaderTable.raygenShader.path = "./assets/shaders/raygen.rgen";
info.shaderTable.raygenShader.compileOptions.optimizationLevel = lib::ShaderOptimizationLevel::Performance;
lib::ShaderInfo miss;
miss.type = lib::ShaderType::Miss_GLSL;
miss.path = "./assets/shaders/miss.rmiss";
miss.compileOptions.optimizationLevel = lib::ShaderOptimizationLevel::Performance;
lib::ShaderInfo closestHit;
closestHit.type = lib::ShaderType::ClosestHit_GLSL;
closestHit.path = "./assets/shaders/closestHitDefault.rchit";
closestHit.compileOptions.optimizationLevel = lib::ShaderOptimizationLevel::Performance;
lib::ShaderInfo shadowMiss;
shadowMiss.type = lib::ShaderType::Miss_GLSL;
shadowMiss.path = "./assets/shaders/shadow.rmiss";
shadowMiss.compileOptions.optimizationLevel = lib::ShaderOptimizationLevel::Performance;
info.shaderTable.closestHitShaders.push_back(closestHit);
info.shaderTable.missShaders.push_back(miss);
info.shaderTable.missShaders.push_back(shadowMiss);
info.validationInfo.useValidationLayers = true;
info.validationInfo.requireValidationLayers = false;
......
......@@ -11,250 +11,248 @@
namespace lib
{
/**
/**
* @brief Stellt die Informationen f眉r die Konfiguration des Viewports und des Scissorings dar.
* Der Viewport beschreibt dabei die Abbildung des Sichtbaren Bereichs auf den Puffer.
* Das Scissoring beschreibt den sichtbaren Bereich des Puffers.
*/
struct ViewPortInfo
{
/**
struct ViewPortInfo
{
/**
* @brief Gibt an, ob der Viewport automatisch an die Fenstergr枚脽e angepasst werden soll oder nicht.
* Wenn dieser Wert true ist, werden die Werte in viewX, viewY, viewWidth und viewHeight ignoriert.
* Standardm盲脽ig true.
*/
bool viewAuto = true;
bool viewAuto = true;
/**
/**
* @brief Die X-Koordinate des Viewports.
*/
int viewX = 0;
int viewX = 0;
/**
/**
* @brief Die X-Koordinate des Viewports.
*/
int viewY = 0;
int viewY = 0;
/**
/**
* @brief Die Breite des Viewports.
*/
int viewWidth = 0;
int viewWidth = 0;
/**
/**
* @brief Die H枚he des Viewports.
*/
int viewHeight = 0;
int viewHeight = 0;
/**
/**
* @brief Gibt an, ob das Scissoring automatisch an die Fenstergr枚脽e angepasst werden soll oder nicht.
* Wenn dieser Wert true ist, werden die Werte in scissorX, scissorY, scissorWidth und scissorHeight ignoriert.
* Standardm盲脽ig true.
*/
bool scissorAuto = true;
bool scissorAuto = true;
/**
/**
* @brief Die X-Koordinate des Scissorings.
*/
int scissorX = 0;
int scissorX = 0;
/**
/**
* @brief Die X-Koordinate des Scissorings.
*/
int scissorY = 0;
int scissorY = 0;
/**
/**
* @brief Die Breite des Scissorings.
*/
int scissorWidth = 0;
int scissorWidth = 0;
/**
/**
* @brief Die H枚he des Scissorings.
*/
int scissorHeight = 0;
};
int scissorHeight = 0;
};
/**
/**
* @brief Stellt die Informationen f眉r die Erstellung des Anwendungsfensters dar.
*/
struct WindowCreateInfo
{
/**
struct WindowCreateInfo
{
/**
* @brief Die Breite des Fensters in Pixeln. Standardm盲脽ig 800.
*/
uint32_t width = 800;
uint32_t width = 800;
/**
/**
* @brief Die H枚he des Fensters in Pixeln. Standardm盲脽ig 600.
*/
uint32_t height = 600;
uint32_t height = 600;
/**
/**
* @brief Der Titel des Fensters. Standardm盲脽ig "App".
*/
const char *title = "App";
};
const char *title = "App";
};
/**
/**
* @brief Stellt die Informationen zum Logging dar. Diese k枚nnen auch manuell
* 眉ber lib::log::SetLoggingStatus() gesetzt werden.
*/
struct LoggingInfo
{
/**
struct LoggingInfo
{
/**
* @brief Gibt an, ob Debugnachrichten ausgegeben werden oder nicht. Standardm盲脽ig false.
*/
bool debugEnabled = IsDebug;
bool debugEnabled = IsDebug;
/**
/**
* @brief Gibt an, ob Informationen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool infosEnabled = IsDebug;
bool infosEnabled = IsDebug;
/**
/**
* @brief Gibt an, ob Warnungen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool warningsEnabled = true;
bool warningsEnabled = true;
/**
/**
* @brief Gibt an, ob Fehler ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool errorsEnabled = true;
};
bool errorsEnabled = true;
};
/**
/**
* @brief Stellt die Informationen zur Validierung dar.
*/
struct ValidationInfo
{
/**
struct ValidationInfo
{
/**
* @brief Gibt an, ob Validierungsschichten genutzt werden oder nicht. Standardm盲脽ig true.
*/
bool useValidationLayers = IsDebug;
bool useValidationLayers = IsDebug;
/**
/**
* @brief Gibt an, ob Validierungsschichten ben枚tigt werden oder nur optional sind. Standardm盲脽ig false.
*/
bool requireValidationLayers = IsDebug;
};
bool requireValidationLayers = IsDebug;
};
/**
/**
* @brief Stellt die Informationen f眉r das Laden von Shadern dar.
*/
struct ShaderCreateInfo
{
ShaderInfo raygenShader;
struct ShaderTable
{
ShaderInfo raygenShader;
ShaderInfo missShader;
std::vector<ShaderInfo> closestHitShaders;
ShaderInfo closestHitShader;
std::vector<ShaderInfo> missShaders;
};
ShaderInfo shadowMissShader;
};
/**
/**
* @brief Stellt die Informationen f眉r den dargestellten Titel dar.
*/
struct TitleInfo
{
/**
struct TitleInfo
{
/**
* @brief Gibt an, ob die Versionsnummer angezeigt wird oder nicht.
*/
bool showVersion = true;
bool showVersion = true;
/**
/**
* @brief Gibt an, ob die Buildtyp angezeigt wird oder nicht.
*/
bool showBuildType = IsDebug;
bool showBuildType = IsDebug;
/**
/**
* @brief Gibt an, ob der Zeitpunkt des aktuellen Builds angezeigt wird oder nicht.
*/
bool showTimeStamp = false;
bool showTimeStamp = false;
/**
/**
* @brief Gibt an, ob die FPS (Bilder pro Sekunde) im Titel angezeigt werden sollen oder nicht.
*/
bool showFPS = true;
};
bool showFPS = true;
};
/**
/**
* @brief Enth盲lt Informationen 眉ber das zu ladenden Modell
*/
struct ModelInfo
{
/**
struct ModelInfo
{
/**
* @brief Der Pfad zum ladenden Modell.
*/
std::string path;
std::string path;
/**
/**
* @brief Die Standard-Lichtquelle.
*/
std::vector<LightSource> lightSources = {
LightSource({0.f, 2.f, 0.f},
{1.f, 1.f},
glm::vec3(1.f),
LightSourceType::Point,
0.15f)};
/**
std::vector<LightSource> lightSources = {
LightSource({0.f, 2.f, 0.f},
{1.f, 1.f},
glm::vec3(1.f),
LightSourceType::Point,
0.15f)};
/**
* @brief Die Hintergrundfarbe.
*/
glm::vec3 clearColor = glm::vec3(0.f);
};
glm::vec3 clearColor = glm::vec3(0.f);
};
/**
/**
* @brief Stellt die Informationen zum Initialisieren einer neuen App dar.
*/
struct AppCreateInfo
{
/**
struct AppCreateInfo
{
/**
* @brief Die Informationen zur Erstellung des Fensters.
*/
WindowCreateInfo windowCreateInfo;
WindowCreateInfo windowCreateInfo;
/**
/**
* @brief Die Informationen 眉ber das Logging-Verhalten.
*/
LoggingInfo loggingInfo;
LoggingInfo loggingInfo;
/**
/**
* @brief Die Informationen zur Nutzung von Validierungsschichten.
*/
ValidationInfo validationInfo;
ValidationInfo validationInfo;
/**
/**
* @brief Die Informationen zum initialen Viewport und Scissoring.
*/
ViewPortInfo viewPortInfo;
ViewPortInfo viewPortInfo;
/**
/**
* @brief Die Informationen zu den initialen Shadern.
*/
ShaderCreateInfo shaderInfo;
ShaderTable shaderTable;
/**
/**
* @brief Die Informationen 眉ber das zu ladende Modell.
*/
ModelInfo modelInfo;
ModelInfo modelInfo;
/**
/**
* @brief Die Informationen 眉ber den anzuzeigenden Titel.
*
*/
TitleInfo titleInfo;
TitleInfo titleInfo;
/**
/**
* @brief Der Name der App. Standardm盲脽ig "App".
*/
std::string appName = "App";
std::string appName = "App";
/**
/**
* @brief Die maximale Anzahl an Bildern, die gleichzeitig in der Pipeline sein d眉rfen.
*/
uint32_t maxImagesInFlight = 5;
uint32_t maxImagesInFlight = 5;
bool Validate(bool silent = false) const;
};
bool Validate(bool silent = false) const;
};
} // namespace lib
......@@ -34,7 +34,7 @@ namespace lib
*
* @param shaderCreateInfo Die neuen Shader-Information.
*/
virtual void ChangeShaders(const ShaderCreateInfo &shaderCreateInfo) = 0;
virtual void ChangeShaders(const ShaderTable &shaderCreateInfo) = 0;
/**
* @brief L盲dt die Shader neu, dabei die angegebenen Dateien neu gelesen.
......@@ -181,15 +181,15 @@ namespace lib
const uint32_t indices = 7;
} const descriptorBindings;
std::vector<vk::DescriptorSet> descriptorSets;
struct
{
const uint32_t rayGen = 0;
const uint32_t miss = 1;
const uint32_t shadowMiss = 2;
const uint32_t hitGroup = 3;
} const shaderIndices;
uint32_t rayGen = 0;
uint32_t miss = 0;
uint32_t hitGroup = 0;
uint32_t count = 0;
} shaderOffsets;
std::vector<vk::DescriptorSet> descriptorSets;
std::unique_ptr<lib::Buffer> shaderBindingTableBuffer;
bool modelLoaded;
......@@ -284,7 +284,7 @@ namespace lib
lib::OneTimeCommandBuffer AllocateSingleUseStagingCommandBuffer();
lib::OneTimeCommandBuffer AllocateSingleUseComputeCommandBuffer();
void ChangeShaders(const ShaderCreateInfo &shaderCreateInfo) override;
void ChangeShaders(const ShaderTable &shaderCreateInfo) override;
void ReloadShaders() override;
void ChangeModel(const ModelInfo &modelinfo) override;
void ReloadModel() override;
......
......@@ -3,14 +3,21 @@
#include <string>
#include "GlfwAndVulkan.hpp"
#include "VkUtil/Buffer.hpp"
namespace lib
{
class CgContext;
/**
* @brief Stellt eine Textur dar.
*/
class Texture
{
private:
CgContext *parent;
lib::Buffer buffer;
public:
/**
* @brief Initialisiert eine neue Instanz der Texture Klasse und l盲dt die Daten aus
......@@ -42,6 +49,8 @@ namespace lib
* @param format Das Format der Daten, Standard ist RGBA mit 8 bit pro Kanal.
*/
template <typename T>
Texture(uint32_t width, uint32_t height, T generator, vk::Format format = vk::Format::eR8G8B8A8Uint) {}
Texture(uint32_t width, uint32_t height, T generator, vk::Format format = vk::Format::eR8G8B8A8Uint)
{
}
}; // namespace lib
} // namespace lib
#include <string>
#include <map>
#include <sstream>
#include <algorithm>
#include "Core/AppCreateInfo.hpp"
#include "Util/Logging.hpp"
namespace
{
enum class Error : uint16_t
{
AppNameEmpty,
ClosestHitShaderPathEmpty,
MissShaderPathEmpty,
RaygenShaderPathEmpty,
ShadowMissShaderPathEmpty,
};
bool IsPathEmpty(const lib::ShaderInfo &info)
{
return info.path.empty();
}
enum class Error : uint16_t
{
AppNameEmpty,
ClosestHitShaderPathEmpty,
MissShaderPathEmpty,
RaygenShaderPathEmpty,
};
std::map<Error, std::string> errorMessages = {
{Error::AppNameEmpty, "appName must not be empty!"},
{Error::ClosestHitShaderPathEmpty, "shaderInfo.vertexShader.path must not be empty!"},
{Error::MissShaderPathEmpty, "shaderInfo.fragmentShader.path must not be empty!"},
{Error::RaygenShaderPathEmpty, "shaderInfo.raygenShader.path must not be empty!"},
{Error::ShadowMissShaderPathEmpty, "shaderInfo.shadowMissShader.path must not be empty!"},
};
std::map<Error, std::string> errorMessages = {
{Error::AppNameEmpty, "appName must not be empty!"},
{Error::ClosestHitShaderPathEmpty, "All closest hit shaders must have a non-empty path!"},
{Error::MissShaderPathEmpty, "All miss shaders must have a non-empty path!"},
{Error::RaygenShaderPathEmpty, "The raygen shader must have a non-empty path!"},
};
} // namespace
bool lib::AppCreateInfo::Validate(bool silent) const
......@@ -34,26 +38,21 @@ bool lib::AppCreateInfo::Validate(bool silent) const
errors.push_back(Error::AppNameEmpty);
}
if (this->shaderInfo.closestHitShader.path.empty())
if (std::any_of(std::begin(this->shaderTable.closestHitShaders), std::end(this->shaderTable.closestHitShaders), ::IsPathEmpty))
{
errors.push_back(Error::ClosestHitShaderPathEmpty);
}
if (this->shaderInfo.missShader.path.empty())
if (std::any_of(std::begin(this->shaderTable.missShaders), std::end(this->shaderTable.missShaders), ::IsPathEmpty))
{
errors.push_back(Error::MissShaderPathEmpty);
}
if (this->shaderInfo.raygenShader.path.empty())
if (this->shaderTable.raygenShader.path.empty())
{
errors.push_back(Error::RaygenShaderPathEmpty);
}
if (this->shaderInfo.shadowMissShader.path.empty())
{
errors.push_back(Error::ShadowMissShaderPathEmpty);
}
if (!silent)
{
for (const auto &error : errors)
......
......@@ -177,9 +177,9 @@ void lib::CgContext::WaitDeviceIdle()
this->logicalDevice.waitIdle();
}
void lib::CgContext::ChangeShaders(const ShaderCreateInfo &info)
void lib::CgContext::ChangeShaders(const ShaderTable &info)
{
this->appInfo.shaderInfo = info;
this->appInfo.shaderTable = info;
this->ReloadShaders();
}
......
......@@ -164,6 +164,7 @@ void lib::CgContext::DestroyImGui()
void lib::CgContext::ReloadImGui()
{
ImGui_ImplVulkan_SetMinImageCount(static_cast<uint32_t>(this->swapChainImages.size()));
ImGui_ImplVulkan_Shutdown();
this->DestroyImGuiComponents();
this->CreateImGuiComponents();
......
......@@ -753,9 +753,9 @@ void lib::CgContext::UpdateCommandBuffer(uint32_t imageIndex)
commandBuffer.copyBuffer(this->uniformStagingBuffers[imageIndex].GetBufferHandle(),
this->uniformBuffers[imageIndex].GetBufferHandle(),
vk::BufferCopy(0, 0, this->uniformBuffers[imageIndex].GetSize()));
commandBuffer.traceRaysNV(this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderIndices.rayGen * sbtEntrySize,
this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderIndices.miss * sbtEntrySize, sbtEntrySize,
this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderIndices.hitGroup * sbtEntrySize, sbtEntrySize,
commandBuffer.traceRaysNV(this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderOffsets.rayGen * sbtEntrySize,
this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderOffsets.miss * sbtEntrySize, sbtEntrySize,
this->shaderBindingTableBuffer->GetBufferHandle(), this->shaderOffsets.hitGroup * sbtEntrySize, sbtEntrySize,
this->shaderBindingTableBuffer->GetBufferHandle(), 0, 0,
this->swapChainExtent.width, this->swapChainExtent.height, 1);
}
......@@ -1429,17 +1429,40 @@ void lib::CgContext::CreateDescriptorSets()
bool lib::CgContext::TryCreatePipeline()
{
auto raygenModule = this->LoadShader(this->appInfo.shaderInfo.raygenShader);
auto missModule = this->LoadShader(this->appInfo.shaderInfo.missShader);
auto closestHitModule = this->LoadShader(this->appInfo.shaderInfo.closestHitShader);
auto shadowMissModule = this->LoadShader(this->appInfo.shaderInfo.shadowMissShader);
bool success = false;
auto raygenModule = this->LoadShader(this->appInfo.shaderTable.raygenShader);
auto success = static_cast<bool>(raygenModule);
if (raygenModule &&
missModule &&
closestHitModule &&
shadowMissModule)
std::vector<vk::ShaderModule> missModules;
missModules.reserve(this->appInfo.shaderTable.missShaders.size());
for (const auto &missModule : this->appInfo.shaderTable.missShaders)
{
missModules.push_back(this->LoadShader(missModule));
success = success && missModules.back();
}
std::vector<vk::ShaderModule> closestHitModules;
closestHitModules.reserve(this->appInfo.shaderTable.closestHitShaders.size());
for (const auto &closestHitModule : this->appInfo.shaderTable.closestHitShaders)
{
closestHitModules.push_back(this->LoadShader(closestHitModule));
success = success && closestHitModules.back();
}
this->shaderOffsets.rayGen = 0;
this->shaderOffsets.miss = 1;
this->shaderOffsets.hitGroup = static_cast<uint32_t>(missModules.size() + this->shaderOffsets.miss);
this->shaderOffsets.count = static_cast<uint32_t>(this->shaderOffsets.hitGroup + closestHitModules.size());
if (success)
{
std::vector<vk::PipelineShaderStageCreateInfo> stageCreateInfos;
std::vector<vk::RayTracingShaderGroupCreateInfoNV> groupInfos;