首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用图像的一部分创建directx9纹理

使用图像的一部分创建directx9纹理
EN

Stack Overflow用户
提问于 2011-10-19 00:19:33
回答 1查看 2.3K关注 0票数 1

我有一个图像(208x8),我想从它的不同区域复制8x8个方块,然后连接所有方块以创建一个IDirect3DTexture9*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-19 09:52:08

根据你想要做什么,IDirect3DDevice9::UpdateSurface或者IDirect3DDevice9::StretchRect可能会对你有所帮助。

对于像您所描述的非常小的纹理上的简单操作,使用CPU (即使用IDirect3DTexture9::LockRect)操作它们可能是有利的。对于D3D9,这通常意味着纹理将重新上载到VRAM,因此它通常仅适用于较小或不经常修改的纹理。但有时,如果你是渲染绑定的,并且你很小心在循环中的哪里更新纹理,那么就有可能隐藏这样的操作的成本,并“免费”获得它们。

为了避免VRAM上载,您可以结合适当的用法和锁定标志来使用POOL_MANAGED资源,以将资源放置在允许从CPU和GPU进行高速访问的AGP范围内,请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/ee418784(v=vs.85).aspx

如果在CPU上进行操作,请注意各种纹理格式的平铺和对齐限制。关于这一点的最好信息在SDK附带的文档中(包括几个白皮书),在线文档是不完整的。

下面是一个基本的例子:

代码语言:javascript
运行
复制
IDirect3DTexture9* m_tex = getYourTexture();
m_tex->LockRect(0, &outRect, d3dRect, D3DLOCK_DISCARD);

// Stride depends on your texture format - this is the number of bytes per texel. 
// Note that this may be less than 1 for DXT1 textures in which case you'll need 
// some bit swizzling logic. Can be inferred from Pitch and width.
int stride = 1; 
int rowPitch = outRect.Pitch;
// Choose a pointer type that suits your stride.
unsigned char* pixels = (unsigned char*)outRect.pBits;
// Clear to black.
for (int y=0; y < d3dRect.height; ++y)
{
    for (int x=0; x < d3dRect.width; ++x)
    {
        pixels[x + rowPitch * y] = 0x0;
    }
}

m_tex->UnlockRect(0);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7810489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档