textureProjGrad()
函数根据纹理坐标、投影向量和dPdx/dPdy
值从2D纹理进行采样,可以被用于任意图形对象的着色器中。它依赖于纹理对象的采样器类型,因此在使用此函数之前必须先将纹理绑定到采样器上。
vec4 textureProjGrad(sampler2D sampler, vec3 P, vec3 dPdx, vec3 dPdy)
sampler
sampler2D
P
vec3
dPdx
P
所在表面的 x 方向上的导数。vec3
dPdy
P
所在表面的 y 方向上的导数。vec3
P.xy/P.w
指定的2D纹理的采样值。如果纹理采样器的类型为 integer 或 unsigned integer,则将返回浮点数值转换为整数值。如果采样器被配置为使用 sRGB 纹理数据,则将线性值转换为 sRGB 值。vec4
下面是一个简单的示例,它在片段着色器中使用 textureProjGrad()
函数从 2D 纹理进行采样:
#version 330
in vec2 texCoord;
out vec4 FragColor;
uniform sampler2D textureSampler;
void main()
{
// 定义投影向量的导数
vec3 dPdx = dFdx(vec3(texCoord, 1));
vec3 dPdy = dFdy(vec3(texCoord, 1));
// 从 2D 纹理进行采样
FragColor = textureProjGrad(textureSampler, vec3(texCoord,1), dPdx, dPdy);
}
在本例中,dPdx
和 dPdy
值是通过 dFdx()
和 dFdy()
函数计算出来的。这两个函数分别返回投影向量(在我们的情况下只是纹理坐标的一个矢量)相对于 x 方向和 y 方向的导数。textureProjGrad()
函数然后从采样器中获取 2D 纹理,并将纹理坐标、投影向量和导数值作为参数传递。
textureProjGrad()
函数没有默认的纹理过滤器和边界环绕方式,需要在使用之前手动指定。
textureProjGrad()
函数不支持纹理数组或立方体纹理。
极性尺度,在计算导数时,有些驱动程序的精度可能不足以保证同样的渲染结果。