DDS垂直翻转

"游戏引擎"

Posted by A-SHIN on July 31, 2018

“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坐标系的不同,开发过程中需要保持统一。