Косячный z-order у билбордов деревьев

Speed Tree : Terrain & Trees.

Косячный z-order у билбордов деревьев

Сообщение alexz 22 мар 2011, 00:10

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

На первой картинке все деревья 3-мерные. За деревом горит костёр, и дым от него идёт позади дерева. Солнце (обычная белая 3-мерная сфера) тоже рисуется полностью за деревом. Включено два эффекта: Bloom And Flares (чтобы солнце сияло) и Sun Shafts.
1.jpg


На второй картинке дальние деревья стали билбордами. Как результат:
― дым рисуется поверх деревьев,
― солнечный диск почему-то тоже вылез поверх. Причём этот диск не настоящее 3-мерное солнце, а артефакт эффекта Bloom And Flares. Если эффект выключить, остаётся только настоящее солнце, которое далеко-далеко за деревьями
2.jpg


Ради эксперимента завёл новый проект, в нём террейн, деревья и позади них источник частиц. Объекты в порядке удалённости от камеры: 3D дерево -> билборд дерева -> источник частиц. А на картинке всё рисуется по-другому: 3D дерево -> источник частиц -> билборд.
3.jpg


Кто-нибудь сталкивался с такой проблемой?
У вас нет доступа для просмотра вложений в этом сообщении.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Косячный z-order у билбордов деревьев

Сообщение gnoblin 22 мар 2011, 02:13

а если взять шейдер билбордов из буткемпа?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Косячный z-order у билбордов деревьев

Сообщение alexz 22 мар 2011, 20:48

gnoblin писал(а):а если взять шейдер билбордов из буткемпа?

Разобрался. В bootcamp посмотрел, там сделано то же самое.

1. Оказалось, что в шейдере билбордов вообще выключена запись в z-буфер. Посмотрел код эффекта Bloom And Flares: артефакт солнечного диска поверх деревьев ― это моя же 3D сфера, отрисованная ещё раз для усиления эффекта. Поверх деревьев она оказалась из-за того, что z-буфер был чист.

Правда, мне остаётся непонятно, если билборды не пишут в z-буфер, то как тогда работает эффект Sun Shafts?

2. Ещё пришлось включить альфатест, без него получалось вот так:
4.JPG


Теперь всё в порядке:
5.JPG


...
Pass {
ColorMask rgb
Blend SrcAlpha OneMinusSrcAlpha
AlphaTest Greater 0.9
ZWrite On
Cull Off
...
У вас нет доступа для просмотра вложений в этом сообщении.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Косячный z-order у билбордов деревьев

Сообщение gnoblin 23 мар 2011, 02:54

круто, а можно целый шейдер для ускорения обретения счастья? :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Косячный z-order у билбордов деревьев

Сообщение alexz 23 мар 2011, 19:18

Код: Выделить всё
Shader "Hidden/TerrainEngine/BillboardTree" {
   Properties {
      _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
   }
   
   SubShader {
      Tags { "Queue" = "Transparent-100" "IgnoreProjector"="True" "RenderType"="TreeBillboard" }
      
      Pass {
         ColorMask rgb
         Blend SrcAlpha OneMinusSrcAlpha
         AlphaTest Greater 0.9
         ZWrite On
         Cull Off
         
         CGPROGRAM
         #pragma vertex vert
         #include "UnityCG.cginc"
         #include "TerrainEngine.cginc"
         #pragma fragment frag

         struct v2f {
            float4 pos : POSITION;
            float fog : FOGC;
            fixed4 color : COLOR0;
            float2 uv : TEXCOORD0;
         };

         v2f vert (appdata_tree_billboard v) {
            v2f o;
            TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y);   
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.fog = o.pos.z;
            o.uv.x = v.texcoord.x;
            o.uv.y = v.texcoord.y > 0;
            o.color = v.color;
            return o;
         }

         sampler2D _MainTex;
         fixed4 frag(v2f input) : COLOR
         {
            fixed4 col = tex2D( _MainTex, input.uv);
            col.rgb *= input.color.rgb;
            clip(col.a);
            return col;
         }
         ENDCG         
      }
   }

   SubShader {
      Tags { "Queue" = "Transparent-100" "IgnoreProjector"="True" "RenderType"="TreeBillboard" }
      
      Pass {

         CGPROGRAM
         #pragma vertex vert
         #pragma exclude_renderers gles xbox360 ps3
         #include "UnityCG.cginc"
         #include "TerrainEngine.cginc"

         struct v2f {
            float4 pos : POSITION;
            float fog : FOGC;
            fixed4 color : COLOR0;
            float2 uv : TEXCOORD0;
         };

         v2f vert (appdata_tree_billboard v) {
            v2f o;
            TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y);   
            o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.fog = o.pos.z;
            o.uv.x = v.texcoord.x;
            o.uv.y = v.texcoord.y > 0;
            o.color = v.color;
            return o;
         }
         ENDCG         

         ColorMask rgb
         Blend SrcAlpha OneMinusSrcAlpha
         AlphaTest Greater 0.9
         Cull Off

         SetTexture [_MainTex] { combine texture * primary, texture }
      }
   }
   
   Fallback Off
}
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37


Вернуться в Земля и деревья.

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

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