PostProcessEffectRenderer BlitFullscreenTriangle conflict?
Добавлено: 24 июн 2020, 07:16
Добрый день, столкнулся с проблемой при работе с пост эффектами.
Сейчас у меня есть 2 шейдера с разными пост эффектами, первая проблема - по отдельности оба работают, если использую вместе - то все пост эффекты (включая стандартные) перестают работать.
Вторая проблема - это context.command.BuiltInBlit и context.command.BlitFullscreenTriangle, BuiltInBlit работает как надо, но во всех примерах рекомендуют использовать BlitFullscreenTriangle, а в моем случае он просто создает черный треугольник в центре сцены (т.е. даже не на ScreenUI, а в WorldPosition).
BuiltinBlit как-то проигрывает по производительности? Я могу его использовать или все же нужно разобраться почему треугольник не хочет работать?
Так же как мне не ясно почему 2 моих эффекта ломают весь пост-стек. Сижу на "ванильном" рендере, без URPL и HDRPL.
Так работает на старом BuiltinBlit-е
Так создает черный треугольник и все ломает:
Сам шейдер эффекта:
Сейчас у меня есть 2 шейдера с разными пост эффектами, первая проблема - по отдельности оба работают, если использую вместе - то все пост эффекты (включая стандартные) перестают работать.
Вторая проблема - это context.command.BuiltInBlit и context.command.BlitFullscreenTriangle, BuiltInBlit работает как надо, но во всех примерах рекомендуют использовать BlitFullscreenTriangle, а в моем случае он просто создает черный треугольник в центре сцены (т.е. даже не на ScreenUI, а в WorldPosition).
BuiltinBlit как-то проигрывает по производительности? Я могу его использовать или все же нужно разобраться почему треугольник не хочет работать?
Так же как мне не ясно почему 2 моих эффекта ломают весь пост-стек. Сижу на "ванильном" рендере, без URPL и HDRPL.
Так работает на старом BuiltinBlit-е
Синтаксис:
Используется csharp
public sealed class DrunkEffectRenderer : PostProcessEffectRenderer<DrunkSettings>
{
private Material _drunkMat;
public override void Render(PostProcessRenderContext context)
{
if (_drunkMat == null)
{
_drunkMat = GovnyakManager.DrunkEffectMaterial;
}
context.command.BuiltinBlit(context.source, context.destination, _drunkMat);
}
}
{
private Material _drunkMat;
public override void Render(PostProcessRenderContext context)
{
if (_drunkMat == null)
{
_drunkMat = GovnyakManager.DrunkEffectMaterial;
}
context.command.BuiltinBlit(context.source, context.destination, _drunkMat);
}
}
Так создает черный треугольник и все ломает:
Синтаксис:
Используется csharp
public sealed class DrunkEffectRenderer : PostProcessEffectRenderer<DrunkSettings>
{
public override void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(Shader.Find("Hidden/Drunk"));
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
}
}
{
public override void Render(PostProcessRenderContext context)
{
var sheet = context.propertySheets.Get(Shader.Find("Hidden/Drunk"));
context.command.BlitFullscreenTriangle(context.source, context.destination, sheet, 0);
}
}
Сам шейдер эффекта:
Синтаксис:
Используется glsl
Shader "Hidden/Drunk"
{
Properties
{
[HideInInspector] _MainTex ("Texture", 2D) = "black" {}
_Offset1("Move Factor", float) = 0.05
_Offset2("DoubleEffect Speed", float) = 0.5
_Offset3("DoubleEffect Power", float) = 0.01
_Offset4("Colors?", float) = 5
}
Subshader
{
Pass
{
CGPROGRAM
#pragma vertex vertex_shader
#pragma fragment pixel_shader
#pragma target 2.0
sampler2D _MainTex;
float _Offset1;
float _Offset2;
float _Offset3;
float _Offset4;
float4 vertex_shader (float4 vertex:POSITION):SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
float4 pixel_shader (float4 vertex:SV_POSITION):COLOR
{
vector <float,2> uv = vertex.xy/_ScreenParams.xy;
uv.x+=cos(uv.y*2.0+_Time.g)*_Offset1;
uv.y+=sin(uv.x*2.0+_Time.g)*_Offset1;
float offset = sin(_Time.g *_Offset2) * _Offset3;
float4 a = tex2D(_MainTex,uv);
float4 b = tex2D(_MainTex,uv-float2(sin(offset),0.0));
float4 c = tex2D(_MainTex,uv+float2(sin(offset),0.0));
float4 d = tex2D(_MainTex,uv-float2(0.0,sin(offset)));
float4 e = tex2D(_MainTex,uv+float2(0.0,sin(offset)));
return (a+b+c+d+e)/_Offset4;
}
ENDCG
}
}
}
{
Properties
{
[HideInInspector] _MainTex ("Texture", 2D) = "black" {}
_Offset1("Move Factor", float) = 0.05
_Offset2("DoubleEffect Speed", float) = 0.5
_Offset3("DoubleEffect Power", float) = 0.01
_Offset4("Colors?", float) = 5
}
Subshader
{
Pass
{
CGPROGRAM
#pragma vertex vertex_shader
#pragma fragment pixel_shader
#pragma target 2.0
sampler2D _MainTex;
float _Offset1;
float _Offset2;
float _Offset3;
float _Offset4;
float4 vertex_shader (float4 vertex:POSITION):SV_POSITION
{
return UnityObjectToClipPos(vertex);
}
float4 pixel_shader (float4 vertex:SV_POSITION):COLOR
{
vector <float,2> uv = vertex.xy/_ScreenParams.xy;
uv.x+=cos(uv.y*2.0+_Time.g)*_Offset1;
uv.y+=sin(uv.x*2.0+_Time.g)*_Offset1;
float offset = sin(_Time.g *_Offset2) * _Offset3;
float4 a = tex2D(_MainTex,uv);
float4 b = tex2D(_MainTex,uv-float2(sin(offset),0.0));
float4 c = tex2D(_MainTex,uv+float2(sin(offset),0.0));
float4 d = tex2D(_MainTex,uv-float2(0.0,sin(offset)));
float4 e = tex2D(_MainTex,uv+float2(0.0,sin(offset)));
return (a+b+c+d+e)/_Offset4;
}
ENDCG
}
}
}