我正在研究一个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_scaled
是fsh_in_coords
的缩放版本,因此在屏幕上以更好的分辨率显示实际应用的纹理。
现在我的问题是:texture_1
和texture_2
具有相同的图片格式和尺寸(512x512)。因此,当我使用相同的坐标对它们进行采样时,计算机是否对每次调用texture(...)
进行相同的计算,直到实际采样纹理的颜色为止?或者编译器是否以某种方式单独优化它?
如果没有进行优化,是否有办法简化两个texture(...)
调用以提高代码效率?我计划将来在混合贴图中添加至少两个纹理,它们的尺寸和格式与现有texture_1
&的尺寸和格式相同。 texture_2
。
答案 0 :(得分:1)
纹理采样是通过硬件纹理单元完成的,因此无法进一步优化它。纹理查找的主要成本在于内存访问,因此您可以考虑使用mipmapping来避免缓存未命中。