以更高的Mip级别优化纹理获取

时间:2019-11-16 18:42:42

标签: performance opengl directx shader textures

比方说,我在DirectX或OpenGL中有一些着色器程序可渲染全屏四边形。在像素/片段着色器中,我在随机纹理坐标处采样了一些巨大的纹理。在一个着色器调用中,所有纹理采样都使用相同的纹理坐标,但是在不同的着色器调用中,该坐标是多种多样的。这些提取操作会导致性能下降,我什至认为由于纹理的大小,GPU纹理缓存不够大且使用效率不高。

现在我有一个理论上的问题:我是否可以通过使用一些低分辨率(例如32x32的 mask 纹理)来优化性能,这些纹理是通过映射大型纹理而构建的,如果遮罩纹理中的值是在给定的纹理坐标下,以更高的Mip级别进行缩放是不合适的,那么我就不需要在全尺寸级别0上执行纹理获取吗? HLSL中类似这样的内容(GLSL代码非常相似,但是没有[branch]属性):

float2 tc = calculateTexCoordinates();
bool performHeavyComputations = testValue(largeMipmappedTexture.SampleLevel(sampler, tc, 5));

float result = 0;

[branch]
if (performHeavyComputations)
{
    result += largeMipmappedTexture.SampleLevel(sampler, tc, 0);
}

mip级别5的大约50%的纹理像素不会通过测试。因此,许多着色器调用不应采样全尺寸纹理。

但是我在代码中引入了分支。即使不需要采样,此分支是否也会对性能造成比对全尺寸纹理采样更为严重的损害?不同的GPU的行为可能有所不同,有些甚至可能不支持分支,它们会执行两个获取而不是一个获取吗?

稍后我可以在某些机器上测试此代码,但是我的问题是理论上的。

如果无法正常使用,您还可以提出其他优化建议吗?

0 个答案:

没有答案