You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vulkan中Irradiance Map(辐照度贴图)纹理适配异常问题求助

问题根因及修复方案

  • 1. ClearValue数量越界
    当前RenderPass仅定义了1个颜色附件,但是Draw方法中传入了2个VkClearValue,参数越界触发未定义行为,直接导致渲染范围异常:
// 错误代码
std::array<VkClearValue, 2> clearValues{};
clearValues[0].color = { {0.0f, 1.0f, 0.0f, 1.0f} };
clearValues[1].color = { {0.0f, 1.0f, 0.0f, 1.0f} };
// 修复为
std::array<VkClearValue, 1> clearValues{};
clearValues[0].color = { {0.0f, 1.0f, 0.0f, 1.0f} };

同时同步修改renderPassInfo.clearValueCount为1。

  • 2. 帧缓冲层数不匹配Multiview配置
    已启用Multiview渲染立方体贴图6个面,viewMask对应6个视图,但帧缓冲创建时layers参数错误设置为1,导致仅第0层视图可正常渲染,其余5层无有效输出:
// 错误代码
frameBufferCreateInfo.layers = 1;
// 修复为
frameBufferCreateInfo.layers = 6;
  • 3. 管线视口/裁剪区未匹配CubeMap尺寸
    检查IrradiancePipeline创建时的视口、裁剪矩形配置:
    如果未开启动态视口特性,需确保管线创建时的VkViewport宽高与当前CubeMapSize一致,修改尺寸后需同步重建管线;如果开启动态视口,需在vkCmdBeginRenderPass前添加视口设置代码:
VkViewport viewport{};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = (float)CubeMapSize;
viewport.height = (float)CubeMapSize;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(commandBuffer, 0, 1, &viewport);

VkRect2D scissor{};
scissor.offset = {0, 0};
scissor.extent.width = CubeMapSize;
scissor.extent.height = CubeMapSize;
vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
  • 4. 立方体贴图视图配置校验
    确认RenderedCubeMapTexture初始化时满足两个条件:
  1. 图像创建参数imageType = VK_IMAGE_TYPE_2D,arrayLayers = 6,flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
  2. 图像视图创建参数viewType = VK_IMAGE_VIEW_TYPE_CUBE,subresourceRange.layerCount = 6
  • 5. 投影矩阵校验
    立方体贴图每个面的投影矩阵需满足:宽高比=1,垂直FOV=90度,确保投影范围覆盖整个立方体面。

内容的提问来源于stack exchange,提问作者klj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:57:03