[РЕШЕНО] Тень от Projector конфликтует на некоторых GPU

Шейдеры и все-все-все.

[РЕШЕНО] Тень от Projector конфликтует на некоторых GPU

Сообщение Nolex 30 сен 2016, 11:00

Прислали, скрин, где видно, что тень Projector отображается криво:

Изображение

Похоже, что проблема в шейдерах и сортировке.
Проявляется ТОЛЬКО на некоторых девайсах с GPU типа Mali-400 (Sony Xperia P) и PowerVR SGX 531 (Wexler 7id).
На моих 5-ти девайсах нет такой проблемы.

Как решить проблему с сортировкой?

Шейдер Projector:

Синтаксис:
Используется glsl
// Upgrade NOTE: replaced '_Projector' with 'unity_Projector'
// Upgrade NOTE: replaced '_ProjectorClip' with 'unity_ProjectorClip'

Shader "Projector/Multiply Optimized" {
        Properties {
                _ShadowTex ("Cookie", 2D) = "gray" {}
                _FalloffTex ("FallOff", 2D) = "white" {}
        }
        Subshader {
                Tags {"Queue"="Transparent"}
                Pass {
                        ZWrite Off
                        ColorMask RGB
                        Blend DstColor Zero
                        Offset -1, -1

                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include "UnityCG.cginc"
                       
                        struct v2f {
                                float4 uvShadow : TEXCOORD0;
                                float4 uvFalloff : TEXCOORD1;
                                float4 pos : SV_POSITION;
                        };
                       
                        float4x4 unity_Projector;
                        float4x4 unity_ProjectorClip;
                       
                        v2f vert (float4 vertex : POSITION)
                        {
                                v2f o;
                                o.pos = mul (UNITY_MATRIX_MVP, vertex);
                                o.uvShadow = mul (unity_Projector, vertex);
                                o.uvFalloff = mul (unity_ProjectorClip, vertex);
                                return o;
                        }
                       
                        sampler2D _ShadowTex;
                        sampler2D _FalloffTex;
                       
                        fixed4 frag (v2f i) : SV_Target
                        {
                                fixed4 texS = tex2Dproj (_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
                                texS.a = 1.0-texS.a;

                                fixed4 texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
                                fixed4 res = lerp(fixed4(1,1,1,0), texS, texF.a);

                                return res;
                        }
                        ENDCG
                }
        }
}
 



Шейдер колёсный (MatCap/Vertex/Textured Multiply):

Синтаксис:
Используется glsl
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

// MatCap Shader, (c) 2015 Jean Moreno

Shader "MatCap/Vertex/Textured Multiply"
{
        Properties
        {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _MatCap ("MatCap (RGB)", 2D) = "white" {}
        }
       
        Subshader
        {
                Tags { "RenderType"="Opaque" }
               
                Pass
                {
                        Tags { "LightMode" = "Always" }
                       
                        CGPROGRAM
                                #pragma vertex vert
                                #pragma fragment frag
                                #pragma fragmentoption ARB_precision_hint_fastest
                                #include "UnityCG.cginc"
                               
                                struct v2f
                                {
                                        float4 pos      : SV_POSITION;
                                        float2 uv       : TEXCOORD0;
                                        float2 cap      : TEXCOORD1;
                                };
                               
                                uniform float4 _MainTex_ST;
                               
                                v2f vert (appdata_base v)
                                {
                                        v2f o;
                                        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                                        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                                        half2 capCoord;
                                       
                                        float3 worldNorm = normalize(unity_WorldToObject[0].xyz * v.normal.x + unity_WorldToObject[1].xyz * v.normal.y + unity_WorldToObject[2].xyz * v.normal.z);
                                        worldNorm = mul((float3x3)UNITY_MATRIX_V, worldNorm);
                                        o.cap.xy = worldNorm.xy * 0.5 + 0.5;
                                       
                                        return o;
                                }
                               
                                uniform sampler2D _MainTex;
                                uniform sampler2D _MatCap;
                               
                                fixed4 frag (v2f i) : COLOR
                                {
                                        fixed4 tex = tex2D(_MainTex, i.uv);
                                        fixed4 mc = tex2D(_MatCap, i.cap);
                                       
                                        return tex * mc * 2.0;
                                }
                        ENDCG
                }
        }
       
        Fallback "VertexLit"
}
Последний раз редактировалось Nolex 04 окт 2016, 21:40, всего редактировалось 4 раз(а).
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение Nolex 30 сен 2016, 12:46

Попробовали в шейдер колёс (Textured Multiply) вот такие свойства прописать:
Tags { "LightMode" = "Always" "Queue"="Geometry+100" "IgnoreProjector"="True"}

Не помогло..
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение waruiyume 30 сен 2016, 12:54

А слой колёс из прожектора не вариант убрать?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 5033
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение Nolex 30 сен 2016, 13:21

Слой убран, ясное дело.

Проблема с сортированием отрисовки. Надо шейдер подправить какой-то.
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение waruiyume 30 сен 2016, 13:26

При чём тут сортировка, прожектор "дублирует" попавшую в него геометрию, отрисовывая её с другим материалом. Пишите багрепорт, т.к. если не игнорятся слои- это жёсткий факап юнитеков, и вряд ли что-то получится сделать, без их вмешательства.
----
Кажется до меня дошло, что имелось в виду. Попробуйте, на колёсах, очередь Transparent+1. Если не подойдёт, попробуйте повысить точность Z-буффера.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 5033
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение waruiyume 30 сен 2016, 13:51

https://xenforo.unity3d.com/threads/gra ... id.265249/
Попробуйте увеличить Near clip plane на камере и прожекторе, особенно на камере.
---
Только на камере)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 5033
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение jetyb 30 сен 2016, 15:04

Попробуйте Offset -1 -1 убрать или с параметрами поиграться.
Вообще слабо понятно что конкретно Offset делает, объяснено в мануалах через жопу.
Со стандартным ZTest LEqual все должно работать.

В чем проблема:
когда отрисовывается земля с шейдером проектора, то также отрисовываются и пиксели земли находящиеся за колесами (из-за этого Offset).
jetyb
Адепт
 
Сообщения: 1362
Зарегистрирован: 31 окт 2011, 17:21

Re: Тень от Projector конфликтует с колёсами на некоторых GPU

Сообщение Nolex 01 окт 2016, 23:59

waruiyume писал(а):https://xenforo.unity3d.com/threads/graphics-glitch-with-the-projector-on-android.265249/
Попробуйте увеличить Near clip plane на камере и прожекторе, особенно на камере.
---
Только на камере)

Не, там выставлено всё правильно. Near и так подогнал по максимуму.

jetyb писал(а):Попробуйте Offset -1 -1 убрать или с параметрами поиграться.
Вообще слабо понятно что конкретно Offset делает, объяснено в мануалах через жопу.
Со стандартным ZTest LEqual все должно работать.

В чем проблема:
когда отрисовывается земля с шейдером проектора, то также отрисовываются и пиксели земли находящиеся за колесами (из-за этого Offset).

Супер!! Убрал Offset у проектора и всё стало ОК!
Очень большое спасибо!! :-bd
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: Тень от Projector конфликтует на некоторых GPU

Сообщение Nolex 04 окт 2016, 14:03

ЭХ, рано радовался. Появилась другая проблема!

Изображение

Теперь если ездить по большим ящиком (контейнерам), то происходит что-то вроде Z-файтинг. Тень переодически сильно мерцает.

На скрине плохо видно, т-к сложно заскринить сам момент мерцания.
На контейнере, такой же шейдер как на колёсах (MatCap/Vertex/Textured Multiply).

P. S. А на земле шейдер Mobile/Diffuse — всё ок, нету мерцания!
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: Тень от Projector конфликтует на некоторых GPU

Сообщение jetyb 04 окт 2016, 15:03

Проблема в том, что Z координата точки ящика (когда рисуем шейдером проектора) перекрывается Z-координатой точки ящика (когда рисуем шейдером ящика). Возможно из-за разных методов подсчета и погрешности числа float.
Решения:
а) Считать позицию вершин в шейдерах проектора и ящика идентично.
б) В шейдере проектора сдвигать позицию вершины на пару миллиметров ближе к камере.
jetyb
Адепт
 
Сообщения: 1362
Зарегистрирован: 31 окт 2011, 17:21

Re: Тень от Projector конфликтует на некоторых GPU

Сообщение Nolex 04 окт 2016, 21:40

jetyb писал(а):Проблема в том, что Z координата точки ящика (когда рисуем шейдером проектора) перекрывается Z-координатой точки ящика (когда рисуем шейдером ящика). Возможно из-за разных методов подсчета и погрешности числа float.
Решения:
а) Считать позицию вершин в шейдерах проектора и ящика идентично.
б) В шейдере проектора сдвигать позицию вершины на пару миллиметров ближе к камере.

Спасибо большое, что отозвался.

Твои советы помогли + еще один хороший человек подсказал как именно реализовать вариант б.
Вот: o.pos.z -= 0.0001;

Дописали в проекторе эту строчку и вроде нормально!
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ

Re: [РЕШЕНО] Тень от Projector конфликтует на некоторых GPU

Сообщение Nolex 21 окт 2016, 18:07

Снова проявился этот баг) Теперь на iOS с OpenGL 2.0.

Увеличил числа в 10 раз помогло:
o.pos.z -= 0.001;
Разработка игр в студии Brinemedia .
Аватара пользователя
Nolex
UNIверсал
 
Сообщения: 483
Зарегистрирован: 17 окт 2010, 12:26
Откуда: Украина
Skype: exlumen
  • Сайт
  • ICQ


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4