在全景图(一):使用Unity完成水晶球纹理贴图 建立的工程基础之上,做修改。
步骤:
1、把上次创建好的水晶球移走,放到一个不妨碍观察的地方。
2、创建一个圆柱体,位置设为(0,1.5,0),比例设为(2,0,5,2)。
注:比例的设置和作为纹理映射的图像的宽高比有关,Unity中默认的圆柱体是2个单位高度以及1个单位宽度。
3、在圆柱体的Inspector面板中禁用Capsule Collider组件。
4、将图片作为纹理,拖到圆柱体上。
5、在圆柱体的Inspector面板中,第4步导入的纹理材质组件上,点击菜单Shader|Custom|InwardShader。
注:这个渲染器就是让纹理渲染在其内表面,需要自己定制,写入一个渲染定义文件。这个文件在后面给出。
6、将绑定相机的空对象放置在圆柱体内,并旋转圆柱体观察不同方向视野。
渲染器定义文件
InwardShader.shader:
Shader "Custom/InwardShader" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Cull Front
CGPROGRAM
#pragma surface surf Standard vertex:vert
void vert(inout appdata_full v) {
v.normal.xyz = v.normal * -1;
}
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
}
ENDCG
}
FallBack "Diffuse"
}
Unity shader是一个文本脚本文件,包含一些Unity渲染流水线动作的指令。我们自定义的shader命名为InwardShader。
它有一个Property面板—Albedo纹理可以在Unity的编辑器中设置。
我们把Cull模式设置成Font(选项有Back,Font和Off);单词cull的意思是“需要被移除或忽略”。这样,它将忽略前方表面的渲染。
我们还要反转每个面的法向量(v.normal.xyz=v.normal*-1)用于光照计算。
surf()采样函数由Unity的渲染器调用,应用shader中定义的属性,在这里是仅有的主要纹理图片。
给圆柱体添加旋转脚本
跟上个博客中水晶球添加旋转控制如出一辙,旋转脚本是一样的。
准备好的作为纹理的图像
全景效果
其它示例
注:提供的图像并未覆盖360°,所以圆柱体表面有一条纵线。