SolidColor вместо Skybox в прозрачном шейдере

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

SolidColor вместо Skybox в прозрачном шейдере

Сообщение PinkPanter 10 май 2016, 22:19

Здравствуйте, заранее извиняюсь, если такое уже было, но найти не смог.
Такая проблема, использую VertexLit rendering path, что бы повысить быстродействие. Под это дело необходим AlphaTest шейдер. Из родных - работает только Unlit/Transparent Cutout, но он не подходит, так как на освещение ему плевать.

Попытался написать свой шейдер, Diffuse + Transparent cutout.
В итоге проблема такая, вместо скайбоксовской текстуры, прозрачность выводит solid color камеры.
На остальных объектах прозрачность работает как надо.
Не совсем понимаю как это решать.

Изображение
Изображение

Синтаксис:
Используется csharp
Shader "Custom/DiffuseCutoff" {
        Properties
        {
        _Color ("Main Color", Color) = (1,1,1,1)
                _MainTex("Main Texture", 2D) = "white" {}
                _SecondTex("AlfaMAsk", 2D) = "white" {}
                _Cutoff("Cutoff", Range(0,1)) = 0.5
        }
                SubShader
                {
                        Pass
                        {
                                Tags{ "Queue" = "AlphaTest" "LightMode" = "Vertex" "RenderType"="TransparentCutout" "IgnoreProjector"="True"}
                                Cull Off
                                //ZWrite On
       
                                Blend SrcAlpha OneMinusSrcAlpha
                               
                                CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
       
                                fixed4 _Color;
                                sampler2D _MainTex;
                                float4 _MainTex_ST;
                                sampler2D _SecondTex;
                                float4 _SecondTex_ST;
                                fixed _Cutoff;
               
                                struct v2f
                                {
                                        float2 uv : TEXCOORD0;
                                        float2 uv1 : TEXCOORD1;
                                        fixed4 diff : COLOR0;
                                        float4 vertex : SV_POSITION;
                                };
               
                                v2f vert(appdata_base v)
                                {
                                        v2f o;
                                        o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                                        o.uv1 = TRANSFORM_TEX(v.texcoord, _SecondTex);
                                       
                                        half3 worldNormal = UnityObjectToWorldNormal(v.normal);
                                        half nl = max(0, dot(worldNormal, _WorldSpaceLightPos0.xyz));
                                        o.diff = nl * _LightColor0;

                                        return o;
                                }
               
                                fixed4 frag(v2f i) : SV_Target
                                {
                                        fixed4 col = tex2D(_MainTex, i.uv);
                                        col *= i.diff * _Color;
                                       
                                        fixed4 alfaColor = tex2D(_SecondTex, i.uv1);
                                        if(alfaColor.a > _Cutoff)
                                                col = fixed4(col.r, col.g, col.b, 1.0);
                                        else
                                                col = fixed4(col.r, col.g, col.b, 0.0);
                                               
                                        return col;
                                }
                                ENDCG
                        }              
                }
}
PinkPanter
UNец
 
Сообщения: 3
Зарегистрирован: 12 окт 2013, 19:21

Re: SolidColor вместо Skybox в прозрачном шейдере

Сообщение jetyb 11 май 2016, 14:55

Синтаксис:
Используется csharp
if(alfaColor.a > _Cutoff)
                                                col = fixed4(col.r, col.g, col.b, 1.0);
                                        else
                                                col = fixed4(col.r, col.g, col.b, 0.0);
 

заменить на
Синтаксис:
Используется csharp
clip(alfaColor.a - _Cutoff);
 
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: SolidColor вместо Skybox в прозрачном шейдере

Сообщение PinkPanter 11 май 2016, 19:32

Таким образом вылазят другие артефакты, solid color как то странно по местам с высокой альфой размещается. Но это такое, можно его выкрутить под цвет шейдера, и забить, хотя тогда прощай текстуры.
Главное что теперь странно себя ведет порядок отрисовки, на сколько я понимаю, в гифках видно.

ИзображениеИзображение

Пробовал играть с ZWrite, при Off solid color исчезает, но опять таки артефакты с очередью отрисовки, как тут
Изображение
PinkPanter
UNец
 
Сообщения: 3
Зарегистрирован: 12 окт 2013, 19:21

Re: SolidColor вместо Skybox в прозрачном шейдере

Сообщение PinkPanter 11 май 2016, 20:56

Все решилось, вариант первый шейдер что я выложил + AlphaToMask On работает отлично
PinkPanter
UNец
 
Сообщения: 3
Зарегистрирован: 12 окт 2013, 19:21


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

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

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