使用 DirectX 9,我尝试通过LPDIRECT3DTEXTURE9
以下方式创建并填充纹理。
首先,我创建纹理
IDirect3DTexture9::CreateTexture
:LPDIRECT3DTEXTURE9 pTexture; if ( FAILED( pd3dDevice->CreateTexture( MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT, 1, 0, // D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, // D3DPOOL_DEFAULT, &pTexture, NULL ) ) ) { // Handle error case }
然后,我尝试在纹理上锁定一个矩形,如下所示:
unsigned int uiSize = GetTextureSize(); D3DLOCKED_RECT rect; ARGB BlackColor = { (char)0xFF, (char)0xFF, (char)0xFF, (char)0x00 }; ::ZeroMemory( &rect, sizeof( D3DLOCKED_RECT ) ); // Lock outline texture to rect, and then cast rect to bits and use bits as outlineTexture access point if ( pTexture == NULL ) { return ERROR_NOT_INITIALIZED; } pTexture->LockRect( 0, &rect, NULL, D3DLOCK_NOSYSLOCK ); // Consider ? ARGB* bits = (ARGB*)rect.pBits; for ( unsigned int uiPixel = 0; uiPixel < uiSize; ++uiPixel ) { // Copy all black pixels only if ( compositeMask[uiPixel] == BlackColor ) { bits[uiPixel] = compositeMask[uiPixel]; } } pTexture->UnlockRect( 0 ); return ERROR_SUCCESS;
ARGB
只是一个定义如下的结构:
struct ARGB
{
char b;
char g;
char r;
char a;
bool operator==( ARGB& comp )
{
if ( a == comp.a &&
r == comp.r &&
g == comp.g &&
b == comp.b )
return TRUE;
else
return FALSE;
}
bool operator!=( ARGB& comp )
{
return !( this->operator==( comp ) );
}
};
我想要做的是根据应用程序中的算法预先计算一个像素数据数组(黑色轮廓),然后只将该组像素数据中的纯黑色像素写入我的像素数据LPDIRECT3DTEXTURE9
中,以便稍后渲染。
应用程序当前在 LockRect 调用中引发 ACCESS_VIOLATION 异常 (0xC0000005)。谁能解释为什么?
这是确切的异常详细信息:
TestApp.exe 中 0x0132F261 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000001。
位置在0x00000000
和之间变化0x00000001
……这是否暗示了什么?
另外,如果有更好的方法来做我想做的事情,那么我会全神贯注:)