文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载本文围绕 Godot 4 类参考文档 TextureCubemapRD 展开讲解如何把直接在RenderingDevice低层图形 API 抽象上创建的 cubemap 纹理包装成可在材质、网格与着色器中直接使用的纹理资源。读完本文你将掌握TextureCubemapRD的类继承关系与适用场景、如何通过RDTextureFormat描述并调用texture_create()创建 GPU 端 cubemap RID、如何设置其texture_rd_rid属性以及在计算着色器工作流中绑定与回收该纹理的完整方法。类定位与继承体系TextureCubemapRD在类参考中的完整定义位于 classes/class_texturecubemaprd.rst其继承链如下TextureCubemapRD TextureLayeredRD TextureLayered Texture Resource RefCounted Object从继承链可以看出它是“分层纹理”Layered Texture体系的一员TextureLayered是承载多张Image每张尺寸、格式一致的纹理基类TextureLayeredRD则是专门对接RenderingDevice的分层纹理抽象基类根据 classes/class_texturelayeredrd.rst 的说明它不能直接使用而是被以下三个派生类继承TextureCubemapRD单个立方体贴图本文主角Texture2DArrayRD2D 纹理数组TextureCubemapArrayRD立方体贴图数组。在TextureLayered基类中见 classes/class_texturelayered.rstLayeredType枚举区分了三种分层类型枚举值数值含义LAYERED_TYPE_2D_ARRAY0普通Texture2DArrayLAYERED_TYPE_CUBEMAP1Cubemap每个面独占一个 layer共 6 层LAYERED_TYPE_CUBEMAP_ARRAY2CubemapArray每个 cubemap 由 6 个 layer 组成也就是说cubemap 在 GPU 端本质上是“6 张正方形纹理组成的 6 层分层纹理”这一结构正是TextureCubemapRD与RDTextureFormat.array_layers交互的基础。适用场景何时用 TextureCubemapRD何时用 Cubemap类参考在 Description 中给出明确定位该类允许你将直接在RenderingDevice上创建的 cubemap 纹理用作材质、网格等的纹理。并附有一条重要提醒注意TextureCubemapRD面向与RenderingDevice搭配的低层使用场景。对于大多数用例请改用Cubemap。两者对比如下Cubemap见 classes/class_cubemap.rst由 6 张正方形纹理组成通常用作天空盒或结合ReflectionProbe伪造反射数据来源是导入的图片资源或通过ImageTextureLayered.create_from_images()在代码中从Image数组构建。它适合绝大多数常规渲染需求。TextureCubemapRD纹理数据本身不存在于Image资源中而是由你在RenderingDevice上以 RID 形式创建例如计算着色器向纹理写入结果、或从外部图形 API 对象接入。它只是一层“包装”把 GPU 端已有的 cubemap RID 暴露给材质系统。因此典型场景包括计算着色器把结果写入一张 cubemap如动态环境反射/光照探针更新随后希望用这张 GPU 纹理去填充材质或供采样器使用此时数据在 GPU 端生成、无需回读 CPUTextureCubemapRD就是桥接RenderingDevice与材质管线的轻量资源。核心属性texture_rd_ridTextureCubemapRD自身没有额外属性其全部核心状态继承自TextureLayeredRD——唯一的属性是texture_rd_rid类型RID文档描述为在RenderingDevice上创建的纹理对象的 RID。访问方式为一对标准 setter/getterset_texture_rd_rid(value: RID) get_texture_rd_rid() - RID用法非常直白先用RenderingDevice创建 cubemap 纹理得到 RID再将其赋给一个TextureCubemapRD实例此后这个资源即可作为Texture传给材质、网格或着色器 uniform。反过来你也可以通过get_texture_rd_rid()取回 RID交给RenderingDevice的其他 API如texture_update()、texture_copy()、free_rid()继续操作。在 RenderingDevice 上创建 cubemap 纹理获取 RenderingDevice根据 classes/class_renderingdevice.rstRenderingDevice是对 Vulkan 等现代低层图形 API 的抽象。Godot 启动时会创建一个全局RenderingDevice可通过RenderingServer.get_rendering_device()获取见 classes/class_renderingserver.rst若希望在独立线程上执行 GPU 计算或绘制也可用RenderingServer.create_local_rendering_device()创建本地设备——计算着色器教程 tutorials/shaders/compute_shaders.rst 中便是这样开头的# 创建本地渲染设备计算着色器常用方式 var rd : RenderingServer.create_local_rendering_device()需要特别留意两个前提条件同样来自RenderingDevice文档该 API 在headless 模式下不可用且不支持Compatibility 渲染方法它假定使用者对 Vulkan / Direct3D 12 / Metal / WebGPU 等低层图形 API 有中等程度了解。用 RDTextureFormat 描述纹理布局创建纹理的第一步是用RDTextureFormat见 classes/class_rdtextureformat.rst描述纹理布局。其关键属性及默认值如下属性默认值说明width/height1/1纹理宽高像素cubemap 每面必须为正方形depth1纹理深度像素2D 纹理恒为1array_layers1纹理层数cubemap 每面占一层需设为6mipmaps1mipmap 级数format8DATA_FORMAT_R8G8B8A8_UNORM像素数据格式RenderingDevice.DataFormat枚举texture_type1TEXTURE_TYPE_2D纹理类型RenderingDevice.TextureType枚举samples0TEXTURE_SAMPLES_1多重采样数usage_bits0纹理用途位掩码RenderingDevice.TextureUsageBits创建 cubemap 时必须把texture_type设为TEXTURE_TYPE_CUBE枚举值3在RenderingDevice.TextureType中定义为“Cubemap 纹理”并把array_layers设为6每个面一个 layer。usage_bits按需组合常用位如下摘自RenderingDevice.TextureUsageBitsTEXTURE_USAGE_SAMPLING_BIT1可在着色器中被采样——要让TextureCubemapRD用于材质/采样器这一位是必须的TEXTURE_USAGE_COLOR_ATTACHMENT_BIT2可作为 framebuffer 颜色附件TEXTURE_USAGE_STORAGE_BIT8可作为存储图像storage image——计算着色器写入结果的场景必须设置TEXTURE_USAGE_STORAGE_ATOMIC_BIT16可作为支持原子操作的存储图像TEXTURE_USAGE_CAN_UPDATE_BIT64可调用texture_update()更新TEXTURE_USAGE_CAN_COPY_FROM_BIT128可作为texture_copy()的源TEXTURE_USAGE_CAN_COPY_TO_BIT256可作为texture_copy()的目标TEXTURE_USAGE_CPU_READ_BIT32可更快地用texture_get_data()在 CPU 端回读。调用 texture_create 创建 RIDRenderingDevice.texture_create()的签名与说明见 classes/class_renderingdevice.rstRID texture_create( format: RDTextureFormat, view: RDTextureView, data: Array[PackedByteArray] [] )其中data是一个PackedByteArray数组对 1D/2D/3D 纹理只需一个元素而对_ARRAY与_CUBE类型数组长度必须与format.array_layers一致——即 cubemap 需要传 6 个字节数组每面一个。文档还提醒创建后应使用free_rid()释放不再使用的 RID。综合以上一个完整的创建流程如下var rd : RenderingServer.create_local_rendering_device() # 1. 描述 cubemap 布局512x512、RGBA8、6 层、带 mipmap var fmt : RDTextureFormat.new() fmt.texture_type RenderingDevice.TEXTURE_TYPE_CUBE fmt.format RenderingDevice.DATA_FORMAT_R8G8B8A8_UNORM fmt.width 512 fmt.height 512 fmt.array_layers 6 fmt.mipmaps 4 # 作为存储图像供计算着色器写入 可在着色器中采样 fmt.usage_bits RenderingDevice.TEXTURE_USAGE_STORAGE_BIT \ | RenderingDevice.TEXTURE_USAGE_SAMPLING_BIT \ | RenderingDevice.TEXTURE_USAGE_CAN_COPY_TO_BIT # 2. 创建纹理视图此处用默认视图即可 var view : RDTextureView.new() # 3. 创建纹理六个面各给一个空数据块 var data: Array[PackedByteArray] [] for i in 6: data.append(PackedByteArray()) # 留空由计算着色器/后续更新填充 var rid : rd.texture_create(fmt, view, data) # 4. 包装成 TextureCubemapRD 供材质使用 var cubemap_rd : TextureCubemapRD.new() cubemap_rd.texture_rd_rid rid # ……使用完毕后释放 # rd.free_rid(rid)若纹理数据已在 GPU 上由其他环节生成还可以考虑texture_create_shared()共享同一底层纹理的另一个视图或texture_create_shared_from_slice()按 layer/mipmap 切分共享以及面向外部VkImage的texture_create_from_extension()。在计算着色器中写入并采样 cubemapTextureCubemapRD最常见的落地场景是“计算着色器生成 cubemap → 材质/场景使用”。参照 tutorials/shaders/compute_shaders.rst 的通用流程把 cubemap 接入计算管线的步骤为如上文所述创建带TEXTURE_USAGE_STORAGE_BIT的 cubemap RID用RDUniform把纹理 RID 绑定到 uniform setuniform_type设为UNIFORM_TYPE_IMAGE或UNIFORM_TYPE_SAMPLER等binding与着色器声明一致再调用uniform_set_create()创建计算管线compute_pipeline_create()并开启计算列表compute_list_begin()依次绑定管线与 uniform set用compute_list_dispatch()指定工作组数量后compute_list_end()提交执行rd.submit()后按需rd.sync()。教程特别提醒除非立即需要结果否则最好等待 23 帧再同步让 GPU 与 CPU 并行过长的单次计算还可能在 Windows 上触发 TDR超时检测与恢复。计算完成后该 RID 仍指向含有效数据的 cubemap此时可把它赋给TextureCubemapRD.texture_rd_rid直接当作Texture资源绑定到任意材质——这正是本类“允许你把 RenderingDevice 上创建的 cubemap 用作材质、网格等的纹理”这句描述的完整闭环。生命周期与注意事项RID 所有权texture_rd_rid只是对 GPU 资源的引用真正的资源生命周期由RenderingDevice管理。文档明确要求用完调用free_rid()释放共享视图texture_create_shared()会随原纹理自动释放。与常规 Cubemap 的分工绝大多数常规需求天空盒、反射探针、从图片导入应使用 Cubemap它的面顺序为 X, X-, Y, Y-, Z, Z-Y 朝上、Z- 朝前TextureCubemapRD只服务于需要直接操作 GPU 端 cubemap 的低层管线。同族兄弟类若你的需求是 2D 纹理数组或立方体贴图数组可分别参考Texture2DArrayRD见 classes/class_texture2darrayrd.rst与TextureCubemapArrayRD见 classes/class_texturecubemaparrayrd.rst两者同样继承自TextureLayeredRD并通过texture_rd_rid绑定 GPU 纹理。运行环境限制RenderingDevice在 headless 模式与 Compatibility 渲染方法下不可用因此TextureCubemapRD只适用于 Forward及 Mobile 等支持RenderingDevice的渲染后端。官方示例类参考的 Tutorials 章节指向 Godot 官方资源库的 Compute Texture demo资源 ID 2764该演示即为“计算着色器生成纹理供后续渲染使用”的典型范例。小结TextureCubemapRD是 Godot 渲染管线中“GPU 端生成数据 → 场景可见”这一链条上的关键胶水类型它不持有像素数据只通过继承自TextureLayeredRD的texture_rd_rid引用RenderingDevice上创建的 6 层 cubemap 纹理。掌握它的使用意味着你可以在RenderingDevice的低层工作流计算着色器、动态反射/光照探针、外部图形 API 接入中自由创建立方体贴图并无缝接入 Godot 高层的材质与网格体系。赞分享文档教程游戏开发【免费下载链接】godot-docsGodot Engine official documentation项目地址https://gitcode.com/GitHub_Trending/go/godot-docs点击查看免费下载相关推荐Godot PlaceholderCubemap 详解占位立方体贴图与专用服务器导出瘦身实战Godot PlaceholderCubemap 详解占位立方体贴图与专用服务器导出瘦身实战 PlaceholderCubemap 是 Godot 引擎中一种文档教程游戏开发Godot RDUniform 完全指南用 RenderingDevice 将 GPU 资源绑定到着色器Godot RDUniform 完全指南用 RenderingDevice 将 GPU 资源绑定到着色器 RDUniform 是 Godot 引擎中 Rend文档教程游戏开发Godot RenderingDevice 纹理格式完全指南RDTextureFormat 属性、枚举与创建流程详解Godot RenderingDevice 纹理格式完全指南RDTextureFormat 属性、枚举与创建流程详解 导读 本文以 Godot 官方文档 R文档教程游戏开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考