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

Общие вопросы о Unity3D

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

Сообщение alexsamadhi 18 май 2012, 08:31

Здравствуйте.
у меня проблема с transparent шейдером в волосах персонажа.
в настоящее время настройки шейдера выглядят вот так:

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

Cull off

и выглядет это вот так:
Изображение
пряди волос, которые нарисованы полигончиками чуть выше основной модельки волос прорисовываються неправильно и оказываються за основной моделькой + глюки с вылазиющими впереди обратными сторонами полигонов.
настройки ZWrite и ZTest либо ничего не дают, либо делают ещё большую каку.
в стандартных transparent шейдерах unity такая же проблема, cutout рисует верно, но не подходит, т.к. непотребно выглядит в данном случае.
как правильно указать ему порядок отрисовки полигонов, что бы пряди, нарясованные сверху и рисовались как положено сверху, а обратная сторона полигонов не вылазила такими артефактами? по похожим темам на форуме ничего не помогает
Последний раз редактировалось alexsamadhi 25 май 2012, 22:50, всего редактировалось 1 раз.
alexsamadhi
UNец
 
Сообщения: 12
Зарегистрирован: 17 май 2012, 19:10

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

Сообщение jetyb 18 май 2012, 18:40

Можно взять стандартный код Transparent\Cutout\Diffuse с добавленным Cull off.
Если нет, то хз, по по сообщению мало что понял.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

Сообщение Neyl 18 май 2012, 19:53

Проблему с вылезающими вперед задними полигонами может решить отдельная отрисовка 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) шейдеры.
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

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

Сообщение alexsamadhi 25 май 2012, 13:49

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

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

делаю хитрость, в модельке волос переворачиваю полигоны, их лица становятся спинами.
и они снова рисуються неверно! в чём магия? ~x(
alexsamadhi
UNец
 
Сообщения: 12
Зарегистрирован: 17 май 2012, 19:10

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

Сообщение alexsamadhi 25 май 2012, 22:42

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

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

Сообщение Battle Angel Alita 25 май 2012, 23:08

1 - Забиваем на блендинг, используем альфа-тест.
2 - Миримся с косяками.
3 - Ждём DX11 и Order-Independent Transparency.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

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

Сообщение alexsamadhi 26 май 2012, 22:30

как только, так сразу)

а пока так всё же лучше, тем более что оно без танцев с бубнами работет
alexsamadhi
UNец
 
Сообщения: 12
Зарегистрирован: 17 май 2012, 19:10


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10