Small fixes, optimizations and different default scene
This commit is contained in:
parent
3c150e18f3
commit
da17b70fda
3 changed files with 30 additions and 30 deletions
|
|
@ -50,7 +50,7 @@ float textureProj(vec4 P, vec2 offset, uint cascadeIndex)
|
||||||
float filterPCF(vec4 sc, uint cascadeIndex)
|
float filterPCF(vec4 sc, uint cascadeIndex)
|
||||||
{
|
{
|
||||||
ivec2 texDim = textureSize(shadowMap, 0).xy;
|
ivec2 texDim = textureSize(shadowMap, 0).xy;
|
||||||
float scale = 1.5;
|
float scale = 0.75;
|
||||||
float dx = scale * 1.0 / float(texDim.x);
|
float dx = scale * 1.0 / float(texDim.x);
|
||||||
float dy = scale * 1.0 / float(texDim.y);
|
float dy = scale * 1.0 / float(texDim.y);
|
||||||
|
|
||||||
|
|
@ -93,23 +93,23 @@ void main()
|
||||||
vec3 H = normalize(L + inViewPos);
|
vec3 H = normalize(L + inViewPos);
|
||||||
float diffuse = max(dot(N, L), 0.0);
|
float diffuse = max(dot(N, L), 0.0);
|
||||||
vec3 lightColor = vec3(1.0);
|
vec3 lightColor = vec3(1.0);
|
||||||
outFragColor.rgb = max(lightColor * (diffuse ), vec3(0.0));
|
outFragColor.rgb = max(lightColor * (diffuse * inColor), vec3(0.0));
|
||||||
outFragColor.rgb *= shadow;
|
outFragColor.rgb *= shadow;
|
||||||
|
|
||||||
// Color cascades (if enabled)
|
// Color cascades (if enabled)
|
||||||
if (ubo.colorCascades == 1) {
|
if (ubo.colorCascades == 1) {
|
||||||
switch(cascadeIndex) {
|
switch(cascadeIndex) {
|
||||||
case 0 :
|
case 0 :
|
||||||
outFragColor.rgb *= vec3(1.0f, 0.0f, 0.0f);
|
outFragColor.rgb *= vec3(1.0f, 0.25f, 0.25f);
|
||||||
break;
|
break;
|
||||||
case 1 :
|
case 1 :
|
||||||
outFragColor.rgb *= vec3(0.0f, 1.0f, 0.0f);
|
outFragColor.rgb *= vec3(0.25f, 1.0f, 0.25f);
|
||||||
break;
|
break;
|
||||||
case 2 :
|
case 2 :
|
||||||
outFragColor.rgb *= vec3(0.0f, 0.0f, 1.0f);
|
outFragColor.rgb *= vec3(0.25f, 0.25f, 1.0f);
|
||||||
break;
|
break;
|
||||||
case 3 :
|
case 3 :
|
||||||
outFragColor.rgb *= vec3(1.0f, 1.0f, 0.0f);
|
outFragColor.rgb *= vec3(1.0f, 1.0f, 0.25f);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -30,7 +30,6 @@
|
||||||
#else
|
#else
|
||||||
#define SHADOWMAP_DIM 2048
|
#define SHADOWMAP_DIM 2048
|
||||||
#endif
|
#endif
|
||||||
#define SHADOWMAP_FILTER VK_FILTER_LINEAR
|
|
||||||
|
|
||||||
#define SHADOW_MAP_CASCADE_COUNT 4
|
#define SHADOW_MAP_CASCADE_COUNT 4
|
||||||
|
|
||||||
|
|
@ -144,9 +143,11 @@ public:
|
||||||
camera.type = Camera::CameraType::firstperson;
|
camera.type = Camera::CameraType::firstperson;
|
||||||
camera.movementSpeed = 2.5f;
|
camera.movementSpeed = 2.5f;
|
||||||
camera.setPerspective(45.0f, (float)width / (float)height, zNear, zFar);
|
camera.setPerspective(45.0f, (float)width / (float)height, zNear, zFar);
|
||||||
camera.setPosition(glm::vec3(8.75f, 0.5f, -8.3f));
|
camera.setPosition(glm::vec3(2.0f, 0.375f, -1.25f));
|
||||||
camera.setRotation(glm::vec3(-1.0f, 50.0f, 0.0f));
|
camera.setRotation(glm::vec3(-19.0f, 42.0f, 0.0f));
|
||||||
settings.overlay = true;
|
settings.overlay = true;
|
||||||
|
timer = 0.317028880f;
|
||||||
|
paused = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
~VulkanExample()
|
~VulkanExample()
|
||||||
|
|
@ -313,8 +314,8 @@ public:
|
||||||
|
|
||||||
// Shared sampler for cascade deoth reads
|
// Shared sampler for cascade deoth reads
|
||||||
VkSamplerCreateInfo sampler = vks::initializers::samplerCreateInfo();
|
VkSamplerCreateInfo sampler = vks::initializers::samplerCreateInfo();
|
||||||
sampler.magFilter = SHADOWMAP_FILTER;
|
sampler.magFilter = VK_FILTER_LINEAR;
|
||||||
sampler.minFilter = SHADOWMAP_FILTER;
|
sampler.minFilter = VK_FILTER_LINEAR;
|
||||||
sampler.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
sampler.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
|
||||||
sampler.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
sampler.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||||
sampler.addressModeV = sampler.addressModeU;
|
sampler.addressModeV = sampler.addressModeU;
|
||||||
|
|
@ -387,7 +388,7 @@ public:
|
||||||
renderPassBeginInfo.clearValueCount = 2;
|
renderPassBeginInfo.clearValueCount = 2;
|
||||||
renderPassBeginInfo.pClearValues = clearValues;
|
renderPassBeginInfo.pClearValues = clearValues;
|
||||||
|
|
||||||
for (int32_t i = 0; i < drawCmdBuffers.size(); ++i) {
|
for (int32_t i = 0; i < drawCmdBuffers.size(); i++) {
|
||||||
renderPassBeginInfo.framebuffer = frameBuffers[i];
|
renderPassBeginInfo.framebuffer = frameBuffers[i];
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
|
VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
|
||||||
|
|
@ -426,9 +427,10 @@ public:
|
||||||
void loadAssets()
|
void loadAssets()
|
||||||
{
|
{
|
||||||
scenes.resize(2);
|
scenes.resize(2);
|
||||||
scenes[0].loadFromFile(getAssetPath() + "models/terrain.obj", vertexLayout, 2.0f, vulkanDevice, queue);
|
scenes[0].loadFromFile(getAssetPath() + "models/trees.dae", vertexLayout, 1.0f, vulkanDevice, queue);
|
||||||
scenes[1].loadFromFile(getAssetPath() + "models/shadowtest.obj", vertexLayout, 0.25f, vulkanDevice, queue);
|
scenes[1].loadFromFile(getAssetPath() + "models/samplescene.dae", vertexLayout, 0.25f, vulkanDevice, queue);
|
||||||
sceneNames = {"Terrain test", "Object test" };
|
sceneNames = { "Trees", "Teapots and pillars" };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupDescriptorPool()
|
void setupDescriptorPool()
|
||||||
|
|
@ -655,6 +657,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate frustum split depths and matrices for the shadow map cascades
|
// Calculate frustum split depths and matrices for the shadow map cascades
|
||||||
|
// Based on https://johanmedestrom.wordpress.com/2016/03/18/opengl-cascaded-shadow-maps/
|
||||||
void updateCascades()
|
void updateCascades()
|
||||||
{
|
{
|
||||||
float cascadeSplits[SHADOW_MAP_CASCADE_COUNT];
|
float cascadeSplits[SHADOW_MAP_CASCADE_COUNT];
|
||||||
|
|
@ -681,7 +684,7 @@ public:
|
||||||
|
|
||||||
// Calculate orthographic projection matrix for each cascade
|
// Calculate orthographic projection matrix for each cascade
|
||||||
float lastSplitDist = 0.0;
|
float lastSplitDist = 0.0;
|
||||||
for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; ++i) {
|
for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; i++) {
|
||||||
float splitDist = cascadeSplits[i];
|
float splitDist = cascadeSplits[i];
|
||||||
|
|
||||||
glm::vec3 frustumCorners[8] = {
|
glm::vec3 frustumCorners[8] = {
|
||||||
|
|
@ -697,12 +700,12 @@ public:
|
||||||
|
|
||||||
// Project frustum corners into world space
|
// Project frustum corners into world space
|
||||||
glm::mat4 invCam = glm::inverse(camera.matrices.perspective * camera.matrices.view);
|
glm::mat4 invCam = glm::inverse(camera.matrices.perspective * camera.matrices.view);
|
||||||
for (uint32_t i = 0; i < 8; ++i) {
|
for (uint32_t i = 0; i < 8; i++) {
|
||||||
glm::vec4 invCorner = invCam * glm::vec4(frustumCorners[i], 1.0f);
|
glm::vec4 invCorner = invCam * glm::vec4(frustumCorners[i], 1.0f);
|
||||||
frustumCorners[i] = invCorner / invCorner.w;
|
frustumCorners[i] = invCorner / invCorner.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < 4; ++i) {
|
for (uint32_t i = 0; i < 4; i++) {
|
||||||
glm::vec3 dist = frustumCorners[i + 4] - frustumCorners[i];
|
glm::vec3 dist = frustumCorners[i + 4] - frustumCorners[i];
|
||||||
frustumCorners[i + 4] = frustumCorners[i] + (dist * splitDist);
|
frustumCorners[i + 4] = frustumCorners[i] + (dist * splitDist);
|
||||||
frustumCorners[i] = frustumCorners[i] + (dist * lastSplitDist);
|
frustumCorners[i] = frustumCorners[i] + (dist * lastSplitDist);
|
||||||
|
|
@ -716,25 +719,21 @@ public:
|
||||||
frustumCenter /= 8.0f;
|
frustumCenter /= 8.0f;
|
||||||
|
|
||||||
float radius = 0.0f;
|
float radius = 0.0f;
|
||||||
for (uint32_t i = 0; i < 8; ++i) {
|
for (uint32_t i = 0; i < 8; i++) {
|
||||||
float distance = glm::length(frustumCorners[i] - frustumCenter);
|
float distance = glm::length(frustumCorners[i] - frustumCenter);
|
||||||
radius = glm::max(radius, distance);
|
radius = glm::max(radius, distance);
|
||||||
}
|
}
|
||||||
radius = std::ceil(radius * 16.0f) / 16.0f;
|
radius = std::ceil(radius * 16.0f) / 16.0f;
|
||||||
|
|
||||||
glm::vec3 maxExtents = glm::vec3(radius, radius, radius);
|
glm::vec3 maxExtents = glm::vec3(radius);
|
||||||
glm::vec3 minExtents = -maxExtents;
|
glm::vec3 minExtents = -maxExtents;
|
||||||
|
|
||||||
glm::vec3 lightDir = normalize(-lightPos);
|
glm::vec3 lightDir = normalize(-lightPos);
|
||||||
glm::mat4 lightViewMatrix = glm::lookAt(frustumCenter - lightDir * -minExtents.z, frustumCenter, glm::vec3(0.0f, 1.0f, 0.0f));
|
glm::mat4 lightViewMatrix = glm::lookAt(frustumCenter - lightDir * -minExtents.z, frustumCenter, glm::vec3(0.0f, 1.0f, 0.0f));
|
||||||
|
glm::mat4 lightOrthoMatrix = glm::ortho(minExtents.x, maxExtents.x, minExtents.y, maxExtents.y, 0.0f, maxExtents.z - minExtents.z);
|
||||||
glm::vec3 cascadeExtents = maxExtents - minExtents;
|
|
||||||
|
|
||||||
glm::mat4 lightOrthoMatrix = glm::ortho(minExtents.x, maxExtents.x, minExtents.y, maxExtents.y, 0.0f, cascadeExtents.z);
|
|
||||||
|
|
||||||
// Store split distance and matrix in cascade
|
// Store split distance and matrix in cascade
|
||||||
const float clipDist = camera.getFarClip() - camera.getNearClip();
|
cascades[i].splitDepth = (camera.getNearClip() + splitDist * clipRange) * -1.0f;
|
||||||
cascades[i].splitDepth = (camera.getNearClip() + splitDist * clipDist) * -1.0f;
|
|
||||||
cascades[i].viewProjMatrix = lightOrthoMatrix * lightViewMatrix;
|
cascades[i].viewProjMatrix = lightOrthoMatrix * lightViewMatrix;
|
||||||
|
|
||||||
lastSplitDist = cascadeSplits[i];
|
lastSplitDist = cascadeSplits[i];
|
||||||
|
|
@ -743,9 +742,9 @@ public:
|
||||||
|
|
||||||
void updateLight()
|
void updateLight()
|
||||||
{
|
{
|
||||||
lightPos.x = cos(glm::radians(timer * 360.0f)) * 50.0f;
|
float angle = glm::radians(timer * 360.0f);
|
||||||
lightPos.y = -20.0f;
|
float radius = 20.0f;
|
||||||
lightPos.z = sin(glm::radians(timer * 360.0f)) * 50.0f;
|
lightPos = glm::vec3(cos(angle) * radius, -radius, sin(angle) * radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateUniformBuffers()
|
void updateUniformBuffers()
|
||||||
|
|
@ -813,6 +812,8 @@ public:
|
||||||
{
|
{
|
||||||
VulkanExampleBase::prepare();
|
VulkanExampleBase::prepare();
|
||||||
loadAssets();
|
loadAssets();
|
||||||
|
updateLight();
|
||||||
|
updateCascades();
|
||||||
prepareShadowMaps();
|
prepareShadowMaps();
|
||||||
prepareUniformBuffers();
|
prepareUniformBuffers();
|
||||||
setupDescriptorPool();
|
setupDescriptorPool();
|
||||||
|
|
@ -820,7 +821,6 @@ public:
|
||||||
preparePipelines();
|
preparePipelines();
|
||||||
buildCommandBuffers();
|
buildCommandBuffers();
|
||||||
buildOffscreenCommandBuffer();
|
buildOffscreenCommandBuffer();
|
||||||
updateCascades();
|
|
||||||
prepared = true;
|
prepared = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue