立方体纹理

1、立方体纹理

立方体纹理(CubeMap)是一种特殊的纹理类型,立方体纹理包含6个独立的二维纹理,分别对应一个立方体的六个面
分别为:

  • 正X面(右):+X;负X面(左):-X
  • 正Y面(上):+Y;负Y面(下):-Y
  • 正Z面(前):+Z;负Z面(后):-Z

注意:这个轴向就是Unity中的世界坐标轴向

2、立方体纹理用途

立方体纹理(CubeMap)在图形编程中常见的用途有:
(1)环境映射:
用于模拟反射环境的效果,用立方体纹理存储周围环境的图像,当应用到反射表面时,可以让物体看起来像是在反射其周围的环境。
(2)天空盒
用于渲染天空盒,将立方体纹理的六个面映射到一个立方体内表面,从而模拟天空、云朵、远处的山脉等环境
(3)全景图
用于展示全景图像、视频,通过立方体纹理来存储全景照片、视频的六个部分等等

3、如何采样

对立方体纹理进行采样,我们需要提供一个三维的纹理坐标,该坐标表示了我们在世界空间下的一个三维方向。这个方向向量从立方体的中心出发,当它向外延伸时就会和6个纹理之一相交,采样结果就是由该交点计算而来

4、优缺点

优点:

  • 多用途:可以有效的模拟环境映射和全景效果,如反射、折射、天空盒、环境光照等
  • 无缝连接:立方体纹理设计为无缝连接着六个面,减少了可见的接缝和瑕疵
  • 兼容性较好:大多数现代图形硬件对立方体纹理都有专门的支持

缺点:

  • 内存开销:立方体纹理由6个2D纹理组成,内存占用较高,特别是在高分辨率情况下
  • 采样复杂性:采样方式比起传统的2D纹理更加耗性能,计算更多
  • 透视变形:6个平面来近似球形环境,有时会出现透视变形的问题

5、天空盒

天空盒(Skybox)是计算机图形学和三维游戏开发中常用于模拟背景的一种方式,它通常由一个立方体构成,字面上理解就是一个用于模拟天空的盒子(但是它不仅可以模拟天空,模拟室内等环境也是可以的)
在游戏场景中使用天空盒时,整个场景就被包围在了一个立方体中。这个立方体的每个面使用的技术就是立方体纹理技术。

主要好处是:
(1)可以创建逼真的背景
天空盒使场景看起来更加逼真,因为它可以展示复杂和详细的背景
(2)可以提高性能
可以减少渲染远景所需的消耗,只需要要纹理贴图就可以模拟远景的效果,而无需实际的在远处创建这些物体
(3)全景视图
天空盒的六个面(前、后、左、右、上、下)共同构成一个完整的环境,无论玩家向哪个方向看,都能看到连贯的背景图像
(4)易于实现
对于开发者来说,制作和应用天空盒相对简单,只需要准备好六个方向的纹理图像,并将它们应用到立方体纹理中即可

在Unity当中使用天空盒非常的简单,无需写任何代码就可以使用天空盒
第一步:创建天空盒材质球

  1. 创建一个材质球
  2. 将其Shader设置为Unity自带的天空盒着色器(Skybox / 6 Sided)
  3. 为了让天空盒接缝处不要出现不匹配的现象,我们将准备的纹理的Wrap Mode(循环模式)设置为Clamp(夹紧)
  4. 将我们准备好的6张纹理赋值给对应的面
  5. 修改材质球上的各参数:Tint Color(材质整体颜色),Exposure(天空盒亮度),Rotation(天空盒沿正y轴方向的旋转角度)

第二步:创建测试用场景

  1. 新建一个测试场景
  2. 设置天空盒
    • 设置全局天空盒(影响所有摄像机)在Lighting面板中设置材质球
    • 单独为摄像机设置天空盒(可以覆盖全局设置)为摄像机添加 Skybox 组件并关联材质球

6、动态生成立方体纹理

立方体纹理的其中一个最大的作用就是环境映射,在实现反射、折射等等效果时,需要用到立方体纹理来制作对应效果,而立方体纹理中最重要的就是组成它的6张2D纹理图片

对于之前学过的天空盒来说,6张2D纹理图片可以根据想要的美术表现效果来进行自定义制作,提前把纹理制作好,直接使用即可,这种立方体纹理往往是被提前做好的,是场景中物体们共用的

但如果制作反射、折射等效果还是使用这样的立方体纹理,效果肯定不够理想,因为物体在场景上的位置不同,产生的对应效果也会是不同的,因此为了更好更真实的表现效果,对于场景中不同位置的物体,我们应该为它们在不同位置生成不同的立方体纹理(6张2D纹理贴图)

主要要完成的功能为:

  1. 自定义编辑器窗口,关联对象(通过对象来指定位置)和cubemap变量(cube 在右键 Create->Legacy 中查找)
  2. 自定义窗口中有一个生成按钮,点击后使用Camera中的RenderToCubemap自动生成对应的6张2D纹理贴图

注意点:

  • 通过动态创建一个空物体为它添加摄像机组件的形式生成立方体纹理贴图,该对象为临时对象,使用完毕后即时删除即可
  • cubemap上需要勾选Readable
  • 分辨率决定了清晰度
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class RenderToCubeMap : EditorWindow
{
    private GameObject obj;
    private Cubemap cubeMap;

    [MenuItem("立方体纹理动态生成/打开生成窗口")]
    static void OpenWindow()
    {
        Lesson74_RenderToCubeMap window = EditorWindow.GetWindow<Lesson74_RenderToCubeMap>("立方体纹理生成窗口");
        window.Show();
    }

    private void OnGUI()
    {
        GUILayout.Label("关联对应位置对象");
        //用于关联对象的控件
        obj = EditorGUILayout.ObjectField(obj, typeof(GameObject), true) as GameObject;
        GUILayout.Label("关联对应立方体纹理");
        //用于关联立方体纹理的控件
        cubeMap = EditorGUILayout.ObjectField(cubeMap, typeof(Cubemap), false) as Cubemap;
        //点击按钮后 就去执行生成逻辑
        if(GUILayout.Button("生成立方体纹理"))
        {
            if(obj == null || cubeMap == null)
            {
                EditorUtility.DisplayDialog("提醒", "请先关联对应对象和立方体贴图", "确认");
                return;
            }
            //动态的生成立方体纹理
            GameObject tmpObj = new GameObject("临时对象");
            tmpObj.transform.position = obj.transform.position;
            Camera camera = tmpObj.AddComponent<Camera>();
            //关键方法,可以马上生成6张2D纹理贴图 用于立方体纹理
            camera.RenderToCubemap(cubeMap);
            DestroyImmediate(tmpObj);
        }
    }
}

Camera中的RenderToCubemap也可以在运行时实时动态生成立方体纹理,但是要注意对性能的影响

  • 在LateUpdate中使用
  • 降低立方体纹理贴图的分辨率
  • 分帧渲染,RenderToCubemap有重载,可以一个面一个面的渲染
  • 降低更新频率,不要每帧执行

【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 二、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式二: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值