关于tex2D
关于tex2D的数据结构和一些工作方式
纹理(Textures)储存数值数据,每个通道的值范围一般在0.0到1.0之间(例如rgba
)。不同的纹理各自有不同的最大/最小值范围,不同的精度级别,和不同的伽马曲线,但着色器从tex2D()
得到的值形式总是一个包含四个分量的浮点向量。四个分量分别映射到纹理的四个通道,可以独立地访问,也可以以.rgba
或.xyzw
的形式在HLSL中访问。所以.x
,.r
,甚至像.ag
或.zxx
这样的混用都是有效的。但是.xg
是不允许的,在指定使用的分量时不允许同时使用xyzw
和rgba
。valueA.x = valueB.r
是允许的。
但是不是所有的纹理都包含所有4个有效的分量,有些只有RGB,或RG,或R,或者只有A。而tex2D()
总是返回一个float4
的结构,没有保存的通道信息则取决于纹理格式返回一个0.0到1.0之间的值。大多数情况下通道值会返回0.0,但是有一些RGB纹理格式的A通道会返回1.0。
关于不同类型之间的赋值,如果将一个float4
类型的右值赋予一个float
类型的左值,只有第一个分量会被用到。所以,以下赋值的效果是完全一致的:
1 | float result = float4(1, 2, 3, 4); |
此外,如果你习惯于以字节表示法看到颜色值,例如:从0到255的整数值。这是每个通道颜色的8位存储的文字表示,但不是它们被读取的方式。对于着色器来说,颜色值被视为一个范围为0.0到1.0,精度为1.0/255.0的浮点数。然后是sRGB,在着色器取色之前,它可能应用额外的0.0到1.0范围的伽马曲线。