游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2468|回复: 1

[DX9]LockRect DDS像素,结果渲染出的图像变成了黑色,什么原因

[复制链接]

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2013-11-28 23:48:00 | 显示全部楼层 |阅读模式
本帖最后由 书径尘 于 2013-11-29 00:07 编辑

  1. FILE* pFile = NULL;
  2. fopen_s(&pFile, "t.dds", "rb");

  3. fseek(pFile, 0, SEEK_END);
  4. int file_size = ftell(pFile);
  5. SDDS_Header* pDDSData = (SDDS_Header*)malloc(file_size);
  6. fseek(pFile, 0, SEEK_SET);
  7. fread(pDDSData, file_size, 1, pFile);
  8. fclose(pFile);

  9. char szFormat[5] = { 0 };
  10. memcpy(szFormat, &pDDSData->DDPIXELFORMAT_dwFourCC, 4);
  11. D3DFORMAT d3dFormat;

  12. if (strcmp(szFormat, "DXT1") == 0)
  13. d3dFormat = D3DFMT_DXT1;
  14. else if (strcmp(szFormat, "DXT2") == 0)
  15. d3dFormat = D3DFMT_DXT2;
  16. else if (strcmp(szFormat, "DXT3") == 0)
  17. d3dFormat = D3DFMT_DXT3;
  18. else if (strcmp(szFormat, "DXT4") == 0)
  19. d3dFormat = D3DFMT_DXT4;
  20. else if (strcmp(szFormat, "DXT5") == 0)
  21. d3dFormat = D3DFMT_DXT5;
  22. else
  23. MessageBoxA(0, "未知的DDS压缩格式!", 0, MB_OK);

  24. BYTE* pPixel = (BYTE*)pDDSData;
  25. int width = pDDSData->dwWidth;
  26. int height = pDDSData->dwHeight;

  27. D3DXCreateTexture(Device, width, height, 0, 0, d3dFormat, D3DPOOL_MANAGED, &Tex);

  28. {
  29. D3DLOCKED_RECT lockedRect;
  30. Tex->LockRect(0, &lockedRect, NULL, 0);

  31. switch (d3dFormat)
  32. {
  33. case D3DFMT_DXT1:
  34. {
  35. BYTE* pSrc = (BYTE*)pPixel;
  36. BYTE* pDst = (BYTE*)lockedRect.pBits;

  37. // 说明:DXT1的格式是每8个字节保存4×4个像素
  38. for (int h=0, h_max=height/4; h<h_max; h++)
  39. {
  40. memcpy(pDst, pSrc, width/4*8); // 拷贝4×4个像素
  41. pSrc += width/4*8;
  42. pDst += lockedRect.Pitch;
  43. }
  44. }
  45. break;
  46. }

  47. Tex->UnlockRect(0);
  48. }
复制代码

假如是读取DXT1的格式,那么以上的代码没错吧?
另我不解的是,只要不使用D3DTEXF_POINT纹理过滤,渲染就没问题,可是一旦使用了,渲染出的图像就会变成黑色,

难道要把dds的文件头数据也LockRect进纹理?
之所以把原因归结于dds像素的拷贝,是因为如果使用D3DXCreateTextureFromFile()加载纹理,那么用D3DTEXF_POINT就没问题.

纹理过滤问题.rar (336.46 KB, 下载次数: 131)


13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2013-11-29 00:19:16 | 显示全部楼层
我试了一下,把D3DXCreateTexture()函数的MipLevels参数填1就恢复正常了,奇怪,填0或者填2就会变黑,

那么要使用 Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
MipLevels参数该如何填?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 08:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表