- Mesaj
- 4.598
- Çözümler
- 452
- Beğeni
- 5.622
- Puan
- 5.349
- Ticaret Puanı
- 0
Projedemki eski kodları gözden geçirirken DXTCImage.cpp dosyasını ve içinde .DDS dosyalarının yüklenme şeklini vb. fark ettim. Bu dosyanın nerede kullanıldığını incelediğimde, yalnızca GrpImageTexture.cpp dosyasında kullanıldığını gördüm. Sadece tek bir yerde kullanılan bu eski ve karmaşık DXTCImage yapısı yerine, DirectXTex kütüphanesini kullanmanın daha uygun olduğunu düşündüm ve sizlerle de paylaşmak istedim. DirectXTex kütüphanesi temelinde DX11/DX12 için hazırlanmış bir kütüphanedir ve DXTCImage dosyasının yaptığı işlerin kat kat fazlasını yapma yeteneğine sahiptir. Doğrudan DirectX8/9 desteği yoktur, bu sebeple kodlarda küçük bir converter kullanacağız. Bu converter içerisine metin2 de kullanılabilecek pek çok formatı dahil ettim, eğer syserr hatası alırsanız bu kodu güncellemeniz gerekiyor demektir.
Lütfen aşağıdaki adımları dikkatlice uygulayın. Herhangi bir sorun durumunda değişiklikleri geri alın veya #ifdef makrolarını kullanın. Bu güncellemeden sonra DXTCImage.cpp ve DXTCImage.h dosyaları artık kullanılmayacaktır.
Öncelikle Visual Studio > EterImageLib > DXTCImage.cpp ve DXTCImage.h dosyalarını seçin ve projeden kaldırın.
GrpImageTexture.h açın ve silin:
GrpImageTexture.cpp açın ve silin:
Aynı dosyanın en üst kısımlarına ekleyin:
Aynı dosyada CreateFromMemoryFile fonksiyonunu bulun ve tamamen değiştirin:
UserIterface.cpp içine ekleyin:
DİPNOT: Sağladığım arşivdeki .lib dosyalarını Release ve Debug mod için gerekli temel ayarları içerecek şekilde derledim. Projenizde farklılıklar varsa veya herhangi bir nedenle kendiniz derlemek istiyorsanız:
Linkleri görebilmek için
giriş yap veya kayıt ol.
Lütfen aşağıdaki adımları dikkatlice uygulayın. Herhangi bir sorun durumunda değişiklikleri geri alın veya #ifdef makrolarını kullanın. Bu güncellemeden sonra DXTCImage.cpp ve DXTCImage.h dosyaları artık kullanılmayacaktır.
Öncelikle Visual Studio > EterImageLib > DXTCImage.cpp ve DXTCImage.h dosyalarını seçin ve projeden kaldırın.
GrpImageTexture.h açın ve silin:
C++:
#include "../eterImageLib/DXTCImage.h"
bool CreateDDSTexture(CDXTCImage & image, const BYTE * c_pbBuf);
GrpImageTexture.cpp açın ve silin:
C++:
bool CGraphicImageTexture::CreateDDSTexture (CDXTCImage& image, const BYTE* /*c_pbBuf*/)
{
[...]
}
Aynı dosyanın en üst kısımlarına ekleyin:
C++:
#include <DirectXTex.h>
D3DFORMAT DXGI_to_D3D9_Format(DXGI_FORMAT format) // Kaiser: DX11 formats to D3D9
{
switch (format)
{
// Compressed Formats (DXT)
case DXGI_FORMAT_BC1_UNORM:
case DXGI_FORMAT_BC1_UNORM_SRGB:
return D3DFMT_DXT1;
case DXGI_FORMAT_BC2_UNORM:
case DXGI_FORMAT_BC2_UNORM_SRGB:
return D3DFMT_DXT3;
case DXGI_FORMAT_BC3_UNORM:
case DXGI_FORMAT_BC3_UNORM_SRGB:
return D3DFMT_DXT5;
// Standart Color Formats
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return D3DFMT_A8R8G8B8;
case DXGI_FORMAT_B8G8R8X8_UNORM:
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
return D3DFMT_X8R8G8B8;
case DXGI_FORMAT_R8G8B8A8_UNORM:
return D3DFMT_A8B8G8R8;
// Legacy Formats (Effects etc.)
case DXGI_FORMAT_B5G6R5_UNORM:
return D3DFMT_R5G6B5;
case DXGI_FORMAT_B5G5R5A1_UNORM:
return D3DFMT_A1R5G5B5;
case DXGI_FORMAT_B4G4R4A4_UNORM:
return D3DFMT_A4R4G4B4;
case DXGI_FORMAT_A8_UNORM:
return D3DFMT_A8;
case DXGI_FORMAT_R8_UNORM:
return D3DFMT_L8; // Luminance
case DXGI_FORMAT_R8G8_UNORM:
return D3DFMT_A8L8; // Or V8U8
default:
return D3DFMT_UNKNOWN;
}
}
Aynı dosyada CreateFromMemoryFile fonksiyonunu bulun ve tamamen değiştirin:
C++:
bool CGraphicImageTexture::CreateFromMemoryFile(UINT bufSize, const void* c_pvBuf, D3DFORMAT d3dFmt, DWORD dwFilter)
{
assert(ms_lpd3dDevice != NULL);
assert(m_lpd3dTexture == NULL);
const uint8_t* ddsData = (const uint8_t*)c_pvBuf;
size_t ddsSize = (size_t)bufSize;
DirectX::TexMetadata metadata;
DirectX::ScratchImage scratchImage;
HRESULT hr = DirectX::GetMetadataFromDDSMemory(ddsData, ddsSize, DirectX::DDS_FLAGS_NONE, metadata);
if (SUCCEEDED(hr))
{
hr = DirectX::LoadFromDDSMemory(ddsData, ddsSize, DirectX::DDS_FLAGS_NONE, &metadata, scratchImage);
if (FAILED(hr))
{
TraceError("CreateFromMemoryFile: DirectXTex LoadFromDDSMemory failed");
return false;
}
// Convert to D3D9
D3DFORMAT targetFmt = DXGI_to_D3D9_Format(metadata.format);
if (targetFmt == D3DFMT_UNKNOWN)
{
// Unknown format
TraceError("CreateFromMemoryFile: Unsupported DDS format conversion");
/* or
Kaiser: Experimental!
If a specific format is required, force that format:
targetFmt = (d3dFmt != D3DFMT_UNKNOWN) ? d3dFmt : D3DFMT_A8R8G8B8;
*/
}
int mipmapCount = (int)metadata.mipLevels;
D3DPOOL pool = D3DPOOL_MANAGED;
DWORD usage = 0;
if (FAILED(ms_lpd3dDevice->CreateTexture(
(UINT)metadata.width,
(UINT)metadata.height,
mipmapCount,
usage,
targetFmt,
pool,
&m_lpd3dTexture,
NULL)))
{
TraceError("CreateFromMemoryFile: Cannot create D3D9 texture via DirectXTex info");
return false;
}
// Copy data (including mipmaps)
for (size_t i = 0; i < metadata.mipLevels; ++i)
{
const DirectX::Image* img = scratchImage.GetImage(i, 0, 0);
if (!img) continue;
D3DLOCKED_RECT lockedRect;
if (FAILED(m_lpd3dTexture->LockRect((UINT)i, &lockedRect, NULL, 0)))
{
TraceError("CreateFromMemoryFile: Cannot lock texture for copying");
continue;
}
// For DXT formats (Block Compression)
if (DirectX::IsCompressed(metadata.format))
{
size_t numBytes = img->slicePitch;
if (numBytes > 0)
{
memcpy(lockedRect.pBits, img->pixels, numBytes);
}
}
else
{
// (ARGB etc.)
BYTE* pDest = (BYTE*)lockedRect.pBits;
const BYTE* pSrc = img->pixels;
size_t rowPitch = img->rowPitch;
size_t height = img->height;
size_t copySize = (rowPitch < (size_t)lockedRect.Pitch) ? rowPitch : (size_t)lockedRect.Pitch;
for (size_t y = 0; y < height; ++y)
{
memcpy(pDest, pSrc, copySize);
pDest += lockedRect.Pitch;
pSrc += rowPitch;
}
}
m_lpd3dTexture->UnlockRect((UINT)i);
}
m_width = (UINT)metadata.width;
m_height = (UINT)metadata.height;
}
else
{
// Kaiser: Old Method >>>>>>
D3DXIMAGE_INFO imageInfo;
if (FAILED(D3DXCreateTextureFromFileInMemoryEx(
ms_lpd3dDevice,
c_pvBuf,
bufSize,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
0,
d3dFmt,
D3DPOOL_MANAGED,
dwFilter,
dwFilter,
0xffff00ff,
&imageInfo,
NULL,
&m_lpd3dTexture)))
{
TraceError("CreateFromMemoryFile: Cannot create texture (D3DX Fallback failed)");
return false;
}
m_width = imageInfo.Width;
m_height = imageInfo.Height;
}
m_bEmpty = false;
return true;
}
UserIterface.cpp içine ekleyin:
C++:
#pragma comment( lib, "python27.lib" )
..
..
#ifdef _DEBUG // Ekle
#pragma comment( lib, "DirectXTex_debug.lib" )
#else
#pragma comment( lib, "DirectXTex_release.lib" )
#endif
DİPNOT: Sağladığım arşivdeki .lib dosyalarını Release ve Debug mod için gerekli temel ayarları içerecek şekilde derledim. Projenizde farklılıklar varsa veya herhangi bir nedenle kendiniz derlemek istiyorsanız:
Linkleri görebilmek için
giriş yap veya kayıt ol.