我想知道(扩展)GLSL是否有更有效的方法来执行以下操作:
float r_1 = texture(my_texture, uv_1).x;
float g_2 = texture(my_texture, uv_2).y;
float b_3 = texture(my_texture, uv_3).z;
float a_4 = texture(my_texture, uv_4).w;
vec4 col = vec4(r_1, g_2, b_3, a_4);
请注意,每个组件的uv坐标都不同(但是4 uv通常彼此接近)。这些是4个纹理查找,其中每个丢弃3个返回的组件,这看起来很浪费(是的,围绕这个存在瓶颈,即具有单个纹理()查找与4个查找相比在性能上有显着差异)
我看到有
gvec4 textureGatherOffsets( gsampler2D sampler, vec2 P, ivec2 offsets[4], [int comp]);
这有点朝着正确的方向发展,但它会返回未经过滤的纹理元素值,并且只能获得恒定的ivec2偏移量。
我想我正在寻找像
这样的东西 gvec4 TextureWithSeparateCoordinateForEachComponent(gsampler2D sampler, vec2 P[4]);
在扩展的GLSL(或GLSL ES)中是否有这样的东西?
//编辑: 这是一个可能每个VR应用程序都可以从中受益的功能。
答案 0 :(得分:1)
当然没有纹理功能可以做到这一点。我们也不期望会有。
请参阅,纹理存储相邻字节中每个像素的颜色通道。内存访问永远不会像一个字节那么小。至少,不是从主存储器到缓存的存储器访问。这通常在高速缓存行中完成,通常大小约为32-64字节。 连续的字节。
因此,即使您不关心该像素中的其他三个通道,对于大多数纹理格式,您仍然必须读取该数据。所以支付了费用。
完全避免额外带宽成本的唯一方法是将每个通道放在单独的纹理(或数组纹理中的单独数组层)中。当然,这需要您以这种方式生成数据。因此,如果这是来自渲染操作,则必须渲染为4个单独的图像。