首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan:加载浮点立方体纹理扭曲

Vulkan:加载浮点立方体纹理扭曲
EN

Stack Overflow用户
提问于 2022-01-18 18:57:12
回答 1查看 85关注 0票数 0

我使用的是vulkan教程代码,我为cubemap做了修改。当我使用VK_FORMAT_R8G8B8A8_UNORM时,使用以下代码:

代码语言:javascript
复制
unsigned char* pixelsArray[6];
for (int i = 0; i < 6; ++i)
{
    pixelsArray[i] = stbi_load(imageFileArray[i].c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
}

VkDeviceSize allSize = texWidth * texHeight * 4 * 6;
VkDeviceSize size = texWidth * texHeight * 4 ;

VkBufferCreateInfo bufferInfo{};
...    
bufferInfo.size = allSize ;

vkMapMemory(device, stagingBufferMemory, 0, AllSize, 0, &data);
    for(int i = 0; i < 6; ++i)
    {            
        memcpy( (char*) data + (size*i) , pixelsArray[i], static_cast<size_t>(size));           
    }
vkUnmapMemory(device, stagingBufferMemory);

VkImageCreateInfo imageInfo{};
...    
imageInfo.arrayLayers = 6;
imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;    
imageInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;

VkImageViewCreateInfo viewInfo{};
...
viewInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM;    
viewInfo.subresourceRange.layerCount = 6;

但是,当我尝试使用VK_FORMAT_R16G16B16A16_SFLOAT提供扭曲的显示和验证错误时,这段代码:

代码语言:javascript
复制
float* pixelsArray[6];
for (int i = 0; i < 6; ++i)
{
    pixelsArray[i] = stbi_loadf(imageFileArray[i].c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
}

VkDeviceSize allSize = texWidth * texHeight * 4 * 6 * 2;//  I added *2
VkDeviceSize size = texWidth * texHeight * 4 * 2;// I added *2

VkBufferCreateInfo bufferInfo{};
...    
bufferInfo.size = allSize ;

vkMapMemory(device, stagingBufferMemory, 0, AllSize, 0, &data);
    for(int i = 0; i < 6; ++i)
    {            
        memcpy( (char*) data + (size*i) , pixelsArray[i], static_cast<size_t>(size));           
    }
vkUnmapMemory(device, stagingBufferMemory);

VkImageCreateInfo imageInfo{};
...    
imageInfo.arrayLayers = 6;
imageInfo.format = VK_FORMAT_R16G16B16A16_SFLOAT;    
imageInfo.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;

VkImageViewCreateInfo viewInfo{};
...
viewInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
viewInfo.format = VK_FORMAT_R16G16B16A16_SFLOAT;    
viewInfo.subresourceRange.layerCount = 6;

当VK_FORMAT_R8G8B8A8_UNORM:

当VK_FORMAT_R16G16B16A16_SFLOAT:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-20 11:45:02

我解决了问题。问题是我想要使用一半浮动,但我发送浮动到memcpy函数。我搜索了如何使用一半浮动,我找到了一个解决方案,没有使用额外的库。

我添加了助手函数:

代码语言:javascript
复制
typedef unsigned int uint;
typedef unsigned short ushort;

uint as_uint(const float x)
{
    return *(uint*)&x;
}

ushort float_to_half(const float x)
{ 
    // IEEE-754 16-bit floating-point format (without infinity): 1-5-10, exp-15, +-131008.0, +-6.1035156E-5, +-5.9604645E-8, 3.311 digits
    const uint b = as_uint(x)+0x00001000; // round-to-nearest-even: add last bit after truncated mantissa
    const uint e = (b&0x7F800000)>>23; // exponent
    const uint m = b&0x007FFFFF; // mantissa; in line below: 0x007FF000 = 0x00800000-0x00001000 = decimal indicator flag - initial rounding
    return (b&0x80000000)>>16 | (e>112)*((((e-112)<<10)&0x7C00)|m>>13) | ((e<113)&(e>101))*((((0x007FF000+m)>>(125-e))+1)>>1) | (e>143)*0x7FFF; // sign : normalized : denormalized : saturate
}

并修复此辅助函数的问题:

代码语言:javascript
复制
VkDeviceSize size_2 = texWidth * texHeight * 4;// different from the above variables in question : allSize or size

//create half float for cubemap
void* half_pixelsArray[6];
half_pixelsArray[0] = new ushort[size_2];
half_pixelsArray[1] = new ushort[size_2];
half_pixelsArray[2] = new ushort[size_2];
half_pixelsArray[3] = new ushort[size_2];
half_pixelsArray[4] = new ushort[size_2];
half_pixelsArray[5] = new ushort[size_2];

//copy from float to half float
for (int i = 0; i < 6; ++i)
{
    for (int j = 0; j < size_2; ++j)
    {
        ((ushort*)half_pixelsArray[i])[j] =  float_to_half( pixelsArray[i][j] );
    }
}

// and change float to half flaot in memcpy
memcpy( (char*) data + (layerSize*i) , half_pixelsArray[i], static_cast<size_t>(layerSize));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70760991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档