Commit 85918bcd authored by Lukas Tietze's avatar Lukas Tietze

Licht und Updates und neue Struktuen.

parent 0db0041f
......@@ -24,7 +24,6 @@ layout(binding = 2, set = 0) uniform SimpleSceneDescriptionBlock {
layout(binding = 3, set = 0) buffer Materials { Material m[]; } materials;
layout(binding = 4, set = 0) buffer ObjectInstances { Object o[]; } objectInstances;
layout(binding = 5, set = 0) buffer LightSources { LightSource l[]; } lightSources;
layout(binding = 6, set = 0) buffer Vertices { Vertex v[]; } vertices[];
layout(binding = 7, set = 0) buffer Indices { uint i[]; } indices[];
......@@ -67,9 +66,15 @@ void main()
uint seed = tea(gl_LaunchIDNV.y * gl_LaunchSizeNV.x + gl_LaunchIDNV.x, rngSeed);
for(int i = 0; i < 1; i++)
const vec3 camPos = CameraPos(scene.s.camera);
for(int i = 0; i < MaxLights; i++)
{
res += CalcLight(lightSources.l[i], mat, N, worldPos, SceneCamPos(scene.s), seed);
LightSource light = scene.s.lights[i];
if(LightEnabled(light) && distance(camPos, LightPosition(light)) < LightEffectiveRange(light)) {
res += CalcLight(light, mat, N, worldPos, camPos, seed);
}
}
float reflectivity = MaterialRefractionIndex(mat) - 1;
......
......@@ -13,22 +13,19 @@ vec3 CalcLight(LightSource light, Material mat, vec3 N, vec3 worldPos, vec3 camP
float a;
float tMax;
if(LightTypeIsDirectional(light))
if(LightTypeIsPoint(light))
{
L = LightPosition(light);
a = 1.0;
tMax = RayTMax;
}
else if(LightTypeIsPoint(light)) {
const vec3 toL = LightPosition(light) - worldPos;
const float rayLen = length(toL);
L = normalize(toL);
a = 1.0 / (1 + pow(rayLen, 2));
tMax = rayLen;
tMax = rayLen;
}
else {
return vec3(0);
else
{
L = LightPosition(light);
a = 1.0;
tMax = RayTMax;
}
int nHits = 0;
......
......@@ -4,6 +4,10 @@
Enth盲lt Strukturen und Funktionen, die von allen anderen Shadern genutzt werden k枚nnen.
*/
#define MaxLights 8
#define RayTMin 0.001
#define RayTMax 100000.0
/*
* Hit payload.
*/
......@@ -64,21 +68,20 @@ struct Object
*/
struct LightSource
{
vec4 position;
vec4 color;
vec4 ambientFactor_enabled_type_effectiveRange;
vec4 size;
vec4 positionXYZ_enabled;
vec4 colorRGB_ambientFactor;
vec4 type_customAttribsXYZ;
};
#define LightPosition(obj) (obj.position.xyz)
#define LightDimension(obj) (obj.size.xy)
#define LightColor(obj) (obj.color.rgb)
#define LightAmbientFactor(obj) (obj.ambientFactor_enabled_type_effectiveRange.x)
#define LightEnabled(obj) (obj.ambientFactor_enabled_type_effectiveRange.y)
#define LightType(obj) (obj.ambientFactor_enabled_type_effectiveRange.z)
#define LightEffectiveDirection(obj) (obj.ambientFactor_enabled_type_effectiveRange.w)
#define LightTypeIsDirectional(obj) (obj.ambientFactor_enabled_type_effectiveRange.z == 1.0)
#define LightTypeIsPoint(obj) (obj.ambientFactor_enabled_type_effectiveRange.z == 0.0)
#define LightPosition(obj) (obj.positionXYZ_enabled.xyz)
#define LightEnabled(obj) (obj.positionXYZ_enabled.w != 0)
#define LightColor(obj) (obj.colorRGB_ambientFactor.rgb)
#define LightAmbientFactor(obj) (obj.colorRGB_ambientFactor.w)
#define LightType(obj) (obj.type_customAttribsXYZ.x)
#define LightEffectiveRange(obj) (1000)
#define LightTypeIsPoint(obj) (obj.type_customAttribsXYZ.x == 0.0)
#define LightTypeIsDirectional(obj) (obj.type_customAttribsXYZ.x == 1.0)
#define LightTypeIsSquare(obj) (obj.type_customAttribsXYZ.x == 2.0)
struct Camera
{
......@@ -88,17 +91,15 @@ struct Camera
mat4 projectionInverse;
};
#define CameraPos(obj) (obj.viewInverse[3].xyz)
struct SimpleSceneDescription
{
Camera camera;
vec4 clearColor_numLights;
vec4 clearColor_1unused;
LightSource lights[MaxLights];
};
#define SceneClearColor(obj) (obj.clearColor_numLights.xyz)
#define SceneNumLights(obj) (obj.clearColor_numLights.w)
#define SceneCamPos(obj) (obj.camera.viewInverse[3].xyz)
#define RayTMin 0.001
#define RayTMax 100000.0
#define SceneClearColor(obj) (obj.clearColor_1unused.xyz)
#endif /*RAYCOMMON_GLSL*/
\ No newline at end of file
......@@ -2,8 +2,12 @@
#include "Core/App.hpp"
#include "glm/glm.hpp"
namespace app
{
constexpr glm::vec3 Light0BasePos{0, 3, 3};
class VkrtApp : public lib::IAppAdapter
{
private:
......
......@@ -156,7 +156,9 @@ void app::VkrtApp::UpdateLight(lib::App &app, lib::time_diff_t delta)
auto &light = app.GetContext().GetLightSources()[0];
light.SetPosition(light.GetPosition() + glm::vec3{0, this->light.yBase + this->light.y - this->light.yMax / 2.f, 0});
light.SetPosition({0,
this->light.yBase + std::abs(this->light.y - this->light.yMax / 2.f),
0});
}
void app::VkrtApp::RenderUi(lib::App &app)
......
......@@ -37,12 +37,11 @@ int main()
info.modelInfo.path = "assets/models/cornell-box.obj";
info.modelInfo.clearColor = glm::vec3(0.f, 0.f, 0.f);
info.modelInfo.lightSources.resize(1);
info.modelInfo.lightSources[0].SetType(lib::LightSourceType::Point);
info.modelInfo.lightSources[0].SetAmbientFactor(0.15f);
info.modelInfo.lightSources[0].SetColor(glm::vec3(1.f, 1.f, 1.f) * 4.f);
info.modelInfo.lightSources[0].SetEnabled(true);
info.modelInfo.lightSources[0].SetPosition({0.f, 4.f, 0.f});
info.modelInfo.lightSources[0].SetPosition(app::Light0BasePos);
app::VkrtApp handler;
lib::App app(info);
......
......@@ -7,18 +7,20 @@
namespace lib
{
#ifdef NDEBUG
constexpr bool IsDebug = false;
constexpr bool IsDebug = false;
#else
constexpr bool IsDebug = true;
constexpr bool IsDebug = true;
#endif
namespace version
{
constexpr const char *Raw = "@PROJECT_VERSION@";
extern const uint32_t Major;
extern const uint32_t Minor;
extern const uint32_t Patch;
extern const std::string TimeStamp;
extern const std::string Type;
} // namespace version
constexpr uint32_t MaxLights = 8;
namespace version
{
constexpr const char *Raw = "@PROJECT_VERSION@";
extern const uint32_t Major;
extern const uint32_t Minor;
extern const uint32_t Patch;
extern const std::string TimeStamp;
extern const std::string Type;
} // namespace version
} // namespace lib
\ No newline at end of file
......@@ -2,6 +2,7 @@
#include <string>
#include <vector>
#include <array>
#include "Core/Model/LightSource.hpp"
#include "Core/Camera.hpp"
......@@ -12,134 +13,134 @@
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.
*/
* @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
{
/**
* @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.
*/
* @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;
/**
* @brief Die X-Koordinate des Viewports.
*/
* @brief Die X-Koordinate des Viewports.
*/
int viewX = 0;
/**
* @brief Die X-Koordinate des Viewports.
*/
* @brief Die X-Koordinate des Viewports.
*/
int viewY = 0;
/**
* @brief Die Breite des Viewports.
*/
* @brief Die Breite des Viewports.
*/
int viewWidth = 0;
/**
* @brief Die H枚he des Viewports.
*/
* @brief Die H枚he des Viewports.
*/
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.
*/
* @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;
/**
* @brief Die X-Koordinate des Scissorings.
*/
* @brief Die X-Koordinate des Scissorings.
*/
int scissorX = 0;
/**
* @brief Die X-Koordinate des Scissorings.
*/
* @brief Die X-Koordinate des Scissorings.
*/
int scissorY = 0;
/**
* @brief Die Breite des Scissorings.
*/
* @brief Die Breite des Scissorings.
*/
int scissorWidth = 0;
/**
* @brief Die H枚he des Scissorings.
*/
* @brief Die H枚he des Scissorings.
*/
int scissorHeight = 0;
};
/**
* @brief Stellt die Informationen f眉r die Erstellung des Anwendungsfensters dar.
*/
* @brief Stellt die Informationen f眉r die Erstellung des Anwendungsfensters dar.
*/
struct WindowCreateInfo
{
/**
* @brief Die Breite des Fensters in Pixeln. Standardm盲脽ig 800.
*/
* @brief Die Breite des Fensters in Pixeln. Standardm盲脽ig 800.
*/
uint32_t width = 800;
/**
* @brief Die H枚he des Fensters in Pixeln. Standardm盲脽ig 600.
*/
* @brief Die H枚he des Fensters in Pixeln. Standardm盲脽ig 600.
*/
uint32_t height = 600;
/**
* @brief Der Titel des Fensters. Standardm盲脽ig "App".
*/
* @brief Der Titel des Fensters. Standardm盲脽ig "App".
*/
const char *title = "App";
};
/**
* @brief Stellt die Informationen zum Logging dar. Diese k枚nnen auch manuell
* 眉ber lib::log::SetLoggingStatus() gesetzt werden.
*/
* @brief Stellt die Informationen zum Logging dar. Diese k枚nnen auch manuell
* 眉ber lib::log::SetLoggingStatus() gesetzt werden.
*/
struct LoggingInfo
{
/**
* @brief Gibt an, ob Debugnachrichten ausgegeben werden oder nicht. Standardm盲脽ig false.
*/
* @brief Gibt an, ob Debugnachrichten ausgegeben werden oder nicht. Standardm盲脽ig false.
*/
bool debugEnabled = IsDebug;
/**
* @brief Gibt an, ob Informationen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
* @brief Gibt an, ob Informationen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool infosEnabled = IsDebug;
/**
* @brief Gibt an, ob Warnungen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
* @brief Gibt an, ob Warnungen ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool warningsEnabled = true;
/**
* @brief Gibt an, ob Fehler ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
* @brief Gibt an, ob Fehler ausgegeben werden oder nicht. Standardm盲脽ig true.
*/
bool errorsEnabled = true;
};
/**
* @brief Stellt die Informationen zur Validierung dar.
*/
* @brief Stellt die Informationen zur Validierung dar.
*/
struct ValidationInfo
{
/**
* @brief Gibt an, ob Validierungsschichten genutzt werden oder nicht. Standardm盲脽ig true.
*/
* @brief Gibt an, ob Validierungsschichten genutzt werden oder nicht. Standardm盲脽ig true.
*/
bool useValidationLayers = IsDebug;
/**
* @brief Gibt an, ob Validierungsschichten ben枚tigt werden oder nur optional sind. Standardm盲脽ig false.
*/
* @brief Gibt an, ob Validierungsschichten ben枚tigt werden oder nur optional sind. Standardm盲脽ig false.
*/
bool requireValidationLayers = IsDebug;
};
/**
* @brief Stellt die Informationen f眉r das Laden von Shadern dar.
*/
* @brief Stellt die Informationen f眉r das Laden von Shadern dar.
*/
struct ShaderTable
{
ShaderInfo raygenShader;
......@@ -150,106 +151,108 @@ namespace lib
};
/**
* @brief Stellt die Informationen f眉r den dargestellten Titel dar.
*/
* @brief Stellt die Informationen f眉r den dargestellten Titel dar.
*/
struct TitleInfo
{
/**
* @brief Gibt an, ob die Versionsnummer angezeigt wird oder nicht.
*/
* @brief Gibt an, ob die Versionsnummer angezeigt wird oder nicht.
*/
bool showVersion = true;
/**
* @brief Gibt an, ob die Buildtyp angezeigt wird oder nicht.
*/
* @brief Gibt an, ob die Buildtyp angezeigt wird oder nicht.
*/
bool showBuildType = IsDebug;
/**
* @brief Gibt an, ob der Zeitpunkt des aktuellen Builds angezeigt wird oder nicht.
*/
* @brief Gibt an, ob der Zeitpunkt des aktuellen Builds angezeigt wird oder nicht.
*/
bool showTimeStamp = false;
/**
* @brief Gibt an, ob die FPS (Bilder pro Sekunde) im Titel angezeigt werden sollen oder nicht.
*/
* @brief Gibt an, ob die FPS (Bilder pro Sekunde) im Titel angezeigt werden sollen oder nicht.
*/
bool showFPS = true;
};
/**
* @brief Enth盲lt Informationen 眉ber das zu ladenden Modell
*/
* @brief Enth盲lt Informationen 眉ber das zu ladenden Modell
*/
struct ModelInfo
{
/**
* @brief Der Pfad zum ladenden Modell.
*/
* @brief Der Pfad zum ladenden Modell.
*/
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)};
* @brief Die Standard-Lichtquelle.
*/
std::array<lib::LightSource, lib::MaxLights> lightSources{
LightSource{{0.f, 2.f, 0.f},
{1.f, 1.f, 1.f},
lib::SquareLightSourceAttributes{
0.4f,
lib::axis::y,
}},
};
/**
* @brief Die Hintergrundfarbe.
*/
* @brief Die Hintergrundfarbe.
*/
glm::vec3 clearColor = glm::vec3(0.f);
};
/**
* @brief Stellt die Informationen zum Initialisieren einer neuen App dar.
*/
* @brief Stellt die Informationen zum Initialisieren einer neuen App dar.
*/
struct AppCreateInfo
{
/**
* @brief Die Informationen zur Erstellung des Fensters.
*/
* @brief Die Informationen zur Erstellung des Fensters.
*/
WindowCreateInfo windowCreateInfo;
/**
* @brief Die Informationen 眉ber das Logging-Verhalten.
*/
* @brief Die Informationen 眉ber das Logging-Verhalten.
*/
LoggingInfo loggingInfo;
/**
* @brief Die Informationen zur Nutzung von Validierungsschichten.
*/
* @brief Die Informationen zur Nutzung von Validierungsschichten.
*/
ValidationInfo validationInfo;
/**
* @brief Die Informationen zum initialen Viewport und Scissoring.
*/
* @brief Die Informationen zum initialen Viewport und Scissoring.
*/
ViewPortInfo viewPortInfo;
/**
* @brief Die Informationen zu den initialen Shadern.
*/
* @brief Die Informationen zu den initialen Shadern.
*/
ShaderTable shaderTable;
/**
* @brief Die Informationen 眉ber das zu ladende Modell.
*/
* @brief Die Informationen 眉ber das zu ladende Modell.
*/
ModelInfo modelInfo;
/**
* @brief Die Informationen 眉ber den anzuzeigenden Titel.
*
*/
* @brief Die Informationen 眉ber den anzuzeigenden Titel.
*
*/
TitleInfo titleInfo;
/**
* @brief Der Name der App. Standardm盲脽ig "App".
*/
* @brief Der Name der App. Standardm盲脽ig "App".
*/
std::string appName = "App";
/**
* @brief Die maximale Anzahl an Bildern, die gleichzeitig in der Pipeline sein d眉rfen.
*/
* @brief Die maximale Anzahl an Bildern, die gleichzeitig in der Pipeline sein d眉rfen.
*/
uint32_t maxImagesInFlight = 5;
bool Validate(bool silent = false) const;
......
......@@ -6,6 +6,7 @@
#include <memory>
#include <tuple>
#include <random>
#include <array>
#include "Config.hpp"
#include "Core/AppCreateInfo.hpp"
......@@ -72,14 +73,14 @@ namespace lib
*
* @return std::vector<LightSource>& Die Lichtquellen
*/
virtual std::vector<LightSource> &GetLightSources() = 0;
virtual std::array<lib::LightSource, lib::MaxLights> &GetLightSources() = 0;
/**
* @brief Holt die Sammlung der Lichtquellen.
*
* @return std::vector<LightSource>& Die Lichtquellen
*/
virtual const std::vector<LightSource> &GetLightSources() const = 0;
virtual const std::array<lib::LightSource, lib::MaxLights> &GetLightSources() const = 0;
/**
* @brief Holt die Hintergrundfarbe als RGB-Vektor
......@@ -104,7 +105,7 @@ namespace lib
{
private:
Camera camera;
std::vector<LightSource> lightSources;
std::array<lib::LightSource, lib::MaxLights> lightSources;
glm::vec3 clearColor;
std::vector<vk::ExtensionProperties> availableExtensions;
......@@ -146,12 +147,11 @@ namespace lib
float, 4, vk::Format::eR32G32B32Sfloat,
float, 4, vk::Format::eR32G32B32Sfloat>;
using index_t = uint32_t;
std::vector<Buffer> uniformBuffers;
std::vector<StagedBuffer> uniformBuffers;
std::vector<Buffer> vertexBuffers;
std::vector<Buffer> indexBuffers;
std::unique_ptr<Buffer> materialsBuffer;
std::unique_ptr<Buffer> objectInstancesBuffer;
std::unique_ptr<StagedBuffer> lightSourcesBuffer;
std::unique_ptr<Texture> dummyTexture; // TODO: dummy
struct PushConstants
......@@ -296,8 +296,8 @@ namespace lib
void ReloadModel() override;
Camera &GetCameraModel() override;
const Camera &GetCameraModel() const override;
std::vector<LightSource> &GetLightSources() override;
const std::vector<LightSource> &GetLightSources() const override;
std::array<lib::LightSource, lib::MaxLights> &GetLightSources() override;
const std::array<lib::LightSource, lib::MaxLights> &GetLightSources() const override;
glm::vec3 &GetClearColor() override;
const glm::vec3 &GetClearColor() const override;
......
......@@ -12,34 +12,70 @@ namespace lib
{
Point = 0,
Directional = 1,
Square = 2,
};
struct PointLightSourceAttributes
{
};
struct DirectionalLightSourceAttributes
{
};
struct SquareLightSourceAttributes
{
inline SquareLightSourceAttributes(float size, glm::vec3 orientation)
: size(size),
orientation(orientation)
{
}
float size;
glm::vec3 orientation;
};
#pragma pack(push, 1)
class LightSource
{
private:
glm::vec4 position{};
glm::vec4 color{};
glm::vec4 ambientFactor_enabled_type_effectiveRange{0.f, 1.f, 0.f, 0.f};
glm::vec4 size{1, 1, 0, 0};
glm::vec4 positionXYZ_enabled;
glm::vec4 colorRGB_ambientFactor;
glm::vec4 type_customAttribsXYZ;
public:
LightSource() = default;
// TODO:? Lichtquelle ist nicht kompatibel zum Licht-format von assimp
// LightSource(const aiLight *light);