@@ -85,13 +85,10 @@ void DeferredMaterialShader::Bind(BindParameters& params)
|
||||
if (IsRunningRadiancePass)
|
||||
cullMode = CullMode::TwoSided;
|
||||
#endif
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminantSign < 0)
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminant)
|
||||
{
|
||||
// Invert culling when scale is negative
|
||||
if (cullMode == CullMode::Normal)
|
||||
cullMode = CullMode::Inverted;
|
||||
else
|
||||
cullMode = CullMode::Normal;
|
||||
cullMode = cullMode == CullMode::Normal ? CullMode::Inverted : CullMode::Normal;
|
||||
}
|
||||
ASSERT_LOW_LAYER(!(useSkinning && params.Instanced)); // No support for instancing skinned meshes
|
||||
const auto cache = params.Instanced ? &_cacheInstanced : &_cache;
|
||||
@@ -101,6 +98,7 @@ void DeferredMaterialShader::Bind(BindParameters& params)
|
||||
|
||||
// Bind pipeline
|
||||
context->SetState(state);
|
||||
context->SetStencilRef(drawCall.StencilValue);
|
||||
}
|
||||
|
||||
void DeferredMaterialShader::Unload()
|
||||
@@ -137,6 +135,10 @@ bool DeferredMaterialShader::Load()
|
||||
}
|
||||
#endif
|
||||
|
||||
psDesc.StencilEnable = true;
|
||||
psDesc.StencilReadMask = 0;
|
||||
psDesc.StencilPassOp = StencilOperation::Replace;
|
||||
|
||||
// GBuffer Pass
|
||||
psDesc.VS = _shader->GetVS("VS");
|
||||
failed |= psDesc.VS == nullptr;
|
||||
@@ -160,6 +162,9 @@ bool DeferredMaterialShader::Load()
|
||||
psDesc.PS = _shader->GetPS("PS_GBuffer");
|
||||
_cache.DefaultSkinned.Init(psDesc);
|
||||
|
||||
psDesc.StencilEnable = false;
|
||||
psDesc.StencilPassOp = StencilOperation::Keep;
|
||||
|
||||
#if USE_EDITOR
|
||||
if (_shader->HasShader("PS_QuadOverdraw"))
|
||||
{
|
||||
|
||||
@@ -62,7 +62,7 @@ void DeformableMaterialShader::Bind(BindParameters& params)
|
||||
{
|
||||
Matrix::Transpose(drawCall.World, materialData->WorldMatrix);
|
||||
Matrix::Transpose(drawCall.Deformable.LocalMatrix, materialData->LocalMatrix);
|
||||
materialData->WorldDeterminantSign = drawCall.WorldDeterminantSign;
|
||||
materialData->WorldDeterminantSign = drawCall.WorldDeterminant ? -1.0f : 1.0f;
|
||||
materialData->Segment = drawCall.Deformable.Segment;
|
||||
materialData->ChunksPerSegment = drawCall.Deformable.ChunksPerSegment;
|
||||
materialData->MeshMinZ = drawCall.Deformable.MeshMinZ;
|
||||
@@ -84,13 +84,10 @@ void DeformableMaterialShader::Bind(BindParameters& params)
|
||||
// Select pipeline state based on current pass and render mode
|
||||
const bool wireframe = (_info.FeaturesFlags & MaterialFeaturesFlags::Wireframe) != MaterialFeaturesFlags::None || view.Mode == ViewMode::Wireframe;
|
||||
CullMode cullMode = view.Pass == DrawPass::Depth ? CullMode::TwoSided : _info.CullMode;
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminantSign < 0)
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminant)
|
||||
{
|
||||
// Invert culling when scale is negative
|
||||
if (cullMode == CullMode::Normal)
|
||||
cullMode = CullMode::Inverted;
|
||||
else
|
||||
cullMode = CullMode::Normal;
|
||||
cullMode = cullMode == CullMode::Normal ? CullMode::Inverted : CullMode::Normal;
|
||||
}
|
||||
PipelineStateCache* psCache = _cache.GetPS(view.Pass);
|
||||
ASSERT(psCache);
|
||||
@@ -98,6 +95,7 @@ void DeformableMaterialShader::Bind(BindParameters& params)
|
||||
|
||||
// Bind pipeline
|
||||
context->SetState(state);
|
||||
context->SetStencilRef(drawCall.StencilValue);
|
||||
}
|
||||
|
||||
void DeformableMaterialShader::Unload()
|
||||
@@ -139,10 +137,17 @@ bool DeformableMaterialShader::Load()
|
||||
{
|
||||
_drawModes |= DrawPass::GBuffer | DrawPass::GlobalSurfaceAtlas;
|
||||
|
||||
psDesc.StencilEnable = true;
|
||||
psDesc.StencilReadMask = 0;
|
||||
psDesc.StencilPassOp = StencilOperation::Replace;
|
||||
|
||||
// GBuffer Pass
|
||||
psDesc.VS = _shader->GetVS("VS_SplineModel");
|
||||
psDesc.PS = _shader->GetPS("PS_GBuffer");
|
||||
_cache.Default.Init(psDesc);
|
||||
|
||||
psDesc.StencilEnable = false;
|
||||
psDesc.StencilPassOp = StencilOperation::Keep;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -80,13 +80,10 @@ void ForwardMaterialShader::Bind(BindParameters& params)
|
||||
if (IsRunningRadiancePass)
|
||||
cullMode = CullMode::TwoSided;
|
||||
#endif
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminantSign < 0)
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminant)
|
||||
{
|
||||
// Invert culling when scale is negative
|
||||
if (cullMode == CullMode::Normal)
|
||||
cullMode = CullMode::Inverted;
|
||||
else
|
||||
cullMode = CullMode::Normal;
|
||||
cullMode = cullMode == CullMode::Normal ? CullMode::Inverted : CullMode::Normal;
|
||||
}
|
||||
ASSERT_LOW_LAYER(!(useSkinning && params.Instanced)); // No support for instancing skinned meshes
|
||||
const auto cacheObj = params.Instanced ? &_cacheInstanced : &_cache;
|
||||
|
||||
@@ -76,7 +76,7 @@ void TerrainMaterialShader::Bind(BindParameters& params)
|
||||
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
|
||||
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
|
||||
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);
|
||||
materialData->WorldDeterminantSign = drawCall.WorldDeterminantSign;
|
||||
materialData->WorldDeterminantSign = drawCall.WorldDeterminant ? -1.0f : 1.0f;
|
||||
materialData->PerInstanceRandom = drawCall.PerInstanceRandom;
|
||||
materialData->CurrentLOD = drawCall.Terrain.CurrentLOD;
|
||||
materialData->ChunkSizeNextLOD = drawCall.Terrain.ChunkSizeNextLOD;
|
||||
@@ -109,13 +109,10 @@ void TerrainMaterialShader::Bind(BindParameters& params)
|
||||
if (IsRunningRadiancePass)
|
||||
cullMode = CullMode::TwoSided;
|
||||
#endif
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminantSign < 0)
|
||||
if (cullMode != CullMode::TwoSided && drawCall.WorldDeterminant)
|
||||
{
|
||||
// Invert culling when scale is negative
|
||||
if (cullMode == CullMode::Normal)
|
||||
cullMode = CullMode::Inverted;
|
||||
else
|
||||
cullMode = CullMode::Normal;
|
||||
cullMode = cullMode == CullMode::Normal ? CullMode::Inverted : CullMode::Normal;
|
||||
}
|
||||
const PipelineStateCache* psCache = _cache.GetPS(view.Pass, useLightmap);
|
||||
ASSERT(psCache);
|
||||
@@ -123,6 +120,7 @@ void TerrainMaterialShader::Bind(BindParameters& params)
|
||||
|
||||
// Bind pipeline
|
||||
context->SetState(state);
|
||||
context->SetStencilRef(drawCall.StencilValue);
|
||||
}
|
||||
|
||||
void TerrainMaterialShader::Unload()
|
||||
@@ -139,6 +137,10 @@ bool TerrainMaterialShader::Load()
|
||||
psDesc.DepthEnable = (_info.FeaturesFlags & MaterialFeaturesFlags::DisableDepthTest) == MaterialFeaturesFlags::None;
|
||||
psDesc.DepthWriteEnable = (_info.FeaturesFlags & MaterialFeaturesFlags::DisableDepthWrite) == MaterialFeaturesFlags::None;
|
||||
|
||||
psDesc.StencilEnable = true;
|
||||
psDesc.StencilReadMask = 0;
|
||||
psDesc.StencilPassOp = StencilOperation::Replace;
|
||||
|
||||
#if GPU_ALLOW_TESSELLATION_SHADERS
|
||||
// Check if use tessellation (both material and runtime supports it)
|
||||
const bool useTess = _info.TessellationMode != TessellationMethod::None && GPUDevice::Instance->Limits.HasTessellation;
|
||||
|
||||
Reference in New Issue
Block a user