使用DirectX 9,我尝试创建并以以下方式填充LPDIRECT3DTEXTURE9纹理。
IDirect3DTexture9::CreateTexture创建了纹理:
LPDIRECT3DTEXTURE9 pTexture;如果失败( pd3dDevice->CreateTexture( MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT,1,0,// D3DUSAGE_DYNAMIC,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,// D3DPOOL_DEFAULT ),){ //句柄错误大小写}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以供稍后呈现。
应用程序当前在ACCESS_VIOLATION调用时抛出一个LockRect异常(0xC0000005)。有谁能解释一下原因吗?
以下是具体的异常细节:
在TestApp.exe: 0xC0000005:访问冲突读取位置0x00000001中0x0132F261处的未处理异常。
0x00000000和0x00000001的位置不同.这暗示了什么吗?
另外,如果有更好的方法来做我想做的事,那么我会全神贯注地听下去:)
发布于 2013-06-02 08:39:33
和你问题上的其他评论员一样,原则上我看不出你创建和锁定纹理的方式有什么问题。我自己也这样做过--在D3DPOOL_MANAGED中创建一个纹理,并使用LockRect更新内容。
然而,有三个方面使我感到关切。我发帖作为回应,因为有太多的评论,所以请容忍我……
D3DLOCK_NOSYSLOCK标志。我发现,当为多线程操作创建了D3D设备时,这可能会导致冲突。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中返回的步幅。
也许你可以根据上面的结果更新你的问题,我可以在必要时修改这个答案。
发布于 2013-06-02 23:46:40
这真是愚蠢至极。对不起大家。
我一直跟踪纹理指针,直到代码;LPDIRECT3DTEXTURE9指针实际上存储在另一个自定义纹理类对象类型中,并附加了额外的上下文数据;这些包装器对象是另一个类的成员,这些类被复制并在各处使用,但是没有为该类编写的赋值操作符或复制构造函数。在处理的大量纹理列表中,从容器类发送的纹理中有一个被发现无效,因为它实际上是无效的;它应该包含另一个纹理的副本,但只包含一个无效的指针。
为大家的不幸的业余错误感到抱歉,但是感谢你们的伟大的指点和保证。
https://stackoverflow.com/questions/16869398
复制相似问题