最近写独立游戏,需要旋转天空盒。有两种办法:

方法A,通过shader传参数,旋转天空盒。

方法B,多相机,分层渲染。专门一个相机去渲染天空盒,然后旋转相机。

这里先讲方法1。方法2在URP下,最好是用相机堆栈(Camera Stack)处理,具体就不讲了。

步骤1:  更改原始的skybox shader

更改默认的天空盒shader,去官网下载对应的内置shader,然后更改如下(我做了标记,如果实在不清楚改哪行,可以用对比工具对比一下):

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "CCG/SkyBox_6_Sided" {
Properties {_Tint ("Tint Color", Color) = (.5, .5, .5, .5)[Gamma] _Exposure ("Exposure", Range(0, 8)) = 1.0_Rotation ("Rotation", Range(0, 360)) = 0_RotationAxis("Rotation axis", Vector) = (0, 1, 0)     // 新增一个属性, 可以设置绕哪个轴旋转[NoScaleOffset] _FrontTex ("Front [+Z]   (HDR)", 2D) = "grey" {}[NoScaleOffset] _BackTex ("Back [-Z]   (HDR)", 2D) = "grey" {}[NoScaleOffset] _LeftTex ("Left [+X]   (HDR)", 2D) = "grey" {}[NoScaleOffset] _RightTex ("Right [-X]   (HDR)", 2D) = "grey" {}[NoScaleOffset] _UpTex ("Up [+Y]   (HDR)", 2D) = "grey" {}[NoScaleOffset] _DownTex ("Down [-Y]   (HDR)", 2D) = "grey" {}
}SubShader {Tags { "Queue"="Background" "RenderType"="Background" "PreviewType"="Skybox" }Cull Off ZWrite OffCGINCLUDE#include "UnityCG.cginc"half4 _Tint;half _Exposure;float _Rotation;float3 _RotationAxis;float3 RotateAroundYInDegrees (float3 vertex, float degrees){float alpha = degrees * UNITY_PI / 180.0;float sina, cosa;sincos(alpha, sina, cosa);float2x2 m = float2x2(cosa, -sina, sina, cosa);return float3(mul(m, vertex.xz), vertex.y).xzy;}// 计算函数 float4x4 rotationMatrix(float3 axis, float angle){axis = normalize(axis);float s = sin(angle);float c = cos(angle);float oc = 1.0 - c;return float4x4(oc * axis.x * axis.x + c,           oc * axis.x * axis.y - axis.z * s,  oc * axis.z * axis.x + axis.y * s,  0.0,oc * axis.x * axis.y + axis.z * s,  oc * axis.y * axis.y + c,           oc * axis.y * axis.z - axis.x * s,  0.0,oc * axis.z * axis.x - axis.y * s,  oc * axis.y * axis.z + axis.x * s,  oc * axis.z * axis.z + c,           0.0,0.0,  0.0,  0.0, 1.0);}struct appdata_t {float4 vertex : POSITION;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f {float4 vertex : SV_POSITION;float2 texcoord : TEXCOORD0;UNITY_VERTEX_OUTPUT_STEREO};v2f vert (appdata_t v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);//float3 rotated = RotateAroundYInDegrees(v.vertex, _Rotation);// 重新计算rotatedfloat3 rotated = mul( rotationMatrix( normalize(_RotationAxis.xyz), _Rotation * UNITY_PI / 180.0), v.vertex).xyz; o.vertex = UnityObjectToClipPos(rotated);o.texcoord = v.texcoord;return o;}half4 skybox_frag (v2f i, sampler2D smp, half4 smpDecode){half4 tex = tex2D (smp, i.texcoord);half3 c = DecodeHDR (tex, smpDecode);c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb;c *= _Exposure;return half4(c, 1);}ENDCGPass {CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _FrontTex;half4 _FrontTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_FrontTex, _FrontTex_HDR); }ENDCG}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _BackTex;half4 _BackTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_BackTex, _BackTex_HDR); }ENDCG}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _LeftTex;half4 _LeftTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_LeftTex, _LeftTex_HDR); }ENDCG}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _RightTex;half4 _RightTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_RightTex, _RightTex_HDR); }ENDCG}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _UpTex;half4 _UpTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_UpTex, _UpTex_HDR); }ENDCG}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0sampler2D _DownTex;half4 _DownTex_HDR;half4 frag (v2f i) : SV_Target { return skybox_frag(i,_DownTex, _DownTex_HDR); }ENDCG}
}
}

步骤2: 新建一个材质球,用刚写的shader。

并且把天空盒的6张图对应放好。

 步骤3:在灯光设置里,更改天空盒

步骤4: 写脚本,功能是旋转天空盒。

如下,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RotateSkyBox : MonoBehaviour
{// 设置旋转速度public float RotateSpeed = 10.2f;// 设置绕哪个轴旋转 public Vector3 skyAxis = new Vector3(1, 0, 0);// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 注意对应是新写的这个shader, 传入轴向RenderSettings.skybox.SetVector("_RotationAxis", skyAxis);// 设置旋转的数值RenderSettings.skybox.SetFloat("_Rotation", Time.time*RotateSpeed);}}

步骤5:脚本挂载到摄像机上,运行

附注:shader代码参考:https://gist.github.com/sergiobd/c786b594d7f5d8826d68f36f3a80f65e

自由旋转天空盒-- Rotate skybox XYZ相关推荐

  1. 天空盒(Skybox)

    天空盒(Skybox) 示例 HTML CSS JS 更多有趣示例 尽在 知屋安砖社区 示例 HTML .p-summaryh1 three.js Instancing & SkyBoxpa( ...

  2. Unity基础(10)—— 修改场景的天空盒(Skybox)

    将Unity场景的背景由默认的状态修改成蓝天白云的状态.要达到这种目的就需要修改 Skybox . 未修改之前的天空盒如下所示: 修改步骤如下: 在修改之前先将自己需要的天空材质导入到 Assets ...

  3. three 天空球_three.js添加场景背景和天空盒(skybox)

    本文我们介绍在three.js中如何给3D场景添加背景,我们有3种方式来实现这个目的.通过html添加背景元素,这实际上一个2D背景: 在three.js加载图片并设置为scene.backgroun ...

  4. 【Unity Shader】用Cubemap实现天空盒和环境映射

    1 关于Cubemap Cubemap在实时渲染中有很多应用,最常见的就是实现天空盒(Skybox)和环境映射(Environment Mapping). 2 实现天空盒 2.1 实现原理 天空盒不陌 ...

  5. Cube Map 系列之:手把手教你 实现天空盒(Sky Box)

    什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to lo ...

  6. 3D游戏设计-天空盒

    天空盒(skybox) 打开Asset Store,搜索skybox,下载想要的资源. 在Unity中导入并加载场景. 运行 总结游戏对象的使用 常见游戏对象:空对象,摄像机,光线,天空盒,地形,3D ...

  7. 定向光和天空盒(个人笔记)

    定向光和天空盒 光照设计:识别场景所需的光源是照明设计和实施的关键初始步骤. 一般游戏设计中最常使用的四种光照: 自然采光: 通常是太阳或月亮. 动态照明: 模仿场景中特定的真实光源--例如路灯或汽车 ...

  8. Unity灯光的一些设置(二)天空盒创建更换与Lighting面板的介绍

    本节课主要讲天空盒创建更换与Lighting面板. 一.天空盒(SkyBox)是什么? 天空盒可以看做是一个内部着色的大的正方体,包裹着整个场景.属于Untiy中material. 二.创建Skybo ...

  9. 第十章 DirectX 绘制简单场景,地形,天空盒和跟随摄像机(下)

    上个文章里面,我们分别控制胶囊体和摄像机确实比较麻烦,接下来,我将创建一个可以自由移动的模型对象,然后让摄像机跟随其移动和旋转.我们使用VS2019来新建一个项目"D3D_10_Follow ...

最新文章

  1. bigdecimal为0 xml不走_爱情不能够接受谎言的星座,天蝎座容忍度为0,发现将失去彼此...
  2. clion 格式化代码 设置空行 最多保留一行
  3. 【译文】AppBarLayout的越界滚动行为
  4. mysql中出现 xC4 xDD_mysql数据库调优总结(二)
  5. SATA硬盘如何使用GHOSTSATA硬盘如何使用GHOST
  6. android 高清壁纸设置慢
  7. [转]C#委托的异步调用
  8. java程序语言228_2019年Java面试题基础系列228道(5)
  9. 数字化营销如何打造全链路数据统计解决方案
  10. Himawari8注册后发来信息下载数据
  11. 虎年用Python画一只老虎?
  12. 尚硅谷MySQL基础学习笔记
  13. 将 打包为 物理机 虚拟机镜像_(完整版)十个步骤将操作系统从物理机迁移到虚拟机...
  14. 电气绘图软件EPLAN在WIN10详细安装教程
  15. Linux下Mysql 5.7的安装及远程连接配置
  16. Suspicious method call; should probably call draw rather than onDraw
  17. PC - 解决 Logitech G HUB 无法开机启动
  18. openssh8.6默认不支持公钥ssh(gogs无法使用)
  19. 【渗透测试笔记】之【内网渗透——Windows系统散列值获取与防范】
  20. MVC模式计算两个正数的代数平均值与几何平均值

热门文章

  1. 「微信同声传译」小程序插件:快速实现语音转文字、文本翻译、语音合成等能力...
  2. excel中用Index函数取出数组中任意一个位置的值
  3. AWVS_扫描报告分析
  4. 蓝桥杯单片机学习11——PCF8591A/DD/A转换芯片
  5. C语言快速排序(郝斌老师笔记)
  6. 示例数据库 AdventureWorks 安装步骤
  7. 220V转变12V电源IC
  8. Docker 问题集锦(16) - ERROR: for * Cannot start service *: Could not attach to network
  9. Unity3D里实现可以朝向另一目标广告牌(billboard)效果
  10. Shortest Prefixes(字典树)