关于tex2D

关于tex2D的数据结构和一些工作方式

纹理(Textures)储存数值数据,每个通道的值范围一般在0.0到1.0之间(例如rgba)。不同的纹理各自有不同的最大/最小值范围,不同的精度级别,和不同的伽马曲线,但着色器从tex2D()得到的值形式总是一个包含四个分量的浮点向量四个分量分别映射到纹理的四个通道,可以独立地访问,也可以以.rgba.xyzw的形式在HLSL中访问。所以.x.r,甚至像.ag.zxx这样的混用都是有效的。但是.xg是不允许的,在指定使用的分量时不允许同时使用xyzwrgbavalueA.x = valueB.r是允许的。

但是不是所有的纹理都包含所有4个有效的分量,有些只有RGB,或RG,或R,或者只有A。tex2D()总是返回一个float4的结构,没有保存的通道信息则取决于纹理格式返回一个0.0到1.0之间的值。大多数情况下通道值会返回0.0,但是有一些RGB纹理格式的A通道会返回1.0。

关于不同类型之间的赋值,如果将一个float4类型的右值赋予一个float类型的左值,只有第一个分量会被用到。所以,以下赋值的效果是完全一致的:

1
2
3
4
float result = float4(1, 2, 3, 4);
float result = float4(1, 2, 3, 4).x;
float result = float4(1, 2, 3, 4).r;
float result = 1;

此外,如果你习惯于以字节表示法看到颜色值,例如:从0到255的整数值。这是每个通道颜色的8位存储的文字表示,但不是它们被读取的方式。对于着色器来说,颜色值被视为一个范围为0.0到1.0,精度为1.0/255.0的浮点数。然后是sRGB,在着色器取色之前,它可能应用额外的0.0到1.0范围的伽马曲线。