Direct3D纹理采样非常慢


9

因此,我使用Direct3D 9编写了一个小型游戏,并且针对地形使用了多重纹理。我要做的是对3个纹理和一个混合贴图进行采样,并基于混合贴图的颜色通道从这三个纹理中获取整体颜色。无论如何,当我对1个以上的纹理进行采样时,我的帧速率会大幅下降,我将从120+ fps降至不到50 fps。

这是造成速度下降的HLSL代码:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

我做错了吗?如果任何人有任何有关纹理采样的信息或技巧,那都很好。

谢谢。


你有什么硬件?四个纹理样本在任何新硬件上都不应该成为问题。
Axel Gneiting

我有一台Radeon X1950,是的,如果没有,它已经有几年了。我猜这可能不是最好的硬件。你怎么看 ?
点点

Answers:


9

如果要加快处理速度,可以使用称为纹理图集的方法。

Wikipedia —纹理图集是一个大型图像,即“地图集”,其中包含许多较小的子图像,每个子图像都是3D对象某些部分的纹理。可以通过在图集上修改对象的uvmap的纹理坐标来渲染子纹理,从本质上告诉它纹理位于图像的哪一部分。在经常使用许多小纹理的应用程序中,将纹理存储在纹理图集中,该图集被图形硬件视为一个单元。

对于GPU而言,对单个大纹理进行4次采样比对4个图像进行一次采样更为有效。这是一个地形纹理图集的示例。

替代文字


1
感谢您的建议,我已经使用纹理图集实现了我的着色器,现在“仅”获得了109fps,但是与我获得的55fps相比,这是一个很好的改进。谢谢!
点点

1
+1是个好答案。请问您在哪里得到该纹理图集图像?它是专有的还是免费使用的?
卡梅伦

4

要考虑的另一件事是纹理格式。它是原始的32bpp纹理吗?如果是这样,请考虑使用压缩的DXT1纹理,该纹理为4位/像素(占用空间的1/8),如果需要alpha通道,则使用DXT5,为8位/像素。

减少纹理数据的大小应导致减少对纹理内存带宽的需求,并提高纹理缓存的性能。

另外,请检查您是否未设置最高质量的各向异性过滤-这会增加一定的成本。


谢谢你的建议,我下次再试。
dotminic 2011年

3

您的纹理有贴图吗?

没有mipmapping,纹理采样可能会特别昂贵(缓存未命中的负载)


是的,纹理具有mipmap,我从DirectX纹理工具将它们导出为* .dds。但是他们如何在遍布各处的高清纹理负载的商业游戏中使用纹理?我仅采样1个纹理图集,并在渲染地形时获得109 fps的帧频,所有这些均在gpu上进行。
点点
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.