Implementing switch for image based lighting
This commit is contained in:
@@ -345,9 +345,11 @@ struct CookTorrance : IBRDF
|
|||||||
float3 k_s = F;
|
float3 k_s = F;
|
||||||
float3 k_d = 1 - k_s;
|
float3 k_d = 1 - k_s;
|
||||||
k_d *= 1 - metallic;
|
k_d *= 1 - metallic;
|
||||||
|
float3 diffuse = baseColor;
|
||||||
|
float3 specular = 0;
|
||||||
|
#ifdef IMAGE_BASED_LIGHTING
|
||||||
float3 irradiance = pLightEnv.irradianceMap.SampleLevel(pLightEnv.irradianceSampler, normal, 4).rgb;
|
float3 irradiance = pLightEnv.irradianceMap.SampleLevel(pLightEnv.irradianceSampler, normal, 4).rgb;
|
||||||
float3 diffuse = irradiance * baseColor;
|
diffuse *= irradiance;
|
||||||
|
|
||||||
float3 r = reflect(-viewDir_WS, normal);
|
float3 r = reflect(-viewDir_WS, normal);
|
||||||
|
|
||||||
@@ -355,8 +357,8 @@ struct CookTorrance : IBRDF
|
|||||||
float3 prefilteredColor = pLightEnv.prefilteredMap.SampleLevel(pLightEnv.irradianceSampler, r, roughness * MAX_REFLECTION_LOD).xyz;
|
float3 prefilteredColor = pLightEnv.prefilteredMap.SampleLevel(pLightEnv.irradianceSampler, r, roughness * MAX_REFLECTION_LOD).xyz;
|
||||||
|
|
||||||
float2 envBRDF = pLightEnv.brdfLUT.Sample(pLightEnv.lutSampler, float2(max(dot(normal, viewDir_WS), 0), roughness)).rg;
|
float2 envBRDF = pLightEnv.brdfLUT.Sample(pLightEnv.lutSampler, float2(max(dot(normal, viewDir_WS), 0), roughness)).rg;
|
||||||
float3 specular = prefilteredColor * (F * envBRDF.x + envBRDF.y);
|
specular = prefilteredColor * (F * envBRDF.x + envBRDF.y);
|
||||||
|
#endif
|
||||||
return (k_d * diffuse + specular) * ambientOcclusion;
|
return (k_d * diffuse + specular) * ambientOcclusion;
|
||||||
}
|
}
|
||||||
float getAlpha()
|
float getAlpha()
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#include "PlayView.h"
|
#include "PlayView.h"
|
||||||
#include "Component/Mesh.h"
|
|
||||||
#include "Graphics/Enums.h"
|
#include "Graphics/Enums.h"
|
||||||
#include "MinimalEngine.h"
|
#include "MinimalEngine.h"
|
||||||
#include "Window/Window.h"
|
#include "Window/Window.h"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "Material/MaterialInstance.h"
|
#include "Material/MaterialInstance.h"
|
||||||
#include "Math/Matrix.h"
|
#include "Math/Matrix.h"
|
||||||
#include "Math/Vector.h"
|
#include "Math/Vector.h"
|
||||||
|
#include "MinimalEngine.h"
|
||||||
|
|
||||||
using namespace Seele;
|
using namespace Seele;
|
||||||
|
|
||||||
@@ -148,6 +149,7 @@ void BasePass::render() {
|
|||||||
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("BasePass");
|
Gfx::ShaderPermutation permutation = graphics->getShaderCompiler()->getTemplate("BasePass");
|
||||||
permutation.setDepthCulling(true); // always use the culling info
|
permutation.setDepthCulling(true); // always use the culling info
|
||||||
permutation.setPositionOnly(false);
|
permutation.setPositionOnly(false);
|
||||||
|
permutation.setImageBasedLighting(getGlobals().useImagebasedLighting);
|
||||||
// Base Rendering
|
// Base Rendering
|
||||||
for (VertexData* vertexData : VertexData::getList()) {
|
for (VertexData* vertexData : VertexData::getList()) {
|
||||||
transparentData.addAll(vertexData->getTransparentData());
|
transparentData.addAll(vertexData->getTransparentData());
|
||||||
|
|||||||
@@ -59,10 +59,12 @@ void ShaderCompiler::compile() {
|
|||||||
if (pass.useMaterial) {
|
if (pass.useMaterial) {
|
||||||
for (const auto& [matName, mat] : materials) {
|
for (const auto& [matName, mat] : materials) {
|
||||||
for (int y = 0; y < 2; y++) {
|
for (int y = 0; y < 2; y++) {
|
||||||
|
for (int z = 0; z < 2; ++z) {
|
||||||
work.add([=, this]() {
|
work.add([=, this]() {
|
||||||
ShaderPermutation permutation = getTemplate(name);
|
ShaderPermutation permutation = getTemplate(name);
|
||||||
permutation.setPositionOnly(false);
|
permutation.setPositionOnly(false);
|
||||||
permutation.setDepthCulling(y);
|
permutation.setDepthCulling(y);
|
||||||
|
permutation.setImageBasedLighting(z);
|
||||||
permutation.setVertexData(vd->getTypeName());
|
permutation.setVertexData(vd->getTypeName());
|
||||||
OPipelineLayout layout = graphics->createPipelineLayout(pass.baseLayout->getName(), pass.baseLayout);
|
OPipelineLayout layout = graphics->createPipelineLayout(pass.baseLayout->getName(), pass.baseLayout);
|
||||||
layout->addDescriptorLayout(vd->getVertexDataLayout());
|
layout->addDescriptorLayout(vd->getVertexDataLayout());
|
||||||
@@ -72,13 +74,16 @@ void ShaderCompiler::compile() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (int x = 0; x < 2; x++) {
|
for (int x = 0; x < 2; x++) {
|
||||||
for (int y = 0; y < 2; y++) {
|
for (int y = 0; y < 2; y++) {
|
||||||
|
for (int z = 0; z < 2; z++) {
|
||||||
work.add([=, this]() {
|
work.add([=, this]() {
|
||||||
ShaderPermutation permutation = getTemplate(name);
|
ShaderPermutation permutation = getTemplate(name);
|
||||||
permutation.setPositionOnly(x);
|
permutation.setPositionOnly(x);
|
||||||
permutation.setDepthCulling(y);
|
permutation.setDepthCulling(y);
|
||||||
|
permutation.setImageBasedLighting(z);
|
||||||
permutation.setVertexData(vd->getTypeName());
|
permutation.setVertexData(vd->getTypeName());
|
||||||
OPipelineLayout layout = graphics->createPipelineLayout(pass.baseLayout->getName(), pass.baseLayout);
|
OPipelineLayout layout = graphics->createPipelineLayout(pass.baseLayout->getName(), pass.baseLayout);
|
||||||
layout->addDescriptorLayout(vd->getVertexDataLayout());
|
layout->addDescriptorLayout(vd->getVertexDataLayout());
|
||||||
@@ -90,6 +95,7 @@ void ShaderCompiler::compile() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
getThreadPool().runAndWait(std::move(work));
|
getThreadPool().runAndWait(std::move(work));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,7 +115,7 @@ void ShaderCompiler::createShaders(ShaderPermutation permutation, Gfx::OPipeline
|
|||||||
if (std::strlen(permutation.materialName) > 0) {
|
if (std::strlen(permutation.materialName) > 0) {
|
||||||
createInfo.modules.add(permutation.materialName);
|
createInfo.modules.add(permutation.materialName);
|
||||||
createInfo.defines["MATERIAL_FILE_NAME"] = permutation.materialName;
|
createInfo.defines["MATERIAL_FILE_NAME"] = permutation.materialName;
|
||||||
//createInfo.typeParameter.add({"IBRDF", "Phong"});
|
// createInfo.typeParameter.add({"IBRDF", "Phong"});
|
||||||
}
|
}
|
||||||
if (permutation.positionOnly) {
|
if (permutation.positionOnly) {
|
||||||
createInfo.defines["POS_ONLY"] = "1";
|
createInfo.defines["POS_ONLY"] = "1";
|
||||||
@@ -120,13 +126,15 @@ void ShaderCompiler::createShaders(ShaderPermutation permutation, Gfx::OPipeline
|
|||||||
if (permutation.visibilityPass) {
|
if (permutation.visibilityPass) {
|
||||||
createInfo.defines["VISIBILITY"] = "1";
|
createInfo.defines["VISIBILITY"] = "1";
|
||||||
}
|
}
|
||||||
if (permutation.dumpIntermediates)
|
if (permutation.imageBasedLighting) {
|
||||||
{
|
createInfo.defines["IMAGE_BASE_LIGHTING"] = "1";
|
||||||
|
}
|
||||||
|
if (permutation.dumpIntermediates) {
|
||||||
createInfo.dumpIntermediate = true;
|
createInfo.dumpIntermediate = true;
|
||||||
}
|
}
|
||||||
//createInfo.typeParameter.add({Pair<const char*, const char*>("IVertexData", permutation.vertexDataName)});
|
// createInfo.typeParameter.add({Pair<const char*, const char*>("IVertexData", permutation.vertexDataName)});
|
||||||
createInfo.modules.add(permutation.vertexDataName);
|
createInfo.modules.add(permutation.vertexDataName);
|
||||||
//createInfo.dumpIntermediate = true;
|
// createInfo.dumpIntermediate = true;
|
||||||
|
|
||||||
if (permutation.useMeshShading) {
|
if (permutation.useMeshShading) {
|
||||||
if (permutation.hasTaskShader) {
|
if (permutation.hasTaskShader) {
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ struct ShaderPermutation {
|
|||||||
uint8 visibilityPass;
|
uint8 visibilityPass;
|
||||||
uint8 rayTracing;
|
uint8 rayTracing;
|
||||||
uint8 dumpIntermediates;
|
uint8 dumpIntermediates;
|
||||||
// TODO: lightmapping etc
|
uint8 imageBasedLighting;
|
||||||
ShaderPermutation() { std::memset(this, 0, sizeof(ShaderPermutation)); }
|
ShaderPermutation() { std::memset(this, 0, sizeof(ShaderPermutation)); }
|
||||||
void setTaskFile(std::string_view name) {
|
void setTaskFile(std::string_view name) {
|
||||||
std::memset(taskFile, 0, sizeof(taskFile));
|
std::memset(taskFile, 0, sizeof(taskFile));
|
||||||
@@ -144,6 +144,7 @@ struct ShaderPermutation {
|
|||||||
void setDepthCulling(bool enable) { depthCulling = enable; }
|
void setDepthCulling(bool enable) { depthCulling = enable; }
|
||||||
void setVisibilityPass(bool enable) { visibilityPass = enable; }
|
void setVisibilityPass(bool enable) { visibilityPass = enable; }
|
||||||
void setDumpIntermediates(bool enable) { dumpIntermediates = enable; }
|
void setDumpIntermediates(bool enable) { dumpIntermediates = enable; }
|
||||||
|
void setImageBasedLighting(bool enable) { imageBasedLighting = enable; }
|
||||||
};
|
};
|
||||||
// Hashed ShaderPermutation for fast lookup
|
// Hashed ShaderPermutation for fast lookup
|
||||||
struct PermutationId {
|
struct PermutationId {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <numeric>
|
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
#define VMA_IMPLEMENTATION
|
#define VMA_IMPLEMENTATION
|
||||||
|
|||||||
Reference in New Issue
Block a user