着色器 – 实时纹理遮罩

首先要记住的是使用RGBA值进行遮罩。 有了这个,你可以获得这种纹理和这种结果。

在这里输入图像说明在这里输入图像说明

但是有了这个,你最多可以在纹理内部存储4个蒙版,并且在最多4个纹理之间进行混合。

我想知道是否有一种方法来存储超过4个口罩内的纹理,并能够使用此口罩纹理混合超过4个纹理。 目标是尽可能多地在纹理中存储掩膜数据。

可能吗 ? 怎么样 ?

如果你使用点采样器作为你的纹理纹理,那么你可以存储尽可能多的ID作为纹理中的位:对于一个32位的RGBA纹理,你将能够存储128个不同的ID。 在这种情况下,由于每个ID有一位,所以几乎没有混合,因为只有0或1。

您为每个ID投入的位数越多,混合粒度越大,但当然会减less总ID的数量。 如果使用RGBA32纹理,则可以使用128位。 你可以存储128个ID为混合值“full”或“none”,或者64个ID为“full”,“half”,“none”等等 – 这些都是由你写给128位的东西来决定的,他们。

我不能指出你的白皮书/链接,因为这是我会做的事情(可能在过去做过)。 我也不会提供任何详细的代码,因为它只是有点摆弄; 没有其他的。 您在着色器中需要的function如下所示:

/* Extract the bits that refer to a particular texture id and return the blend factor. Eg if you have 4 bits per id and the bits in the texture are 1001, then the blend value would be 9/15 */ float unpack_id_blend_factor_from_texture_value( uint4 lookup_value, int id, int bits_per_id) { const int total_ids = 128/bits_per_id; const int total_ids_per_component = total_ids / 4; // get the component that contains the id, and modify int value = 0; if( id < total_ids_per_component ) { value = lookup_value.x; } else if( id < (2*total_ids_per_component) ) { value = lookup_value.y; id -= total_ids_per_component; } else if( id < (3*total_ids_per_component) ) { value = lookup_value.z; id -= 2*total_ids_per_component; } else { value = lookup_value.w; id -= 3*total_ids_per_component; } // shift the value data so that the bits used by the id are in the front uint used_bits = value >> (bits_per_id*id); // make the rest of the bits -- after the used ones -- zero used_bits &= (1 << bits_per_id) -1; // get and return the blend value return used_bits / float((1 << bits_per_id) -1); } 

现在上面应该给你一个想法如何提取的位。 您使用逆过程来填充查找纹理。