自由旋转天空盒-- Rotate skybox XYZ
最近写独立游戏,需要旋转天空盒。有两种办法:
方法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相关推荐
- 天空盒(Skybox)
天空盒(Skybox) 示例 HTML CSS JS 更多有趣示例 尽在 知屋安砖社区 示例 HTML .p-summaryh1 three.js Instancing & SkyBoxpa( ...
- Unity基础(10)—— 修改场景的天空盒(Skybox)
将Unity场景的背景由默认的状态修改成蓝天白云的状态.要达到这种目的就需要修改 Skybox . 未修改之前的天空盒如下所示: 修改步骤如下: 在修改之前先将自己需要的天空材质导入到 Assets ...
- three 天空球_three.js添加场景背景和天空盒(skybox)
本文我们介绍在three.js中如何给3D场景添加背景,我们有3种方式来实现这个目的.通过html添加背景元素,这实际上一个2D背景: 在three.js加载图片并设置为scene.backgroun ...
- 【Unity Shader】用Cubemap实现天空盒和环境映射
1 关于Cubemap Cubemap在实时渲染中有很多应用,最常见的就是实现天空盒(Skybox)和环境映射(Environment Mapping). 2 实现天空盒 2.1 实现原理 天空盒不陌 ...
- 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 ...
- 3D游戏设计-天空盒
天空盒(skybox) 打开Asset Store,搜索skybox,下载想要的资源. 在Unity中导入并加载场景. 运行 总结游戏对象的使用 常见游戏对象:空对象,摄像机,光线,天空盒,地形,3D ...
- 定向光和天空盒(个人笔记)
定向光和天空盒 光照设计:识别场景所需的光源是照明设计和实施的关键初始步骤. 一般游戏设计中最常使用的四种光照: 自然采光: 通常是太阳或月亮. 动态照明: 模仿场景中特定的真实光源--例如路灯或汽车 ...
- Unity灯光的一些设置(二)天空盒创建更换与Lighting面板的介绍
本节课主要讲天空盒创建更换与Lighting面板. 一.天空盒(SkyBox)是什么? 天空盒可以看做是一个内部着色的大的正方体,包裹着整个场景.属于Untiy中material. 二.创建Skybo ...
- 第十章 DirectX 绘制简单场景,地形,天空盒和跟随摄像机(下)
上个文章里面,我们分别控制胶囊体和摄像机确实比较麻烦,接下来,我将创建一个可以自由移动的模型对象,然后让摄像机跟随其移动和旋转.我们使用VS2019来新建一个项目"D3D_10_Follow ...
最新文章
- bigdecimal为0 xml不走_爱情不能够接受谎言的星座,天蝎座容忍度为0,发现将失去彼此...
- clion 格式化代码 设置空行 最多保留一行
- 【译文】AppBarLayout的越界滚动行为
- mysql中出现 xC4 xDD_mysql数据库调优总结(二)
- SATA硬盘如何使用GHOSTSATA硬盘如何使用GHOST
- android 高清壁纸设置慢
- [转]C#委托的异步调用
- java程序语言228_2019年Java面试题基础系列228道(5)
- 数字化营销如何打造全链路数据统计解决方案
- Himawari8注册后发来信息下载数据
- 虎年用Python画一只老虎?
- 尚硅谷MySQL基础学习笔记
- 将 打包为 物理机 虚拟机镜像_(完整版)十个步骤将操作系统从物理机迁移到虚拟机...
- 电气绘图软件EPLAN在WIN10详细安装教程
- Linux下Mysql 5.7的安装及远程连接配置
- Suspicious method call; should probably call draw rather than onDraw
- PC - 解决 Logitech G HUB 无法开机启动
- openssh8.6默认不支持公钥ssh(gogs无法使用)
- 【渗透测试笔记】之【内网渗透——Windows系统散列值获取与防范】
- MVC模式计算两个正数的代数平均值与几何平均值
热门文章
- 「微信同声传译」小程序插件:快速实现语音转文字、文本翻译、语音合成等能力...
- excel中用Index函数取出数组中任意一个位置的值
- AWVS_扫描报告分析
- 蓝桥杯单片机学习11——PCF8591A/DD/A转换芯片
- C语言快速排序(郝斌老师笔记)
- 示例数据库 AdventureWorks 安装步骤
- 220V转变12V电源IC
- Docker 问题集锦(16) - ERROR: for * Cannot start service *: Could not attach to network
- Unity3D里实现可以朝向另一目标广告牌(billboard)效果
- Shortest Prefixes(字典树)