Как добавить мозаику и прозрачность в этот шейдер? - PullRequest
0 голосов
/ 12 сентября 2018

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

Так что в основном я использовал шейдер ниже, чтобы отобразить 360 видео на сфере.Он переворачивает нормали и отображает их изнутри.

Однако я хотел бы добавить к нему альфа-значение, чтобы сделать сферу (и, следовательно, видео) настолько прозрачной, насколько мне нужно.,Что я должен изменить?

Shader "Custom/Equirectangular" {
 Properties {
     _Color ("Main Color", Color) = (1,1,1,1)
     _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "gray" {}
 }
 SubShader{
     Pass {
         Tags {"LightMode" = "Always"}
         Cull Front
         CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #pragma fragmentoption ARB_precision_hint_fastest
             #pragma glsl
             #pragma target 3.0
             #include "UnityCG.cginc"
             struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
             };
             struct v2f
             {
                 float4    pos : SV_POSITION;
                 float3    normal : TEXCOORD0;
             };
             v2f vert (appdata v)
             {
                 v2f o;
                 o.pos = UnityObjectToClipPos(v.vertex);
                 o.normal = v.normal;
                 return o;
             }
             sampler2D _MainTex;
             #define PI 3.141592653589793
             inline float2 RadialCoords(float3 a_coords)
             {
                 float3 a_coords_n = normalize(a_coords);
                 float lon = atan2(a_coords_n.z, a_coords_n.x);
                 float lat = acos(a_coords_n.y);
                 float2 sphereCoords = float2(lon, lat) * (1.0 / PI);
                 return float2(1 - (sphereCoords.x * 0.5 + 0.5), 1 - sphereCoords.y);
             }
             float4 frag(v2f IN) : COLOR
             {
                 float2 equiUV = RadialCoords(IN.normal);
                 return tex2D(_MainTex, equiUV);
             }
         ENDCG
     }
 }
 FallBack "VertexLit"
}

EDIT Я также заметил, что на этом шейдере не работает наложение текстуры и смещение.Есть идеи, как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы забыли смешивание для прозрачности.И лучше предоставить соответствующие теги шейдеров.

Tags { "LightMode"="Always" "Queue"="Transparent" "RenderType"="Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Front
0 голосов
/ 12 сентября 2018

Короткая история: это будет действительно сложно

Не шейдер, шейдер легкий. Все, что вам нужно сделать, это изменить эту строку:

return tex2D(_MainTex, equiUV);

Длинная история:

Или: что изменить в этой строке в.

Форматы видео по своей природе не содержат альфа-канала. Вам будет сложно найти подходящее решение (я кратко рассмотрел это в 2015 году, когда проводил «собеседование» на предмет «работы», где им нужно что-то подобное).

Как только вы поймете, как вы собираетесь кодировать альфа, вы можете изменить шейдер, чтобы искать эти данные и преобразовывать их в альфа-значение, и все готово.

Я думаю, что место, в котором я «проводил собеседование», делало это, разделяя видео на верхнюю и нижнюю части, верхняя половина была просто альфа-каналом (черный / белый), а нижняя половина была цветными данными. Плеер будет разделять видео по горизонтали и обрабатывать две половины по-разному. Мне не пришлось возиться с этим, они уже сделали это, поэтому я не уверен, как это было сделано программно, я могу только строить догадки.

...