游戏开发论坛

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

想问一下DirectX例子HDRCubeMap的一些问题

[复制链接]

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2009-2-11 12:14:00 | 显示全部楼层 |阅读模式
  我最近在模仿DirectX例子HDRCubeMap做反射效果,但不知道哪里出了错误,反射效果出不来。步骤如下:
1、创建 IDirect3DCubeTexture9:
    hr = pDev->CreateCubeTexture( ENVMAPSIZE,
                                        1,
                                        D3DUSAGE_RENDERTARGET,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_DEFAULT,
                                        & m_pReflectCubeTex,
                                        NULL );
2、把环境渲染到IDirect3DCubeTexture9的六个表面:
        LPDIRECT3DSURFACE9 pSufRTBackup;        //RenderTarget 备份
        LPDIRECT3DSURFACE9 pSufDSBackup;        //DepthStencilSurface 备份

        pDev->GetRenderTarget( 0, & pSufRTBackup);

        if( SUCCEEDED( pDev->GetDepthStencilSurface( & pSufDSBackup) ) )
        {
                pDev->SetDepthStencilSurface( m_pSurfDepthCube);
        }


        //设置视口投影矩阵
        LPDIRECT3DSURFACE9 pSurf;
        D3DXMATRIXA16 mView, mProj;
        D3DXMATRIXA16 mViewDir( * GCameraManager::GetInstance()->GetCamera()->GetViewMatrix() );
        mViewDir._41 = mViewDir._42 = mViewDir._43 = 0.0f;

    D3DXMatrixPerspectiveFovLH( &mProj, D3DX_PI * 0.5f, 1.0f, 0.01f, 10000.0f );

        //渲染Cube 6个表面
        for( int iFace = 0; iFace < 6; ++iFace)
        {
                V( m_pReflectCubeTex->GetCubeMapSurface( ( D3DCUBEMAP_FACES) iFace, 0, & pSurf));
                V( pDev->SetRenderTarget( 0, pSurf));

                mView = DXUTGetCubeMapViewMatrix( iFace);
                D3DXMatrixMultiply( & mView, & mViewDir, & mView);

                V( pDev->Clear( 0L, NULL, D3DCLEAR_ZBUFFER, 0x000000ff, 1.0f, 0L ));

                //if( SUCCEEDED( pDev->BeginScene() ) )
                //{
                        //渲染环境
                //        pDev->EndScene();
                //}

                SAFE_RELEASE( pSurf);
        }

        //恢复设置
        if( pSufDSBackup)
        {
                pDev->SetDepthStencilSurface( pSufDSBackup);
                SAFE_RELEASE( pSufDSBackup);
        }

        pDev->SetRenderTarget( 0, pSufRTBackup);
        SAFE_RELEASE( pSufRTBackup);

3、把IDirect3DCubeTexture9贴图映射到反射物体上:
        D3DXMATRIXA16 mWorld, mView, mProj, mWorldView;
        CBaseCamera * pCamera = GCameraManager::GetInstance()->GetCamera();

        :3DXMatrixTranslation( & mWorld, 0.0f, 0.0f, 0.0f);
        mView = * pCamera->GetViewMatrix();
        mProj = * pCamera->GetProjMatrix();
        ::D3DXMatrixMultiply( & mWorldView, & mWorld, & mView);

        GVector4 * pLightDirList = G3DSceneManager::GetInstance()->GetLightDirList();
        UINT iLightCount = G3DSceneManager::GetInstance()->GetLightCount();

        m_pEffect->SetMatrix("g_mWorldView", &mWorldView);
        m_pEffect->SetMatrix("g_mWorld", &mWorld);
        m_pEffect->SetMatrix("g_mProj", &mProj);
        m_pEffect->SetMatrix("g_mView", &mView);
        D3DXVECTOR4 vEyePos = D3DXVECTOR4(* GCameraManager::GetInstance()->GetCamera()->GetEyePt(), 0.0f);
        m_pEffect->SetVector("g_vEyePos", &vEyePos);
        m_pEffect->SetVectorArray( "g_vLightPosView", pLightDirList, iLightCount);
        m_pEffect->SetInt( "g_iLightCount", iLightCount);
        SAFE_DELETE_ARRAY( pLightDirList);
        m_pEffect->SetTexture("g_texReflect", m_pReflectCubeTex);
        m_pEffect->SetFloat("g_fReflectivity", m_fReflectivity);

4、fx文件是这样的:
#ifndef MAX_NUM_LIGHTS
#define MAX_NUM_LIGHTS 4
#endif

extern matrix                g_mWorld;
extern matrix                g_mView;
extern matrix                g_mProj;
extern matrix                g_mWorldView;

extern vector                g_vEyePos;
extern vector                g_vLightDir;

texture                                g_texReflect;
texture                                g_texRefract;

float4                                g_vLightIntensity = { 15.0f, 15.0f, 15.0f, 1.0f};
float4                                g_vLightPosView[ MAX_NUM_LIGHTS];
float                                g_fReflectivity = 0.9f;

samplerCUBE g_samReflect =
sampler_state
{
        Texture = <g_texReflect>;
        MinFilter = Linear;
        MagFilter = Linear;
        MipFilter = Linear;
};


void VS_Reflect( float4 iPos : POSITION,
        float3 iNor : NORMAL,
        out float4 oPos : POSITION,
        out float3 oEnvTex : TEXCOORD0 )
{
        //matrix g_mWorldView = mul( g_mWorld, g_mView);
        oPos = mul( iPos, g_mWorldView);
       
        float3 vN = mul( iNor, g_mWorldView);
        vN = normalize( vN);
       
        float3 vEyeR = -normalize( oPos);
       
        float3 vRef = 2 * dot( vEyeR, vN) * vN - vEyeR;
       
        oEnvTex = vRef;
       
        oPos = mul( oPos, g_mProj);
}


float4 PS_Reflect( float3 iTex : TEXCOORD0 ) : COLOR
{
        return texCUBE( g_samReflect, iTex) * g_fReflectivity;
}

technique Tec_RenderMaterial
{
        pass p0
        {
                vertexShader = compile vs_2_0 VS_Reflect();
                pixelShader = compile ps_2_0 PS_Reflect();       
        }
}



哪位高手能指点一下,谢谢!

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2009-2-11 12:54:00 | 显示全部楼层

Re: 想问一下DirectX例子HDRCubeMap的一些问题

在HDRCubeMap的例子中我还有些地方不明白:
1、例子中使用了两个 pd3dDevice->BeginScene() 和 pd3dDevice->EndScene()。
分别用于渲染环境贴图和物体实体,如果把他们都放在同一个 pd3dDevice->BeginScene() 之下渲染行吗?
2、为什么在创建贴图时使用的级别是1级,而渲染的时候获取纹理的表面是获取0级的表面:
创建纹理:
    hr = pd3dDevice->CreateCubeTexture( ENVMAPSIZE,
                                        1,
                                        D3DUSAGE_RENDERTARGET,
                                        D3DFMT_A16B16G16R16F,
                                        D3DPOOL_DEFAULT,
                                        &g_apCubeMapFp[0],
                                        NULL );
第二个参数传入的纹理级别是1,但渲染时获取纹理的表面的级别是0:
            LPDIRECT3DSURFACE9 pSurf;

            V( g_apCubeMap[nCube]->GetCubeMapSurface( (D3DCUBEMAP_FACES)nFace, 0, &pSurf ) );
            V( pd3dDevice->SetRenderTarget( 0, pSurf ) );

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-2-11 14:04:00 | 显示全部楼层

Re:想问一下DirectX例子HDRCubeMap的一些问题

创建贴图时使用的级别是1级,是指创建的mipmap是1层,如果是0级,就是创建了所有的层。而对于获取表面是0级,那就是你所拥有的那层表面了。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2009-2-11 14:52:00 | 显示全部楼层

Re:想问一下DirectX例子HDRCubeMap的一些问题

明白了,谢谢normallife!
刚发现获取到的环境贴图导出成JPG文件是有图像的(虽然还不知道是否正确了),只是渲染到反射物体上时就什么都没有,难道是我UV贴图搞错了。请问 IDirect3DCubeTexture9 的UV贴图是怎样的?

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2009-2-11 15:37:00 | 显示全部楼层

Re:想问一下DirectX例子HDRCubeMap的一些问题

原来 IDirect3DCubeTexture9 没有获取到环境贴图,请问动态获取 IDirect3DCubeTexture9 需要注意什么?

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2009-2-11 17:20:00 | 显示全部楼层

Re:想问一下DirectX例子HDRCubeMap的一些问题

问题解决啦!原来我在渲染反射物体的时候把模型的第0层纹理设成了空值,真大意。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 08:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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