游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: TaoshaGod

我正在学习凹凸贴图技术,请各位指点

[复制链接]

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-25 18:02:00 | 显示全部楼层

Re: Re:我正在学习凹凸贴图技术,请各位指点

lly20000: Re:我正在学习凹凸贴图技术,请各位指点

到我的主页上去看看上面有在.x文件上实现法线贴图的效果源码
http://blog.gameres.com/show.asp?BlogID=1158&column=0

哈哈,我在程序里实现了,和你在 .x 文件中的代码几乎一模一样^_^

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-25 18:02:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

凹凸贴图还有一种实现方法是用 高度图,哪位大虾能给个例子(DX里的例子全给封装起来了,看了就火大)

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-25 21:04:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

说错了,是深度贴图

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-26 09:14:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

。。。。。。
没人回答
我顶-_-!

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-26 14:02:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

DX SDK 下有一个函数 InitBumpMap,它的代码如下:
    LPDIRECT3DTEXTURE8 psBumpSrc = m_pEarthBumpTexture;
    D3DSURFACE_DESC    d3dsd;
    D3DLOCKED_RECT     d3dlr;

    psBumpSrc->GetLevelDesc( 0, &d3dsd );
    // Create the bumpmap's surface and texture objects
    if( FAILED( m_pd3dDevice->CreateTexture( d3dsd.Width, d3dsd.Height, 1, 0,
        m_BumpMapFormat, D3DPOOL_MANAGED, &m_psBumpMap ) ) )
    {
        return E_FAIL;
    }

    // Fill the bits of the new texture surface with bits from
    // a private format.
    psBumpSrc->LockRect( 0, &d3dlr, 0, 0 );
    DWORD dwSrcPitch = (DWORD)d3dlr.Pitch;
    BYTE* pSrcTopRow = (BYTE*)d3dlr.pBits;
    BYTE* pSrcCurRow = pSrcTopRow;
    BYTE* pSrcBotRow = pSrcTopRow + (dwSrcPitch * (d3dsd.Height - 1) );

    m_psBumpMap->LockRect( 0, &d3dlr, 0, 0 );
    DWORD dwDstPitch = (DWORD)d3dlr.Pitch;
    BYTE* pDstTopRow = (BYTE*)d3dlr.pBits;
    BYTE* pDstCurRow = pDstTopRow;
    BYTE* pDstBotRow = pDstTopRow + (dwDstPitch * (d3dsd.Height - 1) );

    for( DWORD y=0; y<d3dsd.Height; y++ )
    {
        BYTE* pSrcB0; // addr of current pixel
        BYTE* pSrcB1; // addr of pixel below current pixel, wrapping to top if necessary
        BYTE* pSrcB2; // addr of pixel above current pixel, wrapping to bottom if necessary
        BYTE* pDstT;  // addr of dest pixel;

        pSrcB0 = pSrcCurRow;

        if( y == d3dsd.Height - 1)
            pSrcB1 = pSrcTopRow;
        else
            pSrcB1 = pSrcCurRow + dwSrcPitch;

        if( y == 0 )
            pSrcB2 = pSrcBotRow;
        else
            pSrcB2 = pSrcCurRow - dwSrcPitch;

        pDstT = pDstCurRow;

        for( DWORD x=0; x<d3dsd.Width; x++ )
        {
            LONG v00; // Current pixel
            LONG v01; // Pixel to the right of current pixel, wrapping to left edge if necessary
            LONG vM1; // Pixel to the left of current pixel, wrapping to right edge if necessary
            LONG v10; // Pixel one line below.
            LONG v1M; // Pixel one line above.

            v00 = *(pSrcB0+0);
            
            if( x == d3dsd.Width - 1 )
                v01 = *(pSrcCurRow);
            else
                v01 = *(pSrcB0+4);
            
            if( x == 0 )
                vM1 = *(pSrcCurRow + (4 * (d3dsd.Width - 1)));
            else
                vM1 = *(pSrcB0-4);
            v10 = *(pSrcB1+0);
            v1M = *(pSrcB2+0);

            LONG iDu = (vM1-v01); // The delta-u bump value
            LONG iDv = (v1M-v10); // The delta-v bump value

            // The luminance bump value (land masses are less shiny)
            WORD uL = ( v00>1 ) ? 63 : 127;

            switch( m_BumpMapFormat )
            {
                case D3DFMT_V8U8:
                    *pDstT++ = (BYTE)iDu;
                    *pDstT++ = (BYTE)iDv;
                    break;

                case D3DFMT_L6V5U5:
                    *(WORD*)pDstT  = (WORD)( ( (iDu>>3) & 0x1f ) <<  0 );
                    *(WORD*)pDstT |= (WORD)( ( (iDv>>3) & 0x1f ) <<  5 );
                    *(WORD*)pDstT |= (WORD)( ( ( uL>>2) & 0x3f ) << 10 );
                    pDstT += 2;
                    break;

                case D3DFMT_X8L8V8U8:
                    *pDstT++ = (BYTE)iDu;
                    *pDstT++ = (BYTE)iDv;
                    *pDstT++ = (BYTE)uL;
                    *pDstT++ = (BYTE)0L;
                    break;
            }

            // Move one pixel to the right (src is 32-bpp)
            pSrcB0+=4;
            pSrcB1+=4;
            pSrcB2+=4;
        }

        // Move to the next line
        pSrcCurRow += dwSrcPitch;
        pDstCurRow += dwDstPitch;
    }

    m_psBumpMap->UnlockRect(0);
    psBumpSrc->UnlockRect(0);

这一段的作用是什么?把深度图转换成法线图吗?

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
 楼主| 发表于 2005-7-26 15:45:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

刚才再仔细看了代码,果然是把深度图转换成法线图

2

主题

177

帖子

177

积分

注册会员

Rank: 2

积分
177
发表于 2005-7-26 16:13:00 | 显示全部楼层

Re:我正在学习凹凸贴图技术,请各位指点

凸凹的方法有很多啊,parallax mapping,relief mapping,offset mapping,等等,你可以搜一下

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2005-7-26 20:42:00 | 显示全部楼层

Re: Re:我正在学习凹凸贴图技术,请各位指点

TaoshaGod: Re:我正在学习凹凸贴图技术,请各位指点

凹凸贴图还有一种实现方法是用 高度图,哪位大虾能给个例子(DX里的例子全给封装起来了,看了就火大)

dx的例子虽然封装了,但是关键代码就那么一个文件。
是一些实现了的虚函数,不是什么大问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-26 14:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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