【Unity Shader】 CubeMap(立方体贴图)

Unity Shader 立方体贴图一、介绍CubeMapShader中对CubeMap采样Unity中如何制作CubeMap二、Reflect CubeMap(反射立方体纹理用于环境映射)环境映射原理反射方向的计算Unity Shader实现Reflection CubeMap(基于CubeMap的反射效果)反射CubeMap的Shader代码反射效果展示ps:“...
摘要由CSDN通过智能技术生成

Unity Shader 立方体贴图

一、介绍CubeMap

Cubemap是一个由六个独立的正方形纹理组成的集合,它将多个纹理组合起来映射到一个单一纹理。

基本上说CubeMap包含6个2D纹理,这每个2D纹理是一个立方体(cube)的一个面,也就是说它是一个有贴图的立方体。

CubeMap通常被用来作为具有反射属性物体的反射源。

这里写图片描述
你可能会奇怪这样的立方体有什么用?为什么费事地把6个独立纹理结合为一个单独的纹理,只使用6个各自独立的不行吗?这是因为cubemap有自己特有的属性,可以使用方向向量对它们索引和采样

想象一下,我们有一个1×1×1的单位立方体,有个以原点为起点的方向向量在它的中心。方向向量的大小无关紧要,当方向向量向外延伸时,就会和立方体表面上的相应纹理发生相交,我们可以根据该交点进行采样。
这里写图片描述

Shader中对CubeMap采样

Shader提供了CubeMap的内置类型samplerCube,samplerCube和sampler2D一样,都是贴图,不同的是,需要使用textureCube进行采样,采样的时候需要传递规范化的方向向量而不是uv坐标。

texCUBE(_CubeMap, directionVec);

texCUBE会采样方向向量directionVec在CubeMap上的交点。

如果texCube采样时,传入模型中心到定点的向量,就可以将CubeMap纹理贴到模型上了。

Shader "Hidden/CubemapSampler"
{
    Properties
    {
        _CubeMap("CubeMap", CUBE) = ""{}
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;   
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 vertexLocal : TEXCOORD1;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertexLocal = v.vertex;
                o.vertex = UnityObjectToClipPos(v.vertex);

                return o;
            }

            samplerCUBE _CubeMap;
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = texCUBE(_CubeMap, normalize(i.vertexLocal.xyz));
                return col;
            }
            ENDCG
        }
    }
}

这里写图片描述

Unity中如何制作CubeMap

  1. 已经有6张2D纹理,直接创建CubeMap
    Project-Create-Legacy-CubeMap
    这里写图片描述

二、Reflect CubeMap(反射立方体纹理用于环境映射)

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

通常我们使用高光来模拟光滑物体对于点光源的反射效果,更进一步,高反光的物体通常可以在表面反射出周围的物体,这样的效果通过高光贴图就无法实现了,需要通过环境贴图CubeMap来实现。。

环境反射的原理很简单,一个光滑的物体表面可以根据我们观察的不同角度反射出不同位置的环境。即物体表面一点反射的颜色和该点的法线,观察视线和反射视线有关系。

环境映射原理

这里写图片描述

如果我们使用texCube函数对立方体纹理进行采样时,使用视线关于物体顶点法线的反射向量作为采样的方向向量就可以得到反射的效果。

反射方向的计算

这里写图片描述
L为入射光(顶点到光源)的单位法向量,N为顶点的单位法向量,R为反射光的单位法向量,V是观察方向。

R=2(N•L)N-L

推导过程:
L在N方向上的投影是|L

  • 30
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
Unity中动态生成Cubemap可以使用RenderTexture和Camera来实现。下面是一个简单的示例代码: ```csharp using UnityEngine; public class GenerateCubemap : MonoBehaviour { public int resolution = 512; public Cubemap cubemap; public Camera camera; private RenderTexture renderTexture; void Start() { // 创建RenderTexture作为Cubemap的渲染目标 renderTexture = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.Default); renderTexture.dimension = UnityEngine.Rendering.TextureDimension.Cube; renderTexture.hideFlags = HideFlags.HideAndDontSave; // 将RenderTexture赋值给Cubemap cubemap = new Cubemap(resolution, TextureFormat.RGB24, false); cubemap.SetPixelData(Color.black, CubemapFace.PositiveX); cubemap.SetPixelData(Color.black, CubemapFace.NegativeX); cubemap.SetPixelData(Color.black, CubemapFace.PositiveY); cubemap.SetPixelData(Color.black, CubemapFace.NegativeY); cubemap.SetPixelData(Color.black, CubemapFace.PositiveZ); cubemap.SetPixelData(Color.black, CubemapFace.NegativeZ); // 将Cubemap设置到Material中进行显示 GetComponent<Renderer>().sharedMaterial.SetTexture("_Cube", cubemap); // 将Camera的渲染目标设置为RenderTexture camera.targetTexture = renderTexture; } void Update() { // 渲染到RenderTexture camera.Render(); // 将RenderTexture的像素数据拷贝到Cubemap中 Graphics.CopyTexture(renderTexture, cubemap); // 更新Cubemap cubemap.Apply(); } } ``` 上述代码将在场景中创建一个空物体,并将脚本`GenerateCubemap`附加到该物体上。在Inspector面板中,可以设置Cubemap的分辨率和渲染的Camera。 该脚本会在每一帧更新时,将Camera渲染的结果拷贝到RenderTexture,并将RenderTexture的像素数据拷贝到Cubemap中,以实现动态生成Cubemap的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值