游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3614|回复: 9

请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

[复制链接]

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2007-8-12 21:28:00 | 显示全部楼层 |阅读模式
请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-8-12 21:57:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

看来我孤陋寡闻了,没用过这东西,用来做什么的?

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2007-8-12 22:48:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

创建三维纹理。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-8-13 00:52:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

三维纹理,我用的是IDirect3DCubeTexture9和VolumeTexture有什么不同吗?
我查了一下,这方面的资料似乎很少

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2007-8-13 04:02:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

请问你是怎么用IDirect3DCubeTexture9的?

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-8-13 08:48:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

IDirect3DCubeTexture9是用了六个面包围成一个立方体,可以用三维坐标寻址,获得的是这六个表面上一点的颜色。边长是a,格式是A8R8G8B8的贴图要占用空间 a * a * 6 * 32
VolumeTexture是真正的三维贴图,纹理寻址获得的是这个贴图整个空间中的一个点的颜色。边长是a,格式是A8R8G8B8的贴图要占用空间 a * a * a * 32
至于D3DXCreateVolumeTextureFromFile()第二个参数怎么设置,无能为力

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-8-13 10:23:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

hwbnet  4:00多还在奋战?牛人
这是我用的BuildCubeEnvMap,参考了微软的例子,很好用,只是效率方面.... -_-!


//创建动态的环境贴图,把场景渲染到3d的cubemap六面体的表面
void XEnvMapModel::BuildCubeEnvMap()
{
        D3DXMATRIX mProj;
        //求环境贴图成像所需要的投影矩阵,注意:是45度角的
        D3DXMatrixPerspectiveFovLH(&mProj, D3DX_PI * 0.5f, 1.0f, 0.01f, 100.0f);

        //加入了产生环境贴图的对象,需要自己来计算cubemap了
        if(mEnvXModels.size()>0)
        {
                LPDIRECT3DSURFACE9 pRTOld = NULL;
                //保存当前目标渲染表面
                HR( gd3dDevice->GetRenderTarget(0, &pRTOld ));
                LPDIRECT3DSURFACE9 pDSOld = NULL;
                //保存当前模板表面
                if( SUCCEEDED( gd3dDevice->GetDepthStencilSurface( &pDSOld ) ) )
                {
                        //更换模板表面为自己创建的模板表面
                        HR( gd3dDevice->SetDepthStencilSurface( mpDepthCubeSurface ) );
                }

                D3DXMATRIX mViewPosInv;
                D3DXMatrixIdentity(&mViewPosInv);               
                //Cube视点位于Cube的中心,Cube视点观察的对象都要变换到相对于Cube视点的位置,
                //所以需要得到一个位移的逆变换的矩阵
                mViewPosInv._41 = -mSceneWorld._41;
                mViewPosInv._42 = -mSceneWorld._42;
                mViewPosInv._43 = -mSceneWorld._43;
               
                for( int nFace = 0; nFace < 6; ++nFace )
                {
                        LPDIRECT3DSURFACE9 pSurf;
                        //得到当前需要渲染的表面
                        HR(mSelfCreateCubeEnvMap->GetCubeMapSurface( (D3DCUBEMAP_FACES)nFace, 0, &pSurf ));
                        //指定当前需要渲染的表面
                        HR(gd3dDevice->SetRenderTarget( 0, pSurf ));
                        RELEASE( pSurf );
                       
                        //分别得到CubeEnvmap六个面的观察矩阵
                        D3DXMATRIX mCubeView = GetCubeMapViewMatrix((D3DCUBEMAP_FACES) nFace);
                       
                        //被观测对象的做逆变换,变换到相对Cube视点的视图坐标系
                        D3DXMatrixMultiply(&mCubeView, &mViewPosInv, &mCubeView);
                       
                        //绘制场景到cubemap的六个面上去,形成三维的Cube环境贴图
                        HR(gd3dDevice->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0x000000ff, 1.0f, 0L ));
                        if(SUCCEEDED(gd3dDevice->BeginScene()))
                        {
                //绘制所有被加入的光线追踪也就是需要反射,绘制到环境贴图的对象
                                for(UINT i = 0; i < mEnvXModels.size(); i ++)
                                {
                                        mEnvXModels->Update(0, &mCubeView, &mProj);
                                        mEnvXModels->Draw();                               
                            }
                                HR(gd3dDevice->EndScene());
                        }
                }

                if( pDSOld )
                {
                        //恢复旧的模板表面
                        HR( gd3dDevice->SetDepthStencilSurface( pDSOld ) );
                        RELEASE( pDSOld );
                }
                //恢复之前保留的目标渲染表面
                HR( gd3dDevice->SetRenderTarget( 0, pRTOld ) );
                RELEASE( pRTOld );
        }
        //改变环境贴图的指向
    mEnvMap = mSelfCreateCubeEnvMap;
}

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2007-8-13 15:56:00 | 显示全部楼层

Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

突然想到一点:D3DXCreateVolumeTextureFromFile()和D3DXCreateTextureFromFile()一样,第二个参数就是个文件名,而这个文件是一组这样的数据:连续的N个二维纹理数据。

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-8-14 09:49:00 | 显示全部楼层

Re: Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设

tonykee: Re:请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

hwbnet  4:00多还在奋战?牛人
这是我用的BuildCubeEnvMap,参考了微软的例子,很好用,只是效率方面.... ...

这个是Cube , 不是 Volume.LZ问的是 Volume。我也想不出 Volume 是三维的 ,第二个参数是一个二维的图片文件名,怎么来制造第三维呢?

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2007-8-14 23:47:00 | 显示全部楼层

Re: 请问:D3DXCreateVolumeTextureFromFile()第二个参数怎么设置?

做了一个测试:创建一个三维纹理,向第一个面填充绿色,然后每个面颜色加0f0000h。
结果:纹理坐标Z的变化并非每个面的颜色(一个面指的是32*32的二维纹理颜色数据,按顺序排列,纯属个人推测,附EXE文件,可观察结果)。
CreateVolumeTexture(32,32,16,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,&swwl,NULL);
swwl->LockBox( 0, &LockedBox, 0, 0 );
yanse=0ff00h;
for(i=0;i<32;i++)
{
for(j=0;j<32*32;j++)
{
LockedBox.pBits[j]=yanse;//每个面填充同一中颜色
}
yanse=yanse+0f0000h;
}
swwl->UnlockBox( 0 );

sf_200781423473.rar

10.38 KB, 下载次数:

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

本版积分规则

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

GMT+8, 2026-1-25 11:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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