“Yeah It’s on. ”
前言
HXEngine中加载PNG和DDS时,发现贴图UV值V反转了。PNG左下角为(0,0),DDS左上角为(0,0)。如下图: gDEBugger中的texture显示,上图为PNG,下图为DDS。
正文
为保证引擎使用统一的模型UV值,则需要将其中之一的纹理数据保存时垂直方向翻转。这里对DDS数据进行垂直翻转。
for (level = 0; level < image->mipLevels; ++level)
{
swapDDS(ptr, vgl_GetDDSStride(file_header, width), height);
image->mip[level].data = ptr;
image->mip[level].width = width;
image->mip[level].height = height;
image->mip[level].depth = depth;
image->mip[level].mipStride = vgl_GetDDSStride(file_header, width) * height;
image->sliceStride += image->mip[level].mipStride;
ptr += image->mip[level].mipStride;
width >>= 1;
height >>= 1;
depth >>= 1;
}
其中swapDDS(ptr, vgl_GetDDSStride(file_header, width), height);正是对数据进行垂直翻转操作:
static void swapDDS(void * pData, size_t stride, size_t height)
{
for (size_t h = 0; h < height / 2; ++h)
{
char swapByte;
for (size_t w = 0; w < stride; ++w)
{
char* p0 = (char*)pData + h * stride + w;
char* p1 = (char*)pData + (height - 1 - h) * stride + w;
swapByte = *p0;
*p0 = *p1;
*p1 = swapByte;
}
}
}
翻转后的DDS如下图;
后记
类似的还有BMP等,由于DX和OpenGL UV坐标系的不同,开发过程中需要保持统一。