一、天空盒

使用立方体贴图最直接的目的就是展现天空盒,或者更进一步用于实现环境映射(反射与折射)

关于立方体贴图的采样原理:https://blog.csdn.net/Jaihk662/article/details/107379399

Unity 中天空盒的设置:

一样可以对于不同的摄像机使用不同的天空盒:

二、简单的反射实现

关于反射和折射的原理:https://blog.csdn.net/Jaihk662/article/details/107491144

代码和效果:

Shader "Jaihk662/Reflection1"
{Properties{_DiffuseColor ("DiffuseColor", Color) = (1, 1, 1, 1)_ReflectColor ("ReflectColor", Color) = (1, 1, 1, 1)_ReflectAmount ("ReflectAmount", Range(0, 1)) = 1_Cubemap ("ReflectionCubemap", Cube) = "_Skybox" {}}SubShader{LOD 200PASS {Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert             //声明顶点着色器的函数#pragma fragment frag           //声明片段着色器的函数#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;fixed4 _ReflectColor;float _ReflectAmount;samplerCUBE _Cubemap;struct _2vert {float4 vertex: POSITION;float3 normal: NORMAL;float4 texcoord: TEXCOORD0;};struct vert2frag {float4 pos: SV_POSITION;float3 wPos: TEXCOORD0;float3 wNormal: TEXCOORD1;float3 wViewDir: TEXCOORD2;float3 wReflect: TEXCOORD3;};vert2frag vert(_2vert v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.wNormal = normalize(UnityObjectToWorldNormal(v.normal));o.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.wViewDir = normalize(UnityWorldSpaceViewDir(o.wPos));o.wReflect = reflect(-o.wViewDir, o.wNormal);           //在片段着色器中计算反射向量,性能优先return o;}fixed4 frag(vert2frag i): SV_Target {fixed3 wLightDir = normalize(UnityWorldSpaceLightDir(i.wPos));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _DiffuseColor.rgb * (0.5 * dot(i.wNormal, wLightDir) + 0.5);            fixed3 reflection = texCUBE(_Cubemap, i.wReflect).rgb * _ReflectColor.rgb;return fixed4(ambient + lerp(diffuse, reflection, _ReflectAmount), 1.0); } ENDCG}}FallBack "Specular"
}

这种反射属于假反射,只能反射天空盒,不能反射其它物体

三、简单的折射效果

代码和效果:

Shader "Jaihk662/Refraction1"
{Properties{_DiffuseColor ("DiffuseColor", Color) = (1, 1, 1, 1)_RefractColor ("RefractColor", Color) = (1, 1, 1, 1)_RefractAmount ("RefractAmount", Range(0, 1)) = 1_RefractRatio ("RefractiRatio", Range(0.1, 1)) = 0.5        //折射率_Cubemap ("ReflectionCubemap", Cube) = "_Skybox" {}}SubShader{LOD 200PASS {Tags { "LightMode" = "ForwardBase" }CGPROGRAM#pragma vertex vert             //声明顶点着色器的函数#pragma fragment frag           //声明片段着色器的函数#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;fixed4 _RefractColor;float _RefractAmount;float _RefractRatio;samplerCUBE _Cubemap;struct _2vert {float4 vertex: POSITION;float3 normal: NORMAL;float4 texcoord: TEXCOORD0;};struct vert2frag {float4 pos: SV_POSITION;float3 wPos: TEXCOORD0;float3 wNormal: TEXCOORD1;float3 wViewDir: TEXCOORD2;float3 wRefract: TEXCOORD3;};vert2frag vert(_2vert v) {vert2frag o;o.pos = UnityObjectToClipPos(v.vertex);o.wNormal = normalize(UnityObjectToWorldNormal(v.normal));o.wPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.wViewDir = normalize(UnityWorldSpaceViewDir(o.wPos));o.wRefract = refract(-o.wViewDir, o.wNormal, _RefractRatio);           //在片段着色器中计算反射向量,性能优先return o;}fixed4 frag(vert2frag i): SV_Target {fixed3 wLightDir = normalize(UnityWorldSpaceLightDir(i.wPos));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _DiffuseColor.rgb * (0.5 * dot(i.wNormal, wLightDir) + 0.5);            fixed3 refraction = texCUBE(_Cubemap, i.wRefract).rgb * _RefractColor.rgb;return fixed4(ambient + lerp(diffuse, refraction, _RefractAmount), 1.0); } ENDCG}}FallBack "Specular"
}

UnityShader18:立方体贴图(上)相关推荐

  1. LearnOpenGL->立方体贴图

    立方体贴图 立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map). 简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都 ...

  2. OpenGL 核心技术之立方体贴图

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  3. OpenGL 立方体贴图Cubemaps

    OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...

  4. D3D11 立方体贴图(天空盒子)

    本章将学习如何使用一个3D纹理来纹理化一个半圆形.这种技术叫做立方体贴图,且我们将使用该技术来学会如何制作一个天空盒子. 立方体贴图通常用于创建一个无限远的环境,比如天空.我们能够使用该技术通过加载一 ...

  5. LearnOpenGL 高级OpenGL—立方体贴图

    文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...

  6. LearnOpenGL学习笔记——立方体贴图

    立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map).简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的 ...

  7. 立方体贴图 Cubemap

    1. 立方体贴图 Cubemaps 1.1 创建立方体贴图 2. 天空盒 Skybox 2.1 加载天空盒 2.2 显示天空盒 2.3 优化 2.4 整体代码 3. 环境映射 Environment ...

  8. OpenGL进阶之立方体贴图

    参考: https://learnopenglcn.github.io/04%20Advanced%20OpenGL/06%20Cubemaps/ 立方体贴图就是一个包含了6个2D纹理的纹理,每个2D ...

  9. UnityShader18.1:立方体贴图(下)

    接上文:https://blog.csdn.net/Jaihk662/article/details/113248074 四.菲涅尔反射 菲涅尔反射(Fresnel Reflection)就是同时考虑 ...

最新文章

  1. Python练习题(day1)
  2. JUnit 5 – 早期试用体验 – 第2篇
  3. 连接没反应_显示器USB接口的作用是什么?为什么会没有反应?
  4. 涨姿势:另类的表情域名赚钱大法!!
  5. python编程入门到实践 百度云-python网络爬虫从入门到实践pdf
  6. linux系统下常用或有用的系统级命令
  7. 范式青春er,寻找同行的你!
  8. 【数据结构】栈-顺序栈、链式栈、共享栈
  9. 架构之路(八)从CurrentUser说起
  10. Shell编程中的“局部变量”和“导出变量” (export 用法)
  11. vs2013编译ffmpeg之三十一 vidstab
  12. 坦白说html源码,坦白说查询
  13. wingide python_Python开发利器WingIDE破解方法
  14. java common log使用,log4j和commons.logging日志记录的使用方法
  15. AWS免费套餐避坑攻略:查看账户下所有region的资源,及时关停不需要的服务
  16. Linux软件包安装与卸载
  17. tar 慢 加快_加快慢的Outlook 2007
  18. excel高级筛选怎么用_Excel高级筛选的5个用法,学会了可以少写很多函数公式
  19. 会声会影如何新建html项目,会声会影如何使用即时项目模板
  20. as算法 matlab,APAP(As Projective As Possible)视差鲁棒的图像拼接算法

热门文章

  1. python从入门到精通需要多久-Python 从入门到精通:一个月就够了!
  2. python是哪个专业学的-我们为什么要选择学习python?学习python有什么用?
  3. python项目开发实例-有趣的十个Python实战项目,让你瞬间爱上Python!
  4. python爬虫怎么赚钱-利用Python爬虫轻松挣外快的几个方法(值得收藏)
  5. 千行代码入门python-要学 Python 需要怎样的基础?
  6. 语音识别的应用都有哪些
  7. 【干货】怎样用深度学习做语音识别
  8. winform 往第三方传值 put
  9. php 网关接口,[PHP] 通用网关接口CGI 的运行原理
  10. 字典树实现_trie 字典树的实现方法