具有多种纹理的像素着色器 - 如何获得更好的性能?

时间:2013-10-19 14:06:48

标签: c# performance xna hlsl

我实际上正在使用C#和xna制作一个小3D游戏。由于有些事情变得相当缓慢,我开始优化这些事情。

我有一个使用多个纹理/采样器的像素着色器:

texture MountainTexture;
texture GrassTexture;
texture IceTexture;
texture SandTexture;
sampler moutain = sampler_state {
   texture = (MountainTexture);
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;
   AddressU = Wrap;
   AddressV = Wrap;
};
sampler ice = sampler_state {
   texture = (IceTexture);
   ...
};
sampler grass = sampler_state {
   texture = (GrassTexture);
   ...
};
sampler sand = sampler_state {
   texture = (SandTexture);
   ...
};

像素着色器功能对渲染的每个像素使用一个或两个采样器。我注意到,当我让着色器为每个像素仅使用其中一个采样器时,帧率提高了~x2因子。

所以我想知道: - 当我在同一个着色器中的多个采样器上使用tex2D时,GPU究竟是什么?为什么这么慢? - 使用Shader.Parameters["myTexture"].SetValue(myTexture)GraphicsDevices.Texture[10] = myTexture传递纹理有什么区别?

使用带有多个采样器的着色器时,有没有办法提高性能? (我的纹理太大,无法将它们全部放在一个纹理中)。

非常感谢!

1 个答案:

答案 0 :(得分:0)

“(我的纹理太大了,无法将它们全部放在一个纹理中)”

我说你找到了问题所在。巨大的纹理。

我可能会建议使用像http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html中的uvDetective这样的着色器来确定纹理真正需要的大小。我怀疑你把所有可能的旋钮都变成了11.不要这样做。这是一场比赛。