shader篇-立方体纹理


  • shader篇-立方体纹理

    • 简介
    • 天空盒
    • 反射
    • 折射
    • 菲涅尔反射

简介

立方体纹理是环境映射的一种实现方式。
立方体纹理包含6张图像,对应立方体6个面。
优点:实现快速简单,效果好
缺点:经常需要重新生成立方体纹理。仅可以反射环境。

天空盒

天空盒是立方体纹理的一种应用,游戏里常用它模拟背景。让整个场景包裹在一个立方体内。
Unity5中创造立方体纹理的方法有三种。
一、直接由一些特殊布局的纹理创建。
二、手动创建一个cubemap资源,再把6张图赋给它。
三、脚本直接生成。

如果希望根据物体在场景中位置的不同,生成各自不同的立方体纹理。我们需要利用脚本生成。

using UnityEngine;
using UnityEditor;
using System.Collections;public class RenderCubemapWizard : ScriptableWizard {public Transform renderFromPosition;public Cubemap cubemap;void OnWizardUpdate () {helpString = "Select transform to render from and cubemap to render into";isValid = (renderFromPosition != null) && (cubemap != null);}void OnWizardCreate () {GameObject go = new GameObject( "CubemapCamera");go.AddComponent<Camera>();//在renderFromPosition(用户指定位置)创建一个摄像头go.transform.position = renderFromPosition.position;//把当前位置观察到的图像渲染到用户指定的立方体纹理中go.GetComponent<Camera>().RenderToCubemap(cubemap);DestroyImmediate( go );}[MenuItem("GameObject/Render into Cubemap")]static void RenderCubemap () {ScriptableWizard.DisplayWizard<RenderCubemapWizard>("Render cubemap", "Render!");}
}

反射

反射能让物体看起来像镀了层金属一样。
配置

Properties {_Color ("Color Tint", Color) = (1, 1, 1, 1)//控制反射颜色_ReflectColor ("Reflection Color", Color) = (1, 1, 1, 1)//控制反射程度_ReflectAmount ("Reflect Amount", Range(0, 1)) = 1_Cubemap ("Reflection Cubemap", Cube) = "_Skybox" {}}SubShader {Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass { Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Color;fixed4 _ReflectColor;fixed _ReflectAmount;samplerCUBE _Cubemap;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldPos : TEXCOORD0;fixed3 worldNormal : TEXCOORD1;fixed3 worldViewDir : TEXCOORD2;fixed3 worldRefl : TEXCOORD3;SHADOW_COORDS(4)};

顶点着色器
选择在顶点着色器中计算反射方向
在片元着色器计算更细腻,但差别比较小,在顶点着色器计算性能消耗小。

v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);// 用CG内置的reflect函数计算反射方向o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);TRANSFER_SHADOW(o);return o;
}

片元着色器

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));      fixed3 worldViewDir = normalize(i.worldViewDir);        fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));//立方体纹理采样fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb * _ReflectColor.rgb;UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);fixed3 color = ambient + lerp(diffuse, reflection, _ReflectAmount) * atten;return fixed4(color, 1.0);
}

折射

接下来模拟折射

配置

Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_RefractColor ("Refraction Color", Color) = (1, 1, 1, 1)
_RefractAmount ("Refraction Amount", Range(0, 1)) = 1//折射率
_RefractRatio ("Refraction Ratio", Range(0.1, 1)) = 0.5
_Cubemap ("Refraction Cubemap", Cube) = "_Skybox" {}
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass { Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase   #pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Color;fixed4 _RefractColor;float _RefractAmount;fixed _RefractRatio;samplerCUBE _Cubemap;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldPos : TEXCOORD0;fixed3 worldNormal : TEXCOORD1;fixed3 worldViewDir : TEXCOORD2;fixed3 worldRefr : TEXCOORD3;SHADOW_COORDS(4)};

顶点着色器

v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);//计算折射方向o.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal), _RefractRatio);TRANSFER_SHADOW(o);return o;}

片元着色器

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir = normalize(i.worldViewDir);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));fixed3 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb;UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);fixed3 color = ambient + lerp(diffuse, refraction, _RefractAmount) * atten;return fixed4(color, 1.0);
}

菲涅尔反射

光线照射到物体表面上,一部分被反射,一部分进入内部,反射折射或散射。
最直接的例子是你看水面,近处的能清楚水底的小鱼和石头,但远处的水面你几乎看不到水底的环境

实例

配置和顶点着色器

Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_FresnelScale ("Fresnel Scale", Range(0, 1)) = 0.5
_Cubemap ("Reflection Cubemap", Cube) = "_Skybox" {}
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass { Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Color;fixed _FresnelScale;samplerCUBE _Cubemap;struct a2v {float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldPos : TEXCOORD0;fixed3 worldNormal : TEXCOORD1;fixed3 worldViewDir : TEXCOORD2;fixed3 worldRefl : TEXCOORD3;SHADOW_COORDS(4)};v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);TRANSFER_SHADOW(o);return o;}

片元着色器
Schlick菲涅尔近似等式

F(v,n)=F0+(1−F0)(1−v∗n)5

F(v,n)=F_0+(1-F_0)(1-v*n)^5

fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir = normalize(i.worldViewDir);fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb;fixed fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(worldViewDir, worldNormal), 5);fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));fixed3 color = ambient + lerp(diffuse, reflection, saturate(fresnel)) * atten;return fixed4(color, 1.0);
}

_FrensenelScal 为1时完全反射CUbemap,为0则是个具有边缘光照效果的漫反射物体

shader篇-立方体纹理相关推荐

  1. 【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

    笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...

  2. unity shader立方体纹理中的反射以及折射效果的实现

    反射: 如果不考虑反射效果的话,在场景中的问题的镜面表面的效果应该是用表面的法线对立方体纹理进行采样得到该点的颜色. 所以我们进行反射的计算的时候,只需要求得反射方向,再用反射的方向对立方体纹理进行采 ...

  3. 数据立方体_立方体纹理

    立方体纹理就是包含6个2D纹理的纹理.6个纹理有序排列在立方体的6个面.其可以通过方向向量采样立方体纹理上的纹素. 创建立方体贴图跟创建2D贴图一样,但是绑定到GL_TEXTURE_CUBE_MAP上 ...

  4. OpenGL立方体纹理贴图

    OpenGL正方体纹理贴图 0. 写在最前面 1. 正方体顶点属性构建 2. 绑定多个VAO.VBO 3. 创建多个纹理 4. 渲染循环 5. 实现代码 6. 多个立方体纹理贴图 0. 写在最前面 要 ...

  5. openg 立方体纹理

    opengl 立方体纹理 来给立方体贴个图. // glfwTest.cpp : 定义控制台应用程序的入口点. // #include "glew.h" #include < ...

  6. (十六)unity shader之——————高级纹理之渲染纹理(镜子、玻璃效果)

    在之前的学习中,一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上.现在的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理(Render Target Texture,RTT ...

  7. 【Unity3D】立方体纹理(Cubemap)和天空盒子(Skybox)

    1 立方体纹理(Cubemap) 本文完整资源见 → 立方体纹理(Cubemap)和天空盒子(Skybox) . 1)立方体纹理简介 立方体纹理是指由上.下.左.右.前.后 6 张纹理组成的立方体结构 ...

  8. UnityShader入门精要——立方体纹理

    在图形学中,立方体纹理(Cubemap)是环境映射(Environment Mapping)的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的 ...

  9. 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

    学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...

  10. OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

    写在前面 之前学习了2D纹理映射,实际上还有其他类型的纹理有待我们进一步学习,本节将要学习的立方体纹理(cubemaps),是一种将多个纹理图片复合到一个立方体表面的技术.在游戏中应用得较多的天空包围 ...

最新文章

  1. [微信小程序]js动态改变数组对象列表中的样式
  2. dotnet core 微服务教程
  3. 通过R,让你的数据分析更简便!
  4. oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动
  5. php数组无限文类,php把无限级分类生成数组的类
  6. MySQL - ODBC安装错误问题!
  7. Outlook简单配置
  8. NYOJ 137 取石子(三)(教主神题)
  9. -day26 必备SQL和表关系及授权
  10. python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解
  11. hdu 5148 树形dp,分组背包
  12. 【学习笔记】OFDM中信道估计技术分析与实现
  13. 2种方法设置RAR文件打开密码
  14. 公司服务器中了.Monkey865qqz勒索病毒怎么处理?
  15. 华为EROFS文件系统的性能测试
  16. 新品发布 | 无人车开发平台Autopilot kit R300正式发布!
  17. [Java反序列化]CommonsBeanutils1利用链学习
  18. window.close的解决方法
  19. “贫困县电商特产”大数据地图:一定有你青睐的特色产品
  20. 180527 Chrome护眼设置

热门文章

  1. Visual Studio 2015 介绍
  2. 2013年春节 放假通知 悲催的很,只有七天。
  3. Web前端之HTML+CSS的知识总结
  4. 计算机网络对等网实验报告,计算机网络实验报告_双机互联
  5. php中$$代表什么意思
  6. causalml安装记录
  7. 银行账户模拟java_使用Java模拟银行账户存、取款、转账功能
  8. 结构化设计(实验二)
  9. 联想家悦微型计算机的包装箱,08年联想家悦所有型号,联想家悦小机箱型号-
  10. 代码覆盖率、功能覆盖率分析