gpt4 book ai didi

c++ - 使用 IDirect3DTexture9::LockRect 时出现 ACCESS_VIOLATION 异常 (0xC0000005)

转载 作者:行者123 更新时间:2023-11-28 07:35:17 25 4
gpt4 key购买 nike

我尝试使用 DirectX 9 创建并填充 LPDIRECT3DTEXTURE9 纹理,方法如下。

  1. 首先,我使用 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
    }
  2. 然后,我尝试在纹理上锁定一个矩形,如下所示:

    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。

位置在 0x000000000x00000001 之间变化......这有什么暗示吗?

此外,如果有更好的方法来做我想做的事情,那么我会洗耳恭听:)

最佳答案

与您问题的其他评论员一样,原则上我看不出您创建和锁定纹理的方式有任何问题。我自己也做过同样的事情 - 在 D3DPOOL_MANAGED 中创建纹理并使用 LockRect 更新内容。

但是,我关注三个方面。我发布作为答案,因为评论太多了,所以请多多包涵...

  1. 在锁定时使用 D3DLOCK_NOSYSLOCK 标志。我发现当为多线程操作创建 D3D 设备时,这可能会导致冲突。
  2. 您访问锁定位的方式不考虑步幅。我明白错误显然发生在这段代码之前,但无论如何都值得一提。
  3. 您正在转换到您自己的 struct 以进行像素访问,并且不清楚 struct 的实际大小可能是多少,因为我看不到您的包装选项项目。

因此,我建议您可以执行三项操作来确定是否是以上任何一项导致了问题:

首先,锁定调用只使用默认的零标志

pTexture->LockRect( 0, &rect, NULL, 0 );

其次,验证你的ARGB结构确实是4字节

ASSERT(sizeof(ARGB) == 4);

最后,除了锁定和解锁纹理外什么都不做,看看是否仍然出现运行时错误,还要检查返回码

HRESULT hr = pTexture->LockRect( 0, &rect, NULL, 0 );
ASSERT(SUCCEEDED(hr));
hr = pTexture->UnlockRect( 0 );
ASSERT(SUCCEEDED(hr));

在任何情况下,当更新纹理位时,您必须逐行进行,同时考虑从 LockRect 返回的步长调用 D3DLOCKED_RECT.Pitch

也许您可以使用上述结果更新您的问题,我可以根据需要修改此答案。

关于c++ - 使用 IDirect3DTexture9::LockRect 时出现 ACCESS_VIOLATION 异常 (0xC0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16869398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com