游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2425|回复: 5

创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

[复制链接]

5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2007-5-20 12:12:00 | 显示全部楼层 |阅读模式
我用纹理贴一个表面,然后取到跟纹理联系的 表面以装载数据,发现纹理图象宽度发生变化,所以纹理图象显示不正确.请问是什么原因?

这是我的代码:

        D3DXCreateTexture(g_pd3dDevice,
        160,//width
        512,// height
        0,  // number of mip levels(0 - a complete mipmap chain is created)
        0,  // usage
        D3DFMT_L8,// format
        D3DPOOL_MANAGED, // pool(cannot be D3DPOOL_DEFAULT here)
        &g_pTexture);

           g_pd3dDevice->SetTexture( 0, g_pTexture );
   
// 上面设定了纹理图象宽度为 160, 高度为 512,
// 但是当我想向纹理图象中 写数据,这样产生变化的纹理图案时候:用下面代码:

          LPDIRECT3DSURFACE9 pRenderSurface = NULL;

        g_pTexture->GetSurfaceLevel(0, &pRenderSurface);  // 纹理对应表面
        D3DSURFACE_DESC surfaceDesc;
        pRenderSurface->GetDesc(&surfaceDesc);

        D3DLOCKED_RECT lockedRect;
        pRenderSurface->LockRect(&lockedRect, 0, 0); // entire surface

                  BYTE* imageData = (BYTE*)lockedRect.pBits;
                  for(int i = 0; i < surfaceDesc.Height; i++)
        {
            for(int j = 0; j < surfaceDesc.Width; j++)    // 实际测量得到 256? 为什么。不是160?
            {
                   int index = i * lockedRect.Pitch  + j;   // 实际测量得到 Pitch 是 256,非160。

                imageData[index] = // 付实际数据
            }
        }

        pRenderSurface->UnlockRect();

但是发现 整个纹理图象(160*512)被放到 120*512 大小中的左边3/4,而右边并排的1/4是左边重复的内容。

我希望的是 160 *512 整个放到屏幕上。这是什么问题呢/

我发现如果改变数据宽度为 128 或更小,那么就没问题。可是我有这么多数据啊要都显示. 我跟踪发现,表面锁定后宽度实际是 256 不是 160 这是怎么回事?

开始设备设置是:
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
    g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );

    g_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
    g_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
    g_pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);


请问原因在哪里?

非常感谢!



0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2007-5-20 12:15:00 | 显示全部楼层

Re:创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

因?椤?60 不是 2的乘?纭 
??D的高跟?? 必?要 2 4 8 16 32 64  128 256 512 1024 2048 4096
要把Texture ?成是一??容器

160 的只能放入256的容器
然後你要想?法算出RECT的UV,而不是?整??Texture

5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2007-5-20 14:45:00 | 显示全部楼层

Re:创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

谢谢回答.

但是我 要是用一个 160*512 大小的BMP文件来作为 TEXTURE,则可以完全整幅显示出来。所以不一定是一定要2 的整数次方.

另一个地方,有人回答说。要把参数设置成为 NONPOW2CONDITIONAL 或 D3DX_NOPOW2 ? 就可以 长宽都不用是 2的整数次方了.但是我不知道在哪里设置.急啊.

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-5-20 15:26:00 | 显示全部楼层

Re:创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

不使用mipmap就可以

5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2007-5-20 16:42:00 | 显示全部楼层

Re:创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

我可以定位到问题在哪里了,是在 GetDsc 以后,因为我自己先生成一个 160*512 的BMP图象,可以完整的作为纹理贴上来,但是当我 改变纹理内容时候.发现宽度改变了:

if(FAILED( D3DXCreateTextureFromFileEx(  
                                 g_pd3dDevice,
                                 "chess.bmp",  
                                 D3DX_DEFAULT_NONPOW2,
                                 D3DX_DEFAULT_NONPOW2,
                                 D3DX_FROM_FILE,
                                 0,
                                 D3DFMT_L8,
                                 D3DPOOL_MANAGED,
                                 D3DX_DEFAULT ,
                                 D3DX_FILTER_NONE,
                                 0,
                                 NULL,
                                 NULL,
                                 &g_pTexture)))

可以看到完整的贴的纹理.
但是

LPDIRECT3DSURFACE9 pRenderSurface = NULL;

g_pTexture->GetSurfaceLevel(0, &pRenderSurface);  // 纹理对应表面
D3DSURFACE_DESC surfaceDesc;
pRenderSurface->GetDesc(&surfaceDesc);

D3DLOCKED_RECT lockedRect;
pRenderSurface->LockRect(&lockedRect, 0, 0); // entire surface

           BYTE* imageData = (BYTE*)lockedRect.pBits;
           for(int i = 0; i < surfaceDesc.Height; i++)
{
    for(int j = 0; j < surfaceDesc.Width; j++)    // 实际测量得到 256? 为什么。不是160?
    {
            int index = i * lockedRect.Pitch  + j;   // 实际测量得到 Pitch 是 256,非160。

imageData[index] = // 付实际数据
    }
}

论然是 256,不是 160. 这是什么原因?

我要动态改变纹理..所以每隔一段时间改变里面的数值,但是不想变宽度呀.

帮帮忙..



5

主题

12

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2007-5-21 09:16:00 | 显示全部楼层

Re:创建 Texture 时候宽度自动发生变化? 请帮忙,火急....

有没人帮  帮 我啊,谢谢。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 09:22

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表