Add new scene textures SceneStencil and ObjectLayer to sample Stencil buffer
This commit is contained in:
@@ -444,6 +444,16 @@ API_ENUM() enum class MaterialSceneTextures
|
||||
/// The scene world-space position (relative to the render view origin).
|
||||
/// </summary>
|
||||
WorldPosition = 11,
|
||||
|
||||
/// <summary>
|
||||
/// The scene stencil.
|
||||
/// </summary>
|
||||
SceneStencil = 12,
|
||||
|
||||
/// <summary>
|
||||
/// The object layer index.
|
||||
/// </summary>
|
||||
ObjectLayer = 13,
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -393,6 +393,10 @@ void MaterialParameter::Bind(BindMeta& meta) const
|
||||
case MaterialSceneTextures::Specular:
|
||||
view = meta.CanSampleGBuffer ? meta.Buffers->GBuffer2->View() : nullptr;
|
||||
break;
|
||||
case MaterialSceneTextures::SceneStencil:
|
||||
case MaterialSceneTextures::ObjectLayer:
|
||||
view = meta.CanSampleDepth ? meta.Buffers->DepthBuffer->ViewStencil() : nullptr;
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -246,6 +246,8 @@ void ParticleEmitterGPUGenerator::ProcessGroupTextures(Box* box, Node* node, Val
|
||||
break;
|
||||
}
|
||||
case MaterialSceneTextures::WorldPosition:
|
||||
case MaterialSceneTextures::SceneStencil:
|
||||
case MaterialSceneTextures::ObjectLayer:
|
||||
value = Value::Zero; // Not implemented
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -474,6 +474,23 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value)
|
||||
value = writeLocal(VariantType::Float3, String::Format(TEXT("GetWorldPos({1}, {0}.rgb)"), depthSample->Value, uv), node);
|
||||
break;
|
||||
}
|
||||
case MaterialSceneTextures::SceneStencil:
|
||||
case MaterialSceneTextures::ObjectLayer:
|
||||
{
|
||||
auto stencilParam = findOrAddSceneTexture(MaterialSceneTextures::SceneStencil);
|
||||
const auto parent = box->GetParent<ShaderGraphNode<>>();
|
||||
MaterialGraphBox* uvBox = parent->GetBox(0);
|
||||
bool useCustomUVs = uvBox->HasConnection();
|
||||
String uv;
|
||||
if (useCustomUVs)
|
||||
uv = MaterialValue::Cast(tryGetValue(uvBox, getUVs), VariantType::Float2).Value;
|
||||
else
|
||||
uv = TEXT("input.TexCoord.xy");
|
||||
const Char* func = type == MaterialSceneTextures::ObjectLayer ? TEXT("STENCIL_BUFFER_OBJECT_LAYER") : TEXT("");
|
||||
value = writeLocal(VariantType::Int, String::Format(TEXT("{2}(STENCIL_BUFFER_LOAD({0}, {1} * ScreenSize.xy))"), stencilParam.ShaderName, uv, func), node);
|
||||
_includes.Add(TEXT("./Flax/Stencil.hlsl"));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// Sample single texture
|
||||
|
||||
@@ -157,7 +157,10 @@ const Char* ShaderGraphUtilities::GenerateShaderResources(TextWriterUnicode& wri
|
||||
case MaterialParameterType::GPUTexture:
|
||||
case MaterialParameterType::SceneTexture:
|
||||
case MaterialParameterType::Texture:
|
||||
format = TEXT("Texture2D {0} : register(t{1});");
|
||||
if (param.AsInteger == (int32)MaterialSceneTextures::SceneStencil)
|
||||
format = TEXT("Texture2D<uint2> {0} : register(t{1});");
|
||||
else
|
||||
format = TEXT("Texture2D {0} : register(t{1});");
|
||||
break;
|
||||
case MaterialParameterType::GPUTextureCube:
|
||||
case MaterialParameterType::CubeTexture:
|
||||
|
||||
Reference in New Issue
Block a user