shader实例(二十二)TexGen-球面贴图SphereMap

shader实例(二十二)TexGen-球面贴图SphereMap

http://blog.sina.com.cn/s/blog_89d90b7c0102vfqz.html

球面贴图一般用于环境反射,如下图(左边为球面贴图,右边为正常贴图),一个镜面水晶球在这只猫的前方,而这只猫也正看着这个水晶球,效果是这只大头猫的头变的更大了。shader实例(二十二)TexGen-球面贴图SphereMap


原理:

1.将顶点转换到摄像机空间

2.根据该顶点的摄像机【入射向量 I 】和【法线向量N】计算【反射向量R】

3.将【反射向量R】与【摄像机向量(0,0,1)】相加,计算出【过渡向量m】

4.求【过渡向量m】单位向量,再将值映射为uv的值域上,求得纹理坐标

如图:


基础知识:

求反射向量 http://www.cnblogs.com/graphics/archive/2013/02/21/2920627.html

 

代码和详细分析如下:


}

<span style="background-color: rgb(255, 255, 255);">Shader "Custom/球面贴图" {
   Properties {
        _Reflectivity ("Reflectivity", Range (0,1)) = 0.5
        _MainTex("Base", 2D) = "white"
        _Environment ("Environment", 2D) = "white"
    }
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _MainTex;
            sampler2D _Environment;
            float4 _MainTex_ST;
            float _Reflectivity;
            struct v2f {
                float4  pos : SV_POSITION; // 输出的坐标信息
                float2  uv : TEXCOORD0; // 输出的主材质纹理信息
                float2  uv2:TEXCOORD1; // 输出的球面纹理信息
            } ;
            
            // 求反射向量。这个底层有封装,拆开就是这样的
            float3 reflect(float3 I,float3 N)
            {
                return I - 2.0*N *dot(N,I);
            }
            
            float2 GetUV(float3 r)
            {
                // 开根号对过渡向量m求模(反射向量r+摄像机向量(0,0,1)为过渡向量m)
                float m = sqrt(r.x * r.x + r.y * r.y + (r.z + 1.0) * (r.z + 1.0)); 
                // 求过渡向量m的单位向量
                float3 n = float3(r.x / m, r.y / m, r.z / m);
                // 顶点值域为[-1,1],转为UV的值域[0,1]
                // 在边缘处UV信息也是更靠近图片里面,才形成镜面水晶球的效果吧
                return float2(0.5 * n.x + 0.5,0.5 * n.y + 0.5);
            }
  
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                
                // 将顶点信息转换到摄像机坐标
                float3 posEyeSpace = mul(UNITY_MATRIX_MV,v.vertex).xyz;
                // 获取摄像机的入射向量
                float3 I = posEyeSpace - float3(0,0,0);
                // 将顶点的法线向量转换到摄像机坐标
                float3 N = mul((float3x3)UNITY_MATRIX_MV,v.normal);
                // 求法线单位向量
                N = normalize(N);
                // 根据入射向量和法线向量求反射向量
                float3 R = reflect(I,N);
                // 根据反射向量获取最终的UV信息
                o.uv2 = GetUV(R);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 reflectiveColor = tex2D(_Environment,i.uv2);
                float4 decalColor = tex2D(_MainTex,i.uv);
                float4 outp = lerp(decalColor,reflectiveColor,_Reflectivity);
                return outp;
            }
            ENDCG
        }
    }</span>

posted @ 2016-07-13 17:36 00000000O 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Skybox图片是一种充满全景效果的图片,可以体现出360度环绕的视觉效果。如果你需要下载Skybox图片,可以通过多种不同的途径来获得。 首先,在网上搜索“Skybox图片下载”可以得到大量的结果,其中有些网站为用户提供免费的Skybox图片下载服务。这些网站通常会归类整理Skybox图片,用户可以在页面上浏览并选择自己需要的图片进行下载。 此外,一些商业网站和电商平台也提供Skybox图片下载服务。这些网站通常收费,用户需要先购买或订阅来获得下载权限。不同的网站可能提供不同种类的Skybox图片,如自然风光、动物、城市景观等等。 最后,如果你想要制作自己的Skybox图片,也可以通过使用专业的录制设备和软件来实现。通过将多张照片拼接起来,可以制作出具有全景效果的Skybox图片。 总之,Skybox图片下载可以通过多种途径来实现。用户可以选择免费的网站或者商业服务来获取自己需要的图片,也可以制作自己的Skybox图片来满足个性化需求。 ### 回答2: Skybox 是一种用于在游戏中呈现仿真天空的技术,通常使用一个球体或立方体菱形状的盒子来包围整个场景。其中最常用的是立方体贴图,也就是所谓的 Skybox 纹理。 如果想下载 Skybox 图片,可以通过以下几种方法实现: 1. 在网上搜索免费的 Skybox 纹理资源,有些网站提供了赞助商免费提供的 Skybox ,大多数免费的素材都是现成的 CubeMap 或者 SphereMap ,可以直接拿来使用。 2. 如果要获得更高品质的 Skybox ,可以在商业网站上购买,例如 unity3d 市场提供的 Skybox ,质量非常好,但对于一些开发者来说,价格可能比较高。 3. 自己制作,使用 Photoshop 等软件,将不同方向的照片合成立方体贴图,需要相对专业的技术处理。 总的来说,下载 Skybox 图片可以通过免费获取或购买获得高质量素材。自己制作可以确保独一无二的质量,但也需要付出精力成本。无论哪种方式,重要的是要根据实际需求选择合适的 Skybox 图片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值