Получить screenspace координаты по мировым (vertex/fragment)

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

Получить screenspace координаты по мировым (vertex/fragment)

Сообщение DrSpritz 11 июл 2015, 15:01

Доброго времени суток уважаемые форумчане!

Помогите пожалуйста с этим делом, я уже себе голову сломал и совсем запутался 8-}
Есть задача написать альтернативный вариант "Flare" для Directional light используя построцессинг.

Задача в принципе не сложная, но я новичок в написании шейдеров и сильно путаюсь в командах =(
Умом я понимаю, что всего-то нужно взять вектор освещения, перемножить его на матрицу вид*проекция и полученные координаты использовать в качестве UV для размещения текстурки солнца на экране. Но как это оформить в коде я не знаю, там куча команд и всяких матриц, которые непонятно для меня работают.

Синтаксис:
Используется csharp
Shader "Custom/Lens"
{
        Properties
        {
                 _MainTex ("", 2D) = "white" {}
                 _LensTex ("Lens texture", 2D) = "white" {}
                 _Color ("Multiply color (RGB)", Color) = (0.5, 0.5, 0.5, 1)
        }
         
        SubShader
        {
                ZTest Always Cull Off ZWrite Off Fog { Mode Off }
                 
                Pass
                {
                        CGPROGRAM
                                #pragma vertex vert
                                #pragma fragment frag
                                #pragma fragmentoption ARB_precision_hint_fastest
                                #include "UnityCG.cginc"
                                 
                                struct v2f
                                {
                                        fixed4 pos : POSITION;
                                        fixed2 uv : TEXCOORD0;
                                        fixed4 lightScrPos : TEXCOORD3;
                                };

                                v2f vert (appdata_img v)
                                {
                                        v2f o;
                                        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                                        o.uv = v.texcoord.xy;
                                        o.lightScrPos = mul(UNITY_MATRIX_VP, normalize(_WorldSpaceLightPos0));
                                        return o;
                                }
                                   
                                uniform sampler2D _MainTex;
                                uniform sampler2D _LensTex;
                                uniform fixed4 _Color;

                                fixed4 frag (v2f i) : COLOR
                                {
                                        fixed4 orgCol = tex2D(_MainTex, i.uv);         
                                        fixed4 lens = tex2D(_LensTex, i.uv + i.lightScrPos); //тут дорабатывать конечно надо будет, но для демонстрации моей идеи думаю достаточно =)
                       
                        return (orgCol + lens) * _Color;
                                }
                        ENDCG
                }
        }
        FallBack "Diffuse"
}


Вот такая вот хрень у меня получилась =(

Синтаксис:
Используется csharp
o.lightScrPos = mul(UNITY_MATRIX_VP, normalize(_WorldSpaceLightPos0));
этот момент, в моем понимании очень странно себя ведет, по идее если измененить field of view, то текстура также должна менять свое положение на экране за счет искажения перспективы, но этого не происходит ~x(

В общем я явно чего-то не правильно понимаю, пролейте свет пожалуйста \m/
Zombie: Whispers Of The Dead
StarHunter: Beyond the darkness

Вконтахт
Мой канал на ютубе
Мой твиттер - да, английский хромает и только это может меня заставить наконец нормально его выучить!
Аватара пользователя
DrSpritz
UNIт
 
Сообщения: 67
Зарегистрирован: 20 авг 2013, 08:44
Откуда: Краснодар

Re: Получить screenspace координаты по мировым (vertex/fragment)

Сообщение DrSpritz 13 июл 2015, 12:29

Перенёс расчёт позиции на экрне на сторону моно, не знаю даже, насколько это правильно. В принципе, нет необходимости вычислять эти данные в вершинном или фрагментном шейдере, достаточно производить их один раз в кадр.
Zombie: Whispers Of The Dead
StarHunter: Beyond the darkness

Вконтахт
Мой канал на ютубе
Мой твиттер - да, английский хромает и только это может меня заставить наконец нормально его выучить!
Аватара пользователя
DrSpritz
UNIт
 
Сообщения: 67
Зарегистрирован: 20 авг 2013, 08:44
Откуда: Краснодар


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

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

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