OpenGL为什么在相同数量的碎片上重复纹理可能会降低性能?

时间:2018-05-09 11:01:30

标签: opengl

我有一个单一尺寸的四边形,使用无缝纹理和纹理重复功能进行渲染。

对于纹理坐标,我从位置得到它。 因此,我可以通过将纹理坐标乘以因子N来人为地提高纹理分辨率,这将使纹理在四倍N * N倍上重复。

在我的代码中,我的纹理是一个法线贴图,在片段着色器中有镜面光计算。而且我注意到更多的是我将纹理坐标乘以我的性能下降,但是在某个值之后似乎性能下降是恒定的(例如,N = 1024和N = 10240之间没有差异)

我不明白的是,四边形尺寸保持不变,纹理尺寸相同,为什么乘以纹理坐标会使我的性能超过相同数量的碎片?

1 个答案:

答案 0 :(得分:4)

  

没有mipmapping,我使用GL_LINEAR来过滤min&磁过滤器。

当比例增加时,片段着色器中的相邻像素对应于纹理中相距很远的纹素。使用GL_LINEAR,这意味着纹素不仅在纹理中相距很远,而且在内存中也相差很远。

随着比例接近1:1,片段着色器中的相邻像素将从也靠近的纹素中获取。这意味着它们将在内存中靠得很近,这意味着更好的内存局部性。这需要更少的内存提取。

Mipmapped纹理没有这个问题,它们通常也看起来更好,因为它们没有你在GL_LINEAR缩小时看到的锯齿问题。

在CPU上模拟它

CPU在内存提取方面遇到同样的问题。

float sum(float *arr, int size, int stride, int count) {
    int pos = 0;
    float sum = 0.0f;
    for (int i = 0; i < count; i++) {
        pos = (pos + stride) % size;
        sum += arr[pos];
    }
    return sum;
}

随着stride的增加,性能会变差。出现这种情况的原因与片段着色器性能变差的原因相同,即使它发生在CPU上。