fix: IBL 模型全黑——prefilter mip 拷贝偏移错位 + 采样器 maxLod 错误

- UploadCube 的 mip buffer 偏移误用当前 mip 尺寸×序号(mip 面递减,
  正确应为累积偏移)→ 各 mip 拷到 staging 错位数据,含未初始化 fp16
  NaN → 污染 ambient 输出整屏黑
- prefilter/irradiance 绑定改用环境采样器(maxLod=mipCount-1):
  shadowSampler maxLod=0 会把 textureLod 显式 lod clamp 到 0,
  pre-filter 永远停在最锐 mip
This commit is contained in:
2026-09-23 19:07:53 +08:00
parent 9269afaa18
commit 6e107ac2ba
2 changed files with 14 additions and 5 deletions
+8 -2
View File
@@ -328,13 +328,17 @@ namespace Engine
cmd.pipelineBarrier2(
vk::DependencyInfo{}.setImageMemoryBarriers(toTransfer));
// 逐 mip 逐面拷贝;buffer 偏移必须按 mips[0..mip) 字节数累积
//(mip 面尺寸递减,用当前 dim 乘 mip 序号会错位 → 读到
// staging 未初始化数据 → fp16 NaN 污染整屏)
vk::DeviceSize offset = 0;
for (u32 mip = 0; mip < mipCount; ++mip) {
const u32 dim = mips[mip].faceSize;
for (u32 f = 0; f < kFaceCount; ++f) {
vk::BufferImageCopy region;
region.setBufferOffset(
(static_cast<vk::DeviceSize>(dim) * dim * 8 *
kFaceCount) * mip)
offset + static_cast<vk::DeviceSize>(dim) *
dim * 8 * f)
.setBufferRowLength(0)
.setBufferImageHeight(0)
.setImageSubresource({vk::ImageAspectFlagBits::eColor,
@@ -345,6 +349,8 @@ namespace Engine
vk::ImageLayout::eTransferDstOptimal,
region);
}
offset += static_cast<vk::DeviceSize>(dim) * dim * 8 *
kFaceCount;
}
vk::ImageMemoryBarrier2 toShader;