使用GL_REPEAT重复纹理而不会破坏缓存

时间:2019-07-28 20:25:35

标签: opengl caching glsl textures

我正在使用具有法线贴图,粗糙度贴图,漫反射贴图和AO贴图的纹理数组渲染大的分层地形。但是,每个地形都太大而无法进行详细纹理处理(128x128),因此我通过缩放UV并使用GL_REPEAT来重复每个纹理。当我使用比例尺时,FPS从170下降到100。NvidiaNsight报告纹理缓存的使用效率不高。

enter image description here

相对于:

enter image description here

这是着色器的重要部分:

// Uses cache ineffectively
// vec2 coord = data.Texcoord * 16.0; 
vec2 coord = data.Texcoord;

mat.Diffuse = (texture(TerrainAtlas, vec3(coord, 0)).rgb * alpha.r + texture(TerrainAtlas, vec3(coord, 5)).rgb * alpha.g);
mat.Normal = data.TBNMatrix * (texture(TerrainAtlas, vec3(coord, 1)).rgb * alpha.r + texture(TerrainAtlas, vec3(coord, 6)).rgb * alpha.g);
mat.Metalness = 0;
mat.Roughness = texture(TerrainAtlas, vec3(coord, 1)).r * alpha.r + texture(TerrainAtlas, vec3(coord, 7)).r * alpha.g;
mat.AO = texture(TerrainAtlas, vec3(coord, 2)).r * alpha.r + texture(TerrainAtlas, vec3(coord, 8)).r * alpha.g;
mat.Alpha = texture(TerrainAtlas, vec3(coord, 0)).a;

在有效使用缓存的情况下(是否无需通过增加纹理大小来手动重复),有什么方法可以重复纹理?

1 个答案:

答案 0 :(得分:0)

我将图素纹理的尺寸从1024x1024减小到256x256,这似乎可以解决问题。原来,GPU(具有2048 KB L2缓存的GTX 1080)每次重复都耗尽了缓存空间。