游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1717|回复: 2

关于用索引缓冲与顶点缓冲指针监视缓冲区中内容的问题

[复制链接]

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
发表于 2008-5-2 18:30:00 | 显示全部楼层 |阅读模式
这是一个向索引缓冲中写数据的函数:
HRESULT InitIB()
{
if( FAILED( g_pd3dDevice->CreateIndexBuffer( (g_cxHeight-1)*(g_czHeight-1)*2 * sizeof(MYINDEX), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIB, NULL ) ) )
    {
        return E_FAIL;
    }

        MYINDEX                i;
        MYINDEX                i2;
    MYINDEX*        pI;
    if( FAILED( g_pIB->Lock( 0, (g_cxHeight-1)*(g_czHeight-1)*2 * sizeof(MYINDEX), (void**)&pI, D3DLOCK_NO_DIRTY_UPDATE ) ) )
        return E_FAIL;

        for( DWORD z = 0 ; z < g_czHeight-1 ; z++ )
        {
                for( DWORD x = 0 ; x < g_cxHeight-1 ; x++ )
                {
                        //每一次循环定义了一个四边形。按照“左侧上端三角形+右侧下端三角形”的顺序来填充索引缓冲。
                        i._0 = (z*g_cxHeight+x);
                        i._1 = (z*g_cxHeight+x+1);
                        i._2 = ((z+1)*g_cxHeight+x);
                       
                        *pI++ = i;
                        i._0 = ((z+1)*g_cxHeight+x);
                        i._1 = (z*g_cxHeight+x+1);
                        i._2 = ((z+1)*g_cxHeight+x+1);
                       
                        *pI++ = i;
                }
        }
    g_pIB->Unlock();

    return S_OK;
}
问题:
我用pI、(*pI)._1等表达式监视向缓冲中写数据的情况,i值正常,pI、(*pI)._1等表达式的值却总是为0.在顶点缓冲中也遇到同样的情况,其中MYINDEX结构定义如下:
struct MYINDEX
{
        WORD        _0, _1, _2;                /// WORD,16位索引
};
多次修改表达式,希望能够知道*pI++ = i;执行后,缓冲中数据的变话,但始终不能如愿,不知是何原因。敬请赐教。

22

主题

63

帖子

63

积分

注册会员

Rank: 2

积分
63
 楼主| 发表于 2008-5-2 18:33:00 | 显示全部楼层

Re:关于用索引缓冲与顶点缓冲指针监视缓冲区中内容的问

补充:pI中的地址值是按预料变化的,程序执行结果也是正确的,就是不能知道*pI++ = i;执行后,缓冲中数据的变化

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-5-2 20:32:00 | 显示全部楼层

Re:关于用索引缓冲与顶点缓冲指针监视缓冲区中内容的问

// 功能:返回一个顶点序号的数组,表示了正方形网格的顶点连接
// 说明:图元类型是三角形列表
// [in] numX:x方向的顶点数,正方向:右
// [in] numY:y/z方向的顶点数,正方向:上
// [in] backside:表示是否按照背面(逆时针)排列
// [out] pp:顶点序号的数组
// [out] pp的size
void TopoSquareMesh(UInt32 numX,UInt32 numY,Bool backside,UInt32 **pp,UInt32 *count)
{
    if(!pp || !count)return;
    if(numX<2 || numY<2)
    {
        *pp=null; count=0;
        return;
    }

    *count = (numX-1)*(numY-1)*6;
    UInt32 *p=new UInt32[*count];

    UInt32 BaseY=0,off=0;
    if(False==backside) // frontside
    {

        for(UInt32 y=0; y<numY-1; y++) // For y=0 To numY-2
        {
            for(UInt32 x=0; x<numX-1; x++) // For x=0 To numX-2
            {
                p[off]      = BaseY + x;
                p[off+1]    = BaseY + x+numX;
                p[off+2]    = BaseY + x+1;

                p[off+3]    = BaseY + x+numX;
                p[off+4]    = BaseY + x+numX+1;
                p[off+5]    = BaseY + x+1;

                off += 6;   // off  ==  y*(numX-1)*6 + x*6
            }

            BaseY += numX;  // BaseY ==  y*numX
        }

    }
    else //=============== backside ===========================
    {

        for(UInt32 y=0; y<numY-1; y++) // For y=0 To numY-2
        {
            for(UInt32 x=0; x<numX-1; x++) // For x=0 To numX-2
            {
                p[off+2]    = BaseY + x;
                p[off+1]    = BaseY + x+numX;
                p[off]      = BaseY + x+1;

                p[off+5]    = BaseY + x+numX;
                p[off+4]    = BaseY + x+numX+1;
                p[off+3]    = BaseY + x+1;

                off += 6;   // base  ==  y*(numX-1)*6 + x*6
            }
            BaseY += numX;  // BaseY ==  y*numX
        }
    }
    *pp=p;

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 16:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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