Add support for depth clamping
This commit is contained in:
@@ -53,6 +53,7 @@ namespace Nz
|
||||
|
||||
RenderDeviceFeatures enabledFeatures;
|
||||
enabledFeatures.anisotropicFiltering = renderDeviceInfo[bestRenderDeviceIndex].features.anisotropicFiltering;
|
||||
enabledFeatures.depthClamping = renderDeviceInfo[bestRenderDeviceIndex].features.depthClamping;
|
||||
enabledFeatures.nonSolidFaceFilling = renderDeviceInfo[bestRenderDeviceIndex].features.nonSolidFaceFilling;
|
||||
|
||||
m_renderDevice = renderer->InstanciateRenderDevice(bestRenderDeviceIndex, enabledFeatures);
|
||||
|
||||
@@ -281,6 +281,16 @@ namespace Nz::GL
|
||||
|
||||
m_extensionStatus.fill(ExtensionStatus::NotSupported);
|
||||
|
||||
// Depth clamp
|
||||
if (m_params.type == ContextType::OpenGL && m_params.glMajorVersion >= 3 && m_params.glMajorVersion >= 2)
|
||||
m_extensionStatus[UnderlyingCast(Extension::DepthClamp)] = ExtensionStatus::Core;
|
||||
else if (m_supportedExtensions.count("GL_ARB_depth_clamp"))
|
||||
m_extensionStatus[UnderlyingCast(Extension::DepthClamp)] = ExtensionStatus::ARB;
|
||||
else if (m_supportedExtensions.count("GL_EXT_depth_clamp"))
|
||||
m_extensionStatus[UnderlyingCast(Extension::DepthClamp)] = ExtensionStatus::EXT;
|
||||
else if (m_supportedExtensions.count("GL_NV_depth_clamp"))
|
||||
m_extensionStatus[UnderlyingCast(Extension::DepthClamp)] = ExtensionStatus::Vendor;
|
||||
|
||||
// SpirV
|
||||
if (m_params.type == ContextType::OpenGL && m_params.glMajorVersion >= 4 && m_params.glMajorVersion >= 6)
|
||||
m_extensionStatus[UnderlyingCast(Extension::SpirV)] = ExtensionStatus::Core;
|
||||
@@ -599,6 +609,17 @@ namespace Nz::GL
|
||||
m_state.renderStates.depthBuffer = renderStates.depthBuffer;
|
||||
}
|
||||
|
||||
// Depth clamp
|
||||
if (m_state.renderStates.depthClamp != renderStates.depthClamp)
|
||||
{
|
||||
if (renderStates.depthClamp)
|
||||
glEnable(GL_DEPTH_CLAMP_EXT);
|
||||
else
|
||||
glDisable(GL_DEPTH_CLAMP_EXT);
|
||||
|
||||
m_state.renderStates.depthClamp = renderStates.depthClamp;
|
||||
}
|
||||
|
||||
// Face culling
|
||||
if (m_state.renderStates.faceCulling != renderStates.faceCulling)
|
||||
{
|
||||
|
||||
@@ -54,6 +54,7 @@ namespace Nz
|
||||
deviceInfo.name = physDevice.properties.deviceName;
|
||||
|
||||
deviceInfo.features.anisotropicFiltering = physDevice.features.samplerAnisotropy;
|
||||
deviceInfo.features.depthClamping = physDevice.features.depthClamp;
|
||||
deviceInfo.features.nonSolidFaceFilling = physDevice.features.fillModeNonSolid;
|
||||
|
||||
deviceInfo.limits.minUniformBufferOffsetAlignment = physDevice.properties.limits.minUniformBufferOffsetAlignment;
|
||||
@@ -578,6 +579,9 @@ namespace Nz
|
||||
if (enabledFeatures.anisotropicFiltering)
|
||||
deviceFeatures.samplerAnisotropy = VK_TRUE;
|
||||
|
||||
if (enabledFeatures.depthClamping)
|
||||
deviceFeatures.depthClamp = VK_TRUE;
|
||||
|
||||
if (enabledFeatures.nonSolidFaceFilling)
|
||||
deviceFeatures.fillModeNonSolid = VK_TRUE;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipeline.hpp>
|
||||
#include <Nazara/Core/ErrorFlags.hpp>
|
||||
#include <Nazara/VulkanRenderer/Utils.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanDevice.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanRenderPipelineLayout.hpp>
|
||||
#include <Nazara/VulkanRenderer/VulkanShaderModule.hpp>
|
||||
#include <cassert>
|
||||
@@ -142,10 +143,11 @@ namespace Nz
|
||||
{
|
||||
VkPipelineRasterizationStateCreateInfo createInfo = {};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||
createInfo.polygonMode = ToVulkan(pipelineInfo.faceFilling);
|
||||
createInfo.cullMode = (pipelineInfo.faceCulling) ? ToVulkan(pipelineInfo.cullingSide) : VK_CULL_MODE_NONE;
|
||||
createInfo.depthClampEnable = pipelineInfo.depthClamp;
|
||||
createInfo.frontFace = ToVulkan(pipelineInfo.frontFace);
|
||||
createInfo.lineWidth = pipelineInfo.lineWidth;
|
||||
createInfo.polygonMode = ToVulkan(pipelineInfo.faceFilling);
|
||||
|
||||
return createInfo;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user