Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Shader: как избавиться от искажения полос?

Shader: как избавиться от искажения полос?

Поделиться
AlerrПостоялецwww31 окт. 201717:17#0
Привет всем!
Сделал шейдер, который создает рябь на экране (горизонтальные полосы):
Pass
    {
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      // make fog work
      #pragma multi_compile_fog
      
      #include "UnityCG.cginc"

      struct appdata
      {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
        float4 color : COLOR;
      };

      struct v2f
      {
        float2 uv : TEXCOORD0;
        fixed4 sPos : TEXCOORD1;
        float4 vertex : SV_POSITION;
        float4 color : COLOR;// FOR scrollbar UI (Not used in screen)

        float dist : TEXCOORD2;
      };

      //> sampler2D _MainTex;
      //> float4 _MainTex_ST;

      float2 _Pixels;
      //float2 _LCDPixels;
      float4 _Color;
      half _LinesSize;
      float4 _LineColor;
      
      v2f vert (appdata v)
      {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        o.uv = v.uv;// TRANSFORM_TEX(v.uv, _MainTex);

        o.sPos = ComputeScreenPos(v.vertex);
        o.color = v.color;

        o.dist = clamp(length(ObjSpaceViewDir(v.vertex)), 0.0, 0.1);

        return o;
      }
      
      fixed4 frag (v2f i) : SV_Target
      {
        fixed p = i.sPos.y / i.sPos.w;
         float colorLerpK = 0.0;
              if((int)(p*_ScreenParams.y/floor(_LinesSize))%2==0) colorLerpK = 0.5;

        //. float2 uv_lcd = //i.uv * _Pixels.xy / _LCDPixels;
        //. round(i.uv * _Pixels.xy + 0.5) / _Pixels.xy;
         
        //. fixed4 col = tex2D(_MainTex, uv_lcd);

        return lerp(_Color, _LineColor, colorLerpK*i.dist) * i.color;//. col * 
      }
      ENDCG
    }

Шейдер работает, полосы есть. Но при удалении камеры на текстуре образуются искажения, полосы начинают скакать и изгибаться. Подозреваю, что проблема стара как мир и связано это с мипмапом:

+ Показать

В шейдере пробовал использовать дистанцию до обьекта, чтобы избавиться от полос, но мало чего из этого получилось. Что это? Как с этим борются?

SuslikМодераторwww31 окт. 201717:25#1
Alerr
мипмаппинг отношения не имеет, потому что ты данные читаешь не из текстуры. если тебе нужен эффект имитации шума аналогового сигнала, то его надо генерить не на поверхности материала, который рендеришь, а в экранных координатах в постпроцессе.
Андрей5000Постоялецwww31 окт. 201717:27#2
Alerr
> Что это? Как с этим борются?
Нужно найти нужный ассет
AlerrПостоялецwww31 окт. 201717:57#3
Suslik
> Alerr
> мипмаппинг отношения не имеет, потому что ты данные читаешь не из текстуры. если тебе нужен эффект имитации шума аналогового сигнала, то его надо генерить не на поверхности
> материала, который рендеришь, а в экранных координатах в постпроцессе.
Текстура "экрана" расположена не во весь экран монитора компьютера чтобы на нее накладывать постэффект шума, это текстура экрана модели монитора, корорый расположен в мире и на который наведена камера. Или я неправильно понял про "экранных координатах в постпроцессе". Вы имеете в виду, что нужно применить эффект до растеризации?
MrShoorУчастникwww31 окт. 201723:36#4
Alerr
> Что это? Как с этим борются?
Как ты уже и сказал, пробелма с мипами. Нужно генерить мипы (самый простой вариант GenerateMips в DX или glGenerateMips в OGL) либо сеплить несколько раз при выборке из этой текстуры и смешивать результат.
SuslikМодераторwww1 ноя. 20172:44#5
Alerr
> Текстура "экрана" расположена не во весь экран монитора компьютера чтобы на нее
> накладывать постэффект шума, это текстура экрана модели монитора, корорый
> расположен в мире и на который наведена камера.
если тебе надо, чтобы шум был на экране внутри игры, а не на твоём экране, то да, придётся запечь этот шум в текстуру и для неё построить мипы. если тебе нужно, чтобы шум был на твоём экране, то вычисления надо проводить в экранных координатах.

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр