一个unity中URP的环境下旋转天空盒的脚本(RotationSky)

今天做了一个天空盒的shader:

首先,我需要可调整的参数有:一张HDR Cubemap的贴图(绑定天空盒的 Cubemap),一个可调节的颜色(整体颜色调节(像给天空加一层颜色滤镜)),能够控制曝光(控制渲染出来的亮度。),开始的角度(基础旋转角度(手动设置的静态旋转)。),运根据时间自动旋转(天空盒每秒旋转多少度。负数代表逆时针。)Subshader标签Tag(说明是最底层的渲染背景)。关闭深度和不剔除任何面(Zwrite off。Cull Off)。。顶点着色器的输入(只需要顶点的位置)输出(屏幕坐标和传给Cubmap的方向)片元着色器的输入输出。这里对应的曝光度和HDR天空盒的解码,以及颜色曝光等的算法逻辑都需要写进去。一个简单的天空球可以跟随时间转动的

shader就可以了。这个是根据unity自带的天空球基础上添加了旋转。在片元着色器中有计算的逻辑。

具体脚本如下:

csharp 复制代码
Shader "Skybox/Cubemap Rotating" {
Properties {
 _Tint ("Tint Color", Color) = (0.500000,0.500000,0.500000,0.500000)
[Gamma]  _Exposure ("Exposure", Range(0.000000,8.000000)) = 1.000000
 _Rotation ("Rotation", Range(0.000000,360.000000)) = 0.000000
 _SpeedRotation ("Speed Rotation", Range(-10.000000,10.000000)) = 0.000000
[NoScaleOffset]  _Tex ("Cubemap   (HDR)", CUBE) = "grey" { }
}
SubShader { 
 Tags { "QUEUE"="Background" "RenderType"="Background" "PreviewType"="Skybox" }
 Pass {
  Tags { "QUEUE"="Background" "RenderType"="Background" "PreviewType"="Skybox" }
  ZWrite Off
  Cull Off
  
  CGPROGRAM
  #pragma vertex vert
  #pragma fragment frag
  #include "UnityCG.cginc"
  
  samplerCUBE _Tex;
  half4 _Tex_HDR;
  half4 _Tint;
  half _Exposure;
  float _Rotation;
  float _SpeedRotation;
  
  struct appdata {
    float4 vertex : POSITION;
  };
  
  struct v2f {
    float4 pos : SV_POSITION;
    float3 texcoord : TEXCOORD0;
  };
  
  v2f vert (appdata v) {
    v2f o;
    o.pos = UnityObjectToClipPos(v.vertex);
    
    // 计算总旋转角度:基础旋转 + 随时间变化的旋转
    float totalRotation = _Rotation + _SpeedRotation * _Time.y;
    totalRotation = radians(totalRotation); // 转换为弧度
    
    // 创建旋转矩阵(绕Y轴旋转)
    float sinRot, cosRot;
    sincos(totalRotation, sinRot, cosRot);
    
    // 应用旋转到纹理坐标
    float3 rotatedCoord;
    rotatedCoord.x = v.vertex.x * cosRot - v.vertex.z * sinRot;
    rotatedCoord.z = v.vertex.x * sinRot + v.vertex.z * cosRot;
    rotatedCoord.y = v.vertex.y;
    
    o.texcoord = rotatedCoord;
    return o;
  }
  
  half4 frag (v2f i) : SV_Target {
    half4 tex = texCUBE(_Tex, i.texcoord);
    half3 c = DecodeHDR(tex, _Tex_HDR);
    c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb;
    c *= _Exposure;
    return half4(c, 1);
  }
  ENDCG
 }
}
Fallback Off
}
相关推荐
恣逍信点1 天前
《凌微经》价值论:变化即本体,价值即涌现
人工智能·科技·程序人生·蓝桥杯·业界资讯·交友·哲学
梁辰兴1 天前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
库玛西1 天前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
AC赳赳老秦1 天前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
liulilittle1 天前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
还不秃顶的计科生1 天前
具身智能论文学习8:Octo: An Open-Source Generalist Robot Policy
人工智能·深度学习·学习·机器学习·语言模型·vla·vlm
灯澜忆梦1 天前
【MySQL18】进阶篇 | MySQL管理
数据库·mysql
朋克洛德的码农1 天前
Go并发-sync包四剑客:Mutex、RWMutex、WaitGroup、Once-从入门到原理
开发语言·后端·golang
woshihuanglaoshi1 天前
事务加持防超卖:ArkTS 在鸿蒙里玩转 TRANSACTION 出入库
学习·华为·harmonyos
世人万千丶1 天前
去重插入与超限淘汰:ArkTS 实现鸿蒙搜索历史的 LIMIT 艺术
运维·服务器·学习·华为·harmonyos·鸿蒙