GLSL:更有效地调用多个 sampler2D 变量的纹理

GLSL: More Efficient Call to texture For Multiple sampler2D Variables

我正在处理一个 LWJGL 项目,我正在使用混合贴图对我的地形进行纹理处理。这是一个非常简单的例子:

#version 400 core

in vec3 fsh_in_normal;
in vec2 fsh_in_coords;
in vec2 fsh_in_scaled;

out vec4 fsh_out_color;

uniform sampler2D blend_map;
uniform sampler2D texture_1;
uniform sampler2D texture_2;

void main(void) {

   vec4 blend_vec = texture(blend_map, fsh_in_coords);

   vec4 color_tx1 = texture(texture_1, fsh_in_scaled);
   vec4 color_tx2 = texture(texture_2, fsh_in_scaled);

   fsh_out_color = mix(color_tx1, color_tx2, blend_vec.r);

}

fsh_in_scaledfsh_in_coords 的缩放版本,因此实际应用的纹理在屏幕上的分辨率更高。

现在我的问题是:texture_1texture_2 具有相同的图像格式和大小 (512x512)。因此,当我使用相同的坐标对它们进行采样时,计算机是否会在每次调用 texture(...) 时进行相同的计算,直到纹理的颜色被实际采样为止?还是编译器会以某种方式自行优化?

如果不优化,有没有办法精简两次texture(...)调用,让代码更高效?我确实计划在未来向混合贴图添加至少两个纹理,它们将具有与现有 texture_1 & texture_2.

相同的尺寸和格式

纹理采样是通过硬件纹理单元完成的,因此无法进一步优化。纹理查找的主要成本是内存访问,因此您可以考虑 mipmaping 以避免缓存未命中。