我有一个单一尺寸的四边形,使用无缝纹理和纹理重复功能进行渲染。
对于纹理坐标,我从位置得到它。 因此,我可以通过将纹理坐标乘以因子N来人为地提高纹理分辨率,这将使纹理在四倍N * N倍上重复。
在我的代码中,我的纹理是一个法线贴图,在片段着色器中有镜面光计算。而且我注意到更多的是我将纹理坐标乘以我的性能下降,但是在某个值之后似乎性能下降是恒定的(例如,N = 1024和N = 10240之间没有差异)
我不明白的是,四边形尺寸保持不变,纹理尺寸相同,为什么乘以纹理坐标会使我的性能超过相同数量的碎片?
答案 0 :(得分:4)
没有mipmapping,我使用
GL_LINEAR
来过滤min&磁过滤器。
当比例增加时,片段着色器中的相邻像素对应于纹理中相距很远的纹素。使用GL_LINEAR,这意味着纹素不仅在纹理中相距很远,而且在内存中也相差很远。
随着比例接近1:1,片段着色器中的相邻像素将从也靠近的纹素中获取。这意味着它们将在内存中靠得很近,这意味着更好的内存局部性。这需要更少的内存提取。
Mipmapped纹理没有这个问题,它们通常也看起来更好,因为它们没有你在GL_LINEAR缩小时看到的锯齿问题。
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上。