Страница 1 из 1

Transparent шейдер в волосах [РЕШЕНО]

СообщениеДобавлено: 18 май 2012, 08:31
alexsamadhi
Здравствуйте.
у меня проблема с transparent шейдером в волосах персонажа.
в настоящее время настройки шейдера выглядят вот так:

SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

Cull off

и выглядет это вот так:
Изображение
пряди волос, которые нарисованы полигончиками чуть выше основной модельки волос прорисовываються неправильно и оказываються за основной моделькой + глюки с вылазиющими впереди обратными сторонами полигонов.
настройки ZWrite и ZTest либо ничего не дают, либо делают ещё большую каку.
в стандартных transparent шейдерах unity такая же проблема, cutout рисует верно, но не подходит, т.к. непотребно выглядит в данном случае.
как правильно указать ему порядок отрисовки полигонов, что бы пряди, нарясованные сверху и рисовались как положено сверху, а обратная сторона полигонов не вылазила такими артефактами? по похожим темам на форуме ничего не помогает

Re: Transparent шейдер в волосах

СообщениеДобавлено: 18 май 2012, 18:40
jetyb
Можно взять стандартный код Transparent\Cutout\Diffuse с добавленным Cull off.
Если нет, то хз, по по сообщению мало что понял.

Re: Transparent шейдер в волосах

СообщениеДобавлено: 18 май 2012, 19:53
Neyl
Проблему с вылезающими вперед задними полигонами может решить отдельная отрисовка back и front полигонов в два прохода. Пример в разделе Glass Culling. Для surface шейдера использование выглядит так
Синтаксис:
Используется glsl
Shader "Crankshaft/RaceCars/Glass" {
Properties {
        _MainTex ("Base (RGB)", 2D) = "black" {}
        _AlphaTex ("Alpha (A)", 2D) = "grey" {}
        _Cube ("Reflection Cubemap", Cube) = "_Skybox" { TexGen CubeReflect }
        _Opacity ("Opacity", Range(0,2)) = 1.0
        _Reflectivity ("Reflectivity", Range(0,1)) = 0.5
        _Fresnel( "Fresnel " , Range(0,5)) = 1.0
}
SubShader {
        LOD 200
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        Lighting On
       
//
//first pass
//
Cull Front
CGPROGRAM
#pragma surface surf Lambert alpha nolightmap nodirlightmap

sampler2D _MainTex;
sampler2D _AlphaTex;
float _Opacity;

struct Input {
        float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
        half a = tex2D(_AlphaTex, IN.uv_MainTex).a;
        o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
        o.Alpha = a * _Opacity;
}
ENDCG

//
//second pass
//
Cull Back
CGPROGRAM
#pragma surface surf Lambert alpha nolightmap nodirlightmap

sampler2D _MainTex;
sampler2D _AlphaTex;
samplerCUBE _Cube;
float4 _Color;
float _Opacity;
float _Reflectivity;
float _Fresnel;

struct Input {
        float2 uv_MainTex;
        float3 viewDir;
        float3 worldRefl;
};

void surf (Input IN, inout SurfaceOutput o) {
        half a = tex2D(_AlphaTex, IN.uv_MainTex).a;
        o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;

        half4 reflcol = texCUBE (_Cube, IN.worldRefl);
       
        reflcol *= _Reflectivity;
        float3 view = normalize( IN.viewDir );
        float fresnel = pow(1.0 - saturate ( dot ( view, o.Normal )), _Fresnel);
         
        o.Emission = reflcol.rgb;
        o.Alpha = (_Opacity*a)+fresnel;
}
ENDCG
}
       
FallBack "Reflective/VertexLit"
}  

Т.е. два раза используете CGPROGRAM, перед первым пишете Cull Front, перед вторым Cull Back. Глюки с неправильной отрисовкой двусторонних стекол это решает, должно и с волосами помочь. Но таки надежней будет перейти на alphatest (cutout) шейдеры.

Re: Transparent шейдер в волосах

СообщениеДобавлено: 25 май 2012, 13:49
alexsamadhi
проблему с вылазиванием задних сторон полигонов решило прекрасно ) благодарю.
но порядок отрисовки, всё ещё неправильный, в районе одного прохода полигоны находящиеся дальше от камеры рисуются поверх тех, что находяться ближе к камере.

причём, я оставил только отрисовку спин полигонов с настройками :
Cull Front
ZWrite On
ZTest Less
и они рисуются правильно! кто к камере ближе, тот и отрисовывается сверху.

делаю хитрость, в модельке волос переворачиваю полигоны, их лица становятся спинами.
и они снова рисуються неверно! в чём магия? ~x(

Re: Transparent шейдер в волосах

СообщениеДобавлено: 25 май 2012, 22:42
alexsamadhi
полазил по юнити саппорт, сами пишут, что это невозможно.
но предлагают комбинированный вариант alphablend и alphatest(cutout) шейдера.
есть косяки на местах плавных затуханий альфы, но для волос этого достаточно.
вот здесь про это написано:
http://unity3d.com/support/documentatio ... aTest.html

Re: Transparent шейдер в волосах [РЕШЕНО]

СообщениеДобавлено: 25 май 2012, 23:08
Battle Angel Alita
1 - Забиваем на блендинг, используем альфа-тест.
2 - Миримся с косяками.
3 - Ждём DX11 и Order-Independent Transparency.

Re: Transparent шейдер в волосах [РЕШЕНО]

СообщениеДобавлено: 26 май 2012, 22:30
alexsamadhi
как только, так сразу)

а пока так всё же лучше, тем более что оно без танцев с бубнами работет