|
本帖最后由 书径尘 于 2013-11-29 00:07 编辑
- FILE* pFile = NULL;
- fopen_s(&pFile, "t.dds", "rb");
- fseek(pFile, 0, SEEK_END);
- int file_size = ftell(pFile);
- SDDS_Header* pDDSData = (SDDS_Header*)malloc(file_size);
- fseek(pFile, 0, SEEK_SET);
- fread(pDDSData, file_size, 1, pFile);
- fclose(pFile);
- char szFormat[5] = { 0 };
- memcpy(szFormat, &pDDSData->DDPIXELFORMAT_dwFourCC, 4);
- D3DFORMAT d3dFormat;
- if (strcmp(szFormat, "DXT1") == 0)
- d3dFormat = D3DFMT_DXT1;
- else if (strcmp(szFormat, "DXT2") == 0)
- d3dFormat = D3DFMT_DXT2;
- else if (strcmp(szFormat, "DXT3") == 0)
- d3dFormat = D3DFMT_DXT3;
- else if (strcmp(szFormat, "DXT4") == 0)
- d3dFormat = D3DFMT_DXT4;
- else if (strcmp(szFormat, "DXT5") == 0)
- d3dFormat = D3DFMT_DXT5;
- else
- MessageBoxA(0, "未知的DDS压缩格式!", 0, MB_OK);
- BYTE* pPixel = (BYTE*)pDDSData;
- int width = pDDSData->dwWidth;
- int height = pDDSData->dwHeight;
- D3DXCreateTexture(Device, width, height, 0, 0, d3dFormat, D3DPOOL_MANAGED, &Tex);
- {
- D3DLOCKED_RECT lockedRect;
- Tex->LockRect(0, &lockedRect, NULL, 0);
- switch (d3dFormat)
- {
- case D3DFMT_DXT1:
- {
- BYTE* pSrc = (BYTE*)pPixel;
- BYTE* pDst = (BYTE*)lockedRect.pBits;
- // 说明:DXT1的格式是每8个字节保存4×4个像素
- for (int h=0, h_max=height/4; h<h_max; h++)
- {
- memcpy(pDst, pSrc, width/4*8); // 拷贝4×4个像素
- pSrc += width/4*8;
- pDst += lockedRect.Pitch;
- }
- }
- break;
- }
- Tex->UnlockRect(0);
- }
复制代码
假如是读取DXT1的格式,那么以上的代码没错吧?
另我不解的是,只要不使用D3DTEXF_POINT纹理过滤,渲染就没问题,可是一旦使用了,渲染出的图像就会变成黑色,
难道要把dds的文件头数据也LockRect进纹理?
之所以把原因归结于dds像素的拷贝,是因为如果使用D3DXCreateTextureFromFile()加载纹理,那么用D3DTEXF_POINT就没问题.
纹理过滤问题.rar
(336.46 KB, 下载次数: 131)
|
|