Я создал текстуру рендеринга, которую я могу визуализировать с помощью меню вида из редактора UE.В настоящее время текстура имеет один сплошной цвет.Я хочу заполнить текстуру глубиной в пикселях, используя нереальный шейдер.Я знаю, что буфер глубины уже существует, но это упражнение поможет мне понять весь шейдерный конвейер в UE.Есть ли способ получить значения глубины из шейдера, сброшенного на текстуру?У меня есть следующий вершинный шейдер.
struct FTriangleIDPassVSToPS
{
float4 Position : SV_POSITION;
};
#define FTriangleIDPassVSOutput FTriangleIDPassVSToPS
void MainVS(FVertexFactoryInput Input,
out FTriangleIDPassVSOutput Output
#if USE_GLOBAL_CLIP_PLANE
, out float OutGlobalClipPlaneDistance : SV_ClipDistance
#endif
)
{
ResolvedView = ResolveView();
FVertexFactoryIntermediates VFIntermediates = GetVertexFactoryIntermediates(Input);
float4 WorldPos = VertexFactoryGetWorldPosition(Input, VFIntermediates);
float3x3 TangentToLocal = VertexFactoryGetTangentToLocal(Input, VFIntermediates);
FMaterialVertexParameters VertexParameters = GetMaterialVertexParameters(Input, VFIntermediates, WorldPos.xyz, TangentToLocal);
// Isolate instructions used for world position offset
// As these cause the optimizer to generate different position calculating instructions in each pass, resulting in self-z-fighting.
// This is only necessary for shaders used in passes that have depth testing enabled.
ISOLATE
{
WorldPos.xyz += GetMaterialWorldPositionOffset(VertexParameters);
}
ISOLATE
{
float4 RasterizedWorldPosition = VertexFactoryGetRasterizedWorldPosition(Input, VFIntermediates, WorldPos);
#if ODS_CAPTURE
float3 ODS = OffsetODS(RasterizedWorldPosition.xyz, ResolvedView.TranslatedWorldCameraOrigin.xyz, ResolvedView.StereoIPD);
Output.Position = INVARIANT(mul(float4(RasterizedWorldPosition.xyz + ODS, 1.0), ResolvedView.TranslatedWorldToClip));
#else
Output.Position = INVARIANT(mul(RasterizedWorldPosition, ResolvedView.TranslatedWorldToClip));
#endif
}
}
понимаю, что вывод дает позицию вершины в пространстве клипа.В пиксельном шейдере, я должен сделать что-то вроде этого?
void MainPS(FTriangleIDPassVSToPS Output, out uint OutColor : SV_Target0)
{
OutColor = Output.Position.z / Output.Position.w;
}
Когда я визуализирую текстуру рендеринга, она не дает ожидаемого результата.Можете ли вы указать мне правильный способ сделать это?Спасибо