自己写个简单的天空盒子

来源:互联网 发布:电脑数据删除怎么恢复 编辑:程序博客网 时间:2024/04/27 10:50

天空盒子制作

准备:unity 5.4.1,天空盒子纹理贴图(6张或者3张都行,看你要什么样的天空盒子)

1.project视图右键->Create ->legacy->CubeMap.再把天空盒子纹理贴图按名字选好。纹理贴图分辨率和天空盒子的face size都统一设置为256即可。

2.创建材质球命名SkyBoxMat和新建相应的shader:SkyBox

Shader "LT/SkyBox"
{
    Properties
    {
        _Cubemap("Reflect Cubemap",Cube) = "white"{}            //模拟反射的环境映射纹理
    }
    SubShader
    {
        Tags { 
                "RenderType"="Opaque"     //着色器分类不透明
                "Queue"="Geometry"    //不透明物体
                "ForceNoShadowCasting"="True"   //表示不产生阴影
                "IgnoreProjector"="True"   //表示不接受阴影
                "LightMode"="Always" //永远都渲染,但不处理光照
            }
        Pass
        {
              Fog {Mode Off}   //关闭雾模式

            cull front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0 //定义Shader模型为Shader Model 3.0, 3.0, Direct3D 9。支持512张贴图 + 512个计算

            //用低精度,最快的
            #pragma fragmentoption ARB_precision_hint_fastest
            #pragma exclude_renderers  flash    //不在flash 平台编译

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"   //天空盒子
            

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float3 cam : TEXCOORD0;
            };

            samplerCUBE _Cubemap;
                        
            v2f vert (appdata v)
            {
                v2f o;
                float3 worldVertex = mul(unity_ObjectToWorld,v.vertex);
                                //物体反射到计算机中的方向可由光路可逆的原则求的,也就是说通过计算视角方向关于法线的反射方向来求得入射光的方向
                //worldViewDir为世界坐标系下的视角方向,既视角(相机)到顶点的方向
                //reflect要求入射向量是由光源指向交点处worldViewDir得先取反
                o.cam =-UnityWorldSpaceViewDir(worldVertex);
 

               // o.cam = worldVertex- _WorldSpaceCameraPos; //与上面这句等价
                
o.pos = UnityObjectToClipPos(v.vertex);            
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = texCUBE(_Cubemap, i.cam);
                return col;
            }
            ENDCG
        }
    }
}

 

 

1 0
原创粉丝点击