当前位置: 首页 > news >正文

《Unity Shader》13.3.3 实现

(1)(2)

把 Scene_12_6另存为 Scene_13_3

(3)

(4)(5)(6)

https://github.com/candycat1992/Unity_Shaders_Book/blob/master/Assets/Scripts/Chapter13/FogWithDepthTexture.cs

using UnityEngine; using System.Collections; public class FogWithDepthTexture : PostEffectsBase { public Shader fogShader; public Material fogMaterial = null; public Material material { get { fogMaterial = CheckShaderAndCreateMaterial(fogShader, fogMaterial); return fogMaterial; } } private Camera myCamera; public Camera camera { get { if (myCamera == null) { myCamera = GetComponent<Camera>(); } return myCamera; } } private Transform myCameraTransform; public Transform cameraTransform { get { if (myCameraTransform == null ) { myCameraTransform = camera.transform; } return myCameraTransform; } } [Range(0.0f, 3.0f)] public float fogDensity = 1.0f; //控制雾的浓度 public Color fogColor = Color.white; //控制雾的颜色 public float fogStart = 0.0f; //控制雾效的起始高度 public float fogEnd = 2.0f; //控制雾效的终止高度 void OnEnable() { camera.depthTextureMode |= DepthTextureMode.Depth; } //获取摄像机的深度纹理 void OnRenderImage (RenderTexture src, RenderTexture dest) { if (material != null) { Matrix4x4 frustumCorners = Matrix4x4.identity; float fov = camera.fieldOfView; float near = camera.nearClipPlane; float aspect = camera.aspect; float halfHeight = near * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad); Vector3 toRight = cameraTransform.right * halfHeight * aspect; Vector3 toTop = cameraTransform.up * halfHeight; Vector3 topLeft = cameraTransform.forward * near + toTop - toRight; float scale = topLeft.magnitude / near; topLeft.Normalize(); topLeft *= scale; Vector3 topRight = cameraTransform.forward * near + toRight + toTop; topRight.Normalize(); topRight *= scale; Vector3 bottomLeft = cameraTransform.forward * near - toTop - toRight; bottomLeft.Normalize(); bottomLeft *= scale; Vector3 bottomRight = cameraTransform.forward * near + toRight - toTop; bottomRight.Normalize(); bottomRight *= scale; frustumCorners.SetRow(0, bottomLeft); frustumCorners.SetRow(1, bottomRight); frustumCorners.SetRow(2, topRight); frustumCorners.SetRow(3, topLeft); material.SetMatrix("_FrustumCornersRay", frustumCorners); material.SetFloat("_FogDensity", fogDensity); material.SetColor("_FogColor", fogColor); material.SetFloat("_FogStart", fogStart); material.SetFloat("_FogEnd", fogEnd); Graphics.Blit (src, dest, material); } else { Graphics.Blit(src, dest); } } }

Shader "Custom/Chapter13-FogWithDepthTexture" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _FogDensity ("Fog Density", Float) = 1.0 _FogColor ("Fog Color", Color) = (1, 1, 1, 1) _FogStart ("Fog Start", Float) = 0.0 _FogEnd ("Fog End", Float) = 1.0 } SubShader { CGINCLUDE #include "UnityCG.cginc" float4x4 _FrustumCornersRay; sampler2D _MainTex; half4 _MainTex_TexelSize; sampler2D _CameraDepthTexture; half _FogDensity; fixed4 _FogColor; float _FogStart; float _FogEnd; struct v2f { float4 pos : SV_POSITION; half2 uv : TEXCOORD0; half2 uv_depth : TEXCOORD1; float4 interpolatedRay : TEXCOORD2; }; v2f vert(appdata_img v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord; o.uv_depth = v.texcoord; #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) o.uv_depth.y = 1 - o.uv_depth.y; #endif int index = 0; if (v.texcoord.x < 0.5 && v.texcoord.y < 0.5) { index = 0; } else if (v.texcoord.x > 0.5 && v.texcoord.y < 0.5) { index = 1; } else if (v.texcoord.x > 0.5 && v.texcoord.y > 0.5) { index = 2; } else { index = 3; } #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) index = 3 - index; #endif o.interpolatedRay = _FrustumCornersRay[index]; return o; } fixed4 frag(v2f i) : SV_Target { float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth)); float3 worldPos = _WorldSpaceCameraPos + linearDepth * i.interpolatedRay.xyz; float fogDensity = (_FogEnd - worldPos.y) / (_FogEnd - _FogStart); fogDensity = saturate(fogDensity * _FogDensity); fixed4 finalColor = tex2D(_MainTex, i.uv); finalColor.rgb = lerp(finalColor.rgb, _FogColor.rgb, fogDensity); return finalColor; } ENDCG Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } } FallBack Off }

(7)

《Unity Shader》13.3 雾效

http://www.jsqmd.com/news/319144/

相关文章:

  • record5
  • 告别复杂配置!GPEN镜像一键启动人像修复体验
  • JCMD工具使用
  • 《Unity Shader》13.4 再谈边缘检测
  • 灵衢互联社区筹备工作会议顺利召开,多方聚力共建繁荣生态
  • 用Ollama Launch连接AI编码代理
  • 2025新质生产力示范案例发布,华为云CloudMatrix AI Infra荣获人工智能TOP案例
  • WindowServer 2016激活
  • Clawdbot+Ollama:真正隐私
  • 动态SQL实现模糊查询
  • Arch Linux上使用VSCode + STM32CubeMX + stlink + CMake + Cortex-Debug + gcc配置stm32开发环境
  • 从龟速到光速:SQL优化与索引的实战心法
  • Java计算机毕设之基于springboo的小区车辆管理系统车位信息、临时车辆信息、IC卡管理(完整前后端代码+说明文档+LW,调试定制等)
  • Java计算机毕设之基于springboo的大学生社团活动平台基于springboo+vue的学生活动组织管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • libmodbus 源码分析(发送请求篇)
  • 【毕业设计】基于springboo的大学生社团活动平台(源码+文档+远程调试,全bao定制等)
  • 小程序计算机毕设之基于springboot的4S店试驾平台小程序汽车销售系统(完整前后端代码+说明文档+LW,调试定制等)
  • 从零基础到精通漏洞挖掘,流程指南超详整理,这一篇收藏就够用
  • 补剂 男性 维生素
  • 【毕业设计】基于springboot的4S店试驾平台小程序(源码+文档+远程调试,全bao定制等)
  • JS判断左右Shift Ctrl Alt
  • 为什么有的 Android 架构图是 4 层,有的却是 5 层?
  • React19 渲染流程
  • GIT中分支合并的方法
  • 作为AI应用架构师,我每天都在用的8个核心技能
  • Gemini3ProImage(nano banana 2 )异步调用接口(API)生成图片
  • P1114 “非常男女”计划
  • 键盘按键测试
  • 在计算属性中获取 Vuex 状态是标准做法(附:Vue 3 计算属性详解及和 watch 对比)
  • VSCode如何使用claude code(VS Code + Claude API 详细教程)(API 配置图文全攻略)