使用内存创建纹理 Directx

4
我有一个指向存储像素信息的内存位置的指针。我想使用纹理或其他形式在屏幕上显示它。在DirectX 9中,是否可以从内存创建纹理?
谢谢。
以下是代码示例。
D3DLOCKED_RECT r;
HRESULT hr;
DWORD c0=D3DCOLOR_ARGB(255,0,0,0), c1=D3DCOLOR_ARGB(255,255,255,255);
DWORD *pData, 
Image[64]={c0,c0,c0,c1,c0,c0,c0,c0,
   c0,c0,c0,c1,c0,c0,c0,c0,
   c0,c0,c0,c1,c0,c0,c0,c0,
       c1,c1,c1,c1,c1,c1,c1,c0,
       c0,c0,c0,c1,c0,c0,c0,c0,
   c0,c0,c0,c1,c0,c0,c0,c0,
   c0,c0,c0,c1,c0,c0,c0,c0,
   c0,c0,c0,c0,c0,c0,c0,c0};
if (m_pDevice->CreateTexture(8,8,1,D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,   &m_pPointTexture,NULL)!=D3D_OK)
    return false;
if (m_pPointTexture->LockRect(0,&r,NULL, D3DLOCK_DISCARD |D3DLOCK_NOOVERWRITE)!=D3D_OK)
    return false;
for (int y=0; y<8; y++)
{
 pData=(DWORD*)((BYTE*)r.pBits + r.Pitch);
 for (int x=0; x<8; x++)
 pData[x]=Image[y*8+x];
}
m_pDevice->SetTexture(0,m_pPointTexture);

然后我通过绘制矩形图元来渲染它。在设置纹理之前,如果我使用D3DXSaveTextureToFile()将我的纹理保存到BMP文件中,然后使用D3DXCreateTextureFromFile()创建纹理,则可以获得预期的输出。

1个回答

5

如果是存储在内存的图像文件,请使用D3DXCreateTextureFromFileInMemory(doc)。

但是,如果只有颜色数据,请使用D3DXCreateTexture(doc)创建纹理,锁定它并手动将数据写入纹理。


我尝试过了,但结果显示为空黑屏幕。然而,当我使用D3DXSaveTextureToFile()将创建的纹理写入BMP文件,然后使用D3DXCreateTextureFromFile()从BMP加载创建的纹理时,我得到了预期的输出。你有任何想法我哪里做错了吗? - user1855338
D3DLOCK_NOOVERWRITE 只能用于顶点缓冲区,而不能用于纹理。使用 D3DLOCK_DISCARD 就足够了。此外,您还需要使用 UnlockRect 解锁纹理。除此之外,我没有看到其他问题。 - Gnietschow
哦,是的。我也使用了unlockRect,忘记提到了。现在改成了D3DLOCK_DISCARD,但问题仍然存在。 - user1855338
我搜索了一些代码,在其中我创建了一个纹理并在之后进行了操作。与你的代码的主要区别是,我使用了使用0和D3DPOOL_MANAGED创建它,并且在lockRect中没有使用任何标志。除此之外,你的代码中应该是pData=(DWORD*)((BYTE*)r.pBits + r.Pitch * y);,否则你会覆盖你的数据,因为没有正确的偏移量。 - Gnietschow
非常感谢!现在它可以工作了,问题出在使用参数上。一旦我改变了它,我得到了预期的显示效果。再次感谢。 - user1855338
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接