Глубина пикселей с использованием шейдера Unreal - PullRequest
0 голосов
/ 19 сентября 2018

Я создал текстуру рендеринга, которую я могу визуализировать с помощью меню вида из редактора 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;
 }

Когда я визуализирую текстуру рендеринга, она не дает ожидаемого результата.Можете ли вы указать мне правильный способ сделать это?Спасибо

...