虚线显示在光球的图像中

时间:2017-05-10 05:33:58

标签: c# unity3d shader 360-panorama photosphere

我创建了一个photosphere并在球体内添加了一个equirectangular着色器,然后我添加了图像。问题是("图像上显示的虚线如何解决?)you can see the dotted lines

there is distortion of the image

我使用的着色器的源代码是

Shader "Unlit/rect"{
Properties {

    _MainTex (" Base (RGB)", 2D) = "gray" {}
}

SubShader{
    Pass {
        Tags {"RenderType"="Opaque" }
     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 = mul(UNITY_MATRIX_MVP, 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(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"

}

2 个答案:

答案 0 :(得分:1)

可能是由于几个原因引起的。我头顶的两个是:

  1. Unity的导入设置降低了图片质量:在这种情况下,请在Project标签中选择Inspector取消选中Generate Mip-Maps中的图片,并确保导入解析在Inspector的底部设置为高于实际图像分辨率(例如图像为1480x1480,然后将导入设置设置为2048x2048)

  2. 您要映射图像的球体网格有UV问题。我的意思是,不同程序中的默认球体具有不同的UV贴图。 Unity的默认范围与Blender或Maya的范围不同。如果您在3D建模软件中测试了这个图像并且它在那里工作,那么导出THAT球体并在Unity中使用它来获取图像。

答案 1 :(得分:1)

此着色器可以很好地渲染图像,但图像会像镜像一样翻转。改变

float2 equiUV = RadialCoords(IN.normal); 

到:

float2 equiUV = RadialCoords(-IN.normal); 

将它翻转过来。我怎么能以另一种方式翻转呢?