游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4124|回复: 11

可编程管道多纹理混合 为什么这么慢??

[复制链接]

10

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2007-4-5 13:08:00 | 显示全部楼层 |阅读模式
固定管道混合可以得到 130fps以上  可是换到 可编程管道 却只有84~95的fps
这是为什么???



//变换矩阵
float4x4 matW: WORLD;
float4x4 matV: VIEW;
float4x4 matP: PROJECTION;

// 纹理
texture        tex0 : TEXLAYER0;
texture        tex1 : TEXLAYER1;
texture        tex2 : TEXLAYER2;
texture        tex3 : TEXLAYER3;
texture        tex4 : TEXLAYER4;
texture        tex5 : TEXLAYER5;
texture        tex6 : TEXLAYER6;
texture        tex7 : TEXLAYER7;
texture        tex8 : TEXLAYER8;
texture        tex9 : TEXLAYER9;
// 输入顶点格式
struct VS_INPUT
{
    float3 pos  : POSITION;
    float4 diff : COLOR0;
    float2 tex  : TEXCOORD0;
};

// 输出顶点格式
struct VS_OUTPUT
{
    float4 pos  : POSITION;
    float4 diff : COLOR0;
    float2 tex  : TEXCOORD0;
};

// 声明名为VS的顶点着色器
VS_OUTPUT VS( VS_INPUT In )
{
    VS_OUTPUT Out = (VS_OUTPUT)0;
   
    float4x4 WorldView = mul(matW, matV);                        // matW和 matV相乘生成 WorldView矩阵
    float3 P = mul(float4(In.pos, 1), (float4x3)WorldView);     // 计算view空间的位置
    Out.pos  = mul(float4(P, 1), matP);                                // 计算投影空间的位置
    Out.diff = In.diff;                                                // 输入颜色转换为输出颜色
    Out.tex.x = In.tex.x;                                        // 纹理的X坐标不变......
    Out.tex.y = In.tex.y;                                        // 纹理的Y坐标颠倒

    return Out;
}

// 纹理采样状态
sampler Sampler = sampler_state
{
    Texture   = (tex0); AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler1 = sampler_state
{
    Texture   = (tex1);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler2 = sampler_state
{
    Texture   = (tex2);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler3 = sampler_state
{
    Texture   = (tex3);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler4 = sampler_state
{
    Texture   = (tex4);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler5 = sampler_state
{
    Texture   = (tex5); AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};
// 纹理采样状态
sampler Sampler6 = sampler_state
{
    Texture   = (tex6);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};

// 纹理采样状态
sampler Sampler7 = sampler_state
{
    Texture   = (tex7);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};
// 纹理采样状态
sampler Sampler8 = sampler_state
{
    Texture   = (tex8);AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};
// 纹理采样状态
sampler Sampler9 = sampler_state
{
    Texture   = (tex9); AddressU = WRAP; AddressV = WRAP; MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;MipMapLodBias = 0;
};


float4 PS(
    float4 Diff : COLOR0,
    float2 Tex  : TEXCOORD0) : COLOR
{
        float3 vColor = tex2D(Sampler, Tex);
        float4 vDetail1;
        float4 vfade = tex2D(Sampler1, Tex);
        float ffade = vfade.a ;
        vfade.a = 1.0f - ( vfade.r + vfade.g + vfade.b );

        vDetail1 =          vfade.r*lerp(tex2D(Sampler6, Tex),tex2D(Sampler2, Tex),ffade)
                        +vfade.g*lerp(tex2D(Sampler7, Tex),tex2D(Sampler3, Tex),ffade)
                        +vfade.b*lerp(tex2D(Sampler8, Tex),tex2D(Sampler4, Tex),ffade)
                        +vfade.a*lerp(tex2D(Sampler9, Tex),tex2D(Sampler5, Tex),ffade);


    return float4(lerp(vColor * vDetail1,vColor,Diff),1);
}


// MyShader技巧声明
technique MyShader
{
    pass P0        // 最初的0号pass
    {
        // shaders
        VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_2_0 PS();
        CullMode = none;
        ZEnable = true;
        AlphaBlendEnable = false;
        AlphaTestEnable = false;
        MultiSampleAntialias = false;
        FogEnable = false;
    }
}

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-4-6 17:47:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

你的FF和SHADER的功能肯定不一样
再说CULLMODE你设置的是NONE,而且关了好多

10

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2007-4-7 13:12:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

楼上的高手 什么是ff??
CullMode = CCW也提高不了多少效率;
我将填充率减小  一个平面 跟 CullMode = none; 效率拉不上多大关系 也大概就130fps左右
800*600

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-4-9 10:33:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

渲染的顶点有多少?如果很多的话最好把 wvp 矩阵的计算移至 cpu 中算一次传进来。这也是比较昂贵的运算。

18

主题

66

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2007-4-9 12:55:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

顶点4个

36

主题

197

帖子

197

积分

注册会员

Rank: 2

积分
197
发表于 2007-4-9 14:25:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

声明那么多贴图干什么...

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-4-9 14:44:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

除了VS和PS你还有比较大的空间可以提升外
要比较,需要看你是如何用FF实现的

另外,你确定你的texture的filter需要设置成这样吗:
MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC;

18

主题

66

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2007-4-10 13:25:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

我测试了上面代码
MinFilter = ANISOTROPIC; MagFilter = ANISOTROPIC; MipFilter = ANISOTROPIC; 这些都可以变 但效率高不了很多.

另外我发现 ps 里的计算公式到没花多少时间  但是返回计算后的颜色效率就下降了 如果返回没有混合的颜色性能还是很高 return float4(lerp(vColor * vDetail1,vColor,Diff),1);

还有 楼上的老大  FF到底是个什么东东 :~~

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-4-10 17:50:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

Fixed Function

10

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
 楼主| 发表于 2007-4-10 20:00:00 | 显示全部楼层

Re:可编程管道多纹理混合 为什么这么慢??

fixed 没做什么
                UINT nPass;
                setVS();
                /// 设定顶点声明值和顶点
                m_pd3ddev->SetVertexDeclaration( m_pDecl );

                /// 选择fx输出中使用的技巧
                m_pEffect->SetTechnique( "MyShader" );

                /// 使用fx的输出开始
                m_pEffect->Begin( &nPass, 0);
               
                /// 按照PASS 个数输出
                for( int i = 0; i < nPass ; i++ )
                {
                        m_pEffect->BeginPass( i );

                       
                                                        m_pd3ddev->SetStreamSource( ...);

                                m_pEffect->CommitChanges();
                                m_pd3ddev->SetIndices( m_IBTable.lodIB[0] );
                                m_pd3ddev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, .... );
                        }
                        m_pEffect->EndPass( );
                }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-13 00:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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