游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1413|回复: 0

贴图渲染问题,急急。。。。。

[复制链接]

15

主题

28

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2009-6-17 15:43:00 | 显示全部楼层 |阅读模式
我在地形上面加一个天空球
渲染如下
        m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
        m_pD3DDevice->BeginScene();
        m_pBallSky->Render();    //天空球
        m_pBruteForce->Render(); //地形
        m_pD3DDevice->EndScene();
        m_pD3DDevice-&gtresent(NULL, NULL, NULL, NULL);
结果: 地形能正常显示,但天空球的贴图不能正常显示


注:下面分别是地形和天空球的渲染函数
1:地形渲染
void CBruteForce::Render()
{
        m_pDevice->SetFVF( BRUTEREFORCE_FVF );
        m_pDevice->SetRenderState( D3DRS_LIGHTING, false );
        m_pDevice->SetStreamSource( 0,  m_pVertexBuffer,0, sizeof( BRUTEFORCE_VERTEX ) );
        m_pDevice->SetIndices( m_pIndexBuffer );
        m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

        //设置漫反射颜色的来源(材质、漫反射顶点颜色、镜面反射顶点颜色)
        //m_pDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR2 );


        //地形纹理
        m_pDevice->SetTexture( 0, m_pTexture );
        m_pDevice->SetSamplerState( 0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
        m_pDevice->SetSamplerState( 0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
        //设置处理纹理的索引号
        m_pDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
        //材质源:当前材质
        m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        //是当前材质作为该纹理阶段的输出
        m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
        m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

        //细节纹理
        m_pDevice->SetTexture( 1, m_pDetailTex );
        m_pDevice->SetSamplerState(1,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
        m_pDevice->SetSamplerState(1,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
        //设置处理纹理的索引号
        m_pDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
        //相乘的参数1: 当前材质
        m_pDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        //相乘的参数2: 前一个材质
        m_pDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
        //颜色混合方式
        m_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_ADD );
        m_pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

        //光照图
        m_pDevice->SetTexture( 2, m_pLightTex );
        m_pDevice->SetSamplerState( 2,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
        m_pDevice->SetSamplerState( 2,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
        m_pDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 2 );
        m_pDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        m_pDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );
        m_pDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_MODULATE );
        m_pDevice->SetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

        m_pDevice->DrawIndexedPrimitive(
            D3DPT_TRIANGLELIST,
                0,
                0,
                m_iSize * m_iSize,
                0,
                ( m_iSize - 1 ) * ( m_iSize - 1) * 2 );
}

2:天空球渲染
void BallSky::Render()
{

        m_pDevice->SetRenderState(D3DRS_LIGHTING,false);
        m_pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
        m_pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
    m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

        m_pDevice->SetFVF( SKY_FVF );
    //天空
        m_pDevice->SetTexture( 0, m_pTexture );
        m_pDevice->SetSamplerState( 0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR );
        m_pDevice->SetSamplerState( 0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR );
        //设置处理纹理的索引号
        m_pDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
        //材质源:当前材质
        m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        //是当前材质作为该纹理阶段的输出
        m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
        m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

        m_pDevice->SetStreamSource( 0, m_pVertexBuffer, 0, sizeof( SSKY_VERTEX ) );
        for ( int i=0; i<m_iNumVertex/4; i++ )
        {
                m_pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*4, 2 );
        }
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 23:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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