在 Vulkan 中加载非二次幂纹理
Loading non-power-of-two textures in Vulkan
如果我的纹理尺寸是 2 的幂,我的 2D 纹理加载器工作正常,但当它们不是时,纹理数据显示为倾斜。我该如何解决这个问题?我认为这个问题与内存对齐和行间距有关。以下是我的加载程序代码的相关部分:
VkMemoryRequirements memReqs;
vkGetImageMemoryRequirements( GfxDeviceGlobal::device, mappableImage, &memReqs );
VkMemoryAllocateInfo memAllocInfo = {};
memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
memAllocInfo.pNext = nullptr;
memAllocInfo.memoryTypeIndex = 0;
memAllocInfo.allocationSize = memReqs.size;
GetMemoryType( memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memAllocInfo.memoryTypeIndex );
VkDeviceMemory mappableMemory;
err = vkAllocateMemory( GfxDeviceGlobal::device, &memAllocInfo, nullptr, &mappableMemory );
CheckVulkanResult( err, "vkAllocateMemory in Texture2D" );
err = vkBindImageMemory( GfxDeviceGlobal::device, mappableImage, mappableMemory, 0 );
CheckVulkanResult( err, "vkBindImageMemory in Texture2D" );
VkImageSubresource subRes = {};
subRes.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
subRes.mipLevel = 0;
subRes.arrayLayer = 0;
VkSubresourceLayout subResLayout;
vkGetImageSubresourceLayout( GfxDeviceGlobal::device, mappableImage, &subRes, &subResLayout );
void* mapped;
err = vkMapMemory( GfxDeviceGlobal::device, mappableMemory, 0, memReqs.size, 0, &mapped );
CheckVulkanResult( err, "vkMapMemory in Texture2D" );
const int bytesPerPixel = 4;
std::size_t dataSize = bytesPerPixel * width * height;
std::memcpy( mapped, data, dataSize );
vkUnmapMemory( GfxDeviceGlobal::device, mappableMemory );
从vkGetImageSubresourceLayout
获得的VkSubresourceLayout
将包含rowPitch
成员中纹理的音高。它很可能不等于 width
,因此,当您对整个数据块进行memcpy
时,您将相关数据复制到纹理的填充部分。
相反,您需要逐行memcpy
,跳过映射纹理中的填充内存:
const int bytesPerPixel = 4;
std::size_t dataRowSize = bytesPerPixel * width;
char* mappedBytes = (char*)mapped;
for(int i = 0; i < height; ++i)
{
std::memcpy(mapped, data, dataSize);
mappedBytes += rowPitch;
data += dataRowSize;
}
(此代码假设数据也是char *
- 未给出其声明)
for(int i = 0; i < height; ++i)
{
std::memcpy(mappedBytes, data, dataRowSize);
mappedBytes += layout.rowPitch;
data += dataRowSize;
}
相关文章:
- 在计算中使用二的幂有多有利可图
- 输出 0 和 -0 的二次公式,与给定的项无关
- 如何在不使用乘除运算符的情况下计算 A 的 B 次幂?
- 处理所有二次公式结果
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- C++ 中 pow 方法的 5 次幂错误
- Cgal二次规划目标函数
- 二次代数建议数组等返回功能
- 无法从数组二次表达式中检索数据值
- 创建二次公式求解器-范围中未声明的变量
- C++:你如何确定一个解是微不足道的还是不存在的二次函数?
- 快速获取接近2次幂的数字(浮点)
- 如何将二次贝塞尔曲线代码转换为三次贝塞尔曲线
- 为什么使用STL排序()进行二次时间排序
- omp并行用于二次筛的无优化
- 分段故障:SET C++11中的二次排序
- C++识别以像素为单位的二次和三次显示
- 在 Vulkan 中加载非二次幂纹理
- C++二次码错误
- GLSL 1.2+纹理非二次幂