Искажение текстур при нестандартной проекции

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

Искажение текстур при нестандартной проекции

Сообщение waruiyume 20 сен 2019, 14:32

Здравствуйте! Пытался написать шейдер который использует не стандартную MVP матрицу, а нечто вроде цилиндрической проекции. Почти получилось, вертексы смещаются куда надо, но текстуры, вблизи, дико коробит.
Подскажите пожалуйста, как исправить искажения текстуры.
Изображение
Синтаксис:
Используется glsl
Shader "Unlit/CylProj"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Fov ("Fov", float) = 45
        _FarClip ("FarClip", float) = 100
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Cull Front


            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Fov;
            float _FarClip;

            v2f vert (appdata v)
            {
                v2f o;

                float4 worldPos = mul(unity_ObjectToWorld, v.vertex);

                float distXZ = length(worldPos.xz);

                float angleY = atan2(worldPos.z, worldPos.x);
                angleY/=UNITY_TWO_PI;
                worldPos.x = angleY;

                worldPos.z = distXZ;
                worldPos.z /= _FarClip;
                worldPos.z = 0.5-worldPos.z/2;

                // worldPos.y/=10;
                // worldPos.y *= -1;

                worldPos.y/=(distXZ/_FarClip)*_FarClip*2 * tan(radians(_Fov/2));
                worldPos.y*=-1;

                worldPos.xyz/=0.5;        

                o.vertex = worldPos;

                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 uv = i.uv;
                fixed4 col = tex2D(_MainTex, uv);
                               
                return col;
            }
            ENDCG
        }
    }
}

 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Искажение текстур при нестандартной проекции

Сообщение jetyb 30 сен 2019, 07:51

А если так
Синтаксис:
Используется csharp
  struct v2f {
        float4 pos : POSITION;
        noperspective float2 uv : TEXCOORD0;
 };
 

Подозреваю это действует компенсация перспективного преобразования для барицентрических координат.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Искажение текстур при нестандартной проекции

Сообщение waruiyume 30 сен 2019, 10:31

Ничего не изменилось. Всё равно спасибо за ответ)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Искажение текстур при нестандартной проекции

Сообщение jetyb 30 сен 2019, 12:49

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

А проще всего передать worldPos в пиксельный шейдер и считать uv координаты попиксельно.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21


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

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

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