Directx HLSL:TextureCube.SampleGrad()需要哪个DDX DDY

Directx HLSL:TextureCube.SampleGrad()需要哪个DDX DDY,directx,hlsl,Directx,Hlsl,我想知道SampleGrad函数希望TextureCube对象使用哪个DDX DDY值。 我知道这是2D纹理UV坐标的变化。所以我想,在这种情况下,这将是方向的改变。然而,情况似乎并非如此 如果我尝试使用Sample函数与SampleGrad,我会得到不同的结果: // calculate reflected ray float3 reflRay = reflect(-viewDir, normal); // reflection map lookup float3 dxr = ddx(refl

我想知道SampleGrad函数希望TextureCube对象使用哪个DDX DDY值。 我知道这是2D纹理UV坐标的变化。所以我想,在这种情况下,这将是方向的改变。然而,情况似乎并非如此

如果我尝试使用Sample函数与SampleGrad,我会得到不同的结果:

// calculate reflected ray
float3 reflRay = reflect(-viewDir, normal);
// reflection map lookup
float3 dxr = ddx(reflRay);
float3 dyr = ddy(reflRay);
return reflectionMap.SampleGrad(linearSampler, reflRay, dxr, dyr);
样本:

// calculate reflected ray
float3 reflRay = reflect(-viewDir, normal);
// reflection map lookup
return reflectionMap.Sample(linearSampler, reflRay);
样本梯度:

// calculate reflected ray
float3 reflRay = reflect(-viewDir, normal);
// reflection map lookup
float3 dxr = ddx(reflRay);
float3 dyr = ddy(reflRay);
return reflectionMap.SampleGrad(linearSampler, reflRay, dxr, dyr);

我仍然不知道DDX和DDY需要哪些值,但是如果找到一个可以接受的解决方法,可以计算我的渐变的详细程度。不幸的是,该解的质量不如具有各向异性滤波的真实样本函数

如果有人需要: 计算过程如下所述:

我的HLSL实现:

//计算反射光线 float3 REFLARY=反射viewDir,正常; //反射贴图查找 float3 dxr=ddxreflRay; 浮动3 dyr=ddyreflRay; //用于lod计算的立方体映射大小 浮动宽度、浮动高度; reflectionMap.GetDimensionsreflWidth、reflHeight; //基于raydiffs计算lod 浮动lod=CalClodgetCubeDiffRefray,dxr.xy*reflWidth,GetCubeDiffRefray,dyr.xy*reflHeight; 返回reflectionMap.samplelevellinearsample、reflRay、lod.rgb; 助手功能:

浮动功率浮动x{ 返回x*x; } //计算视图方向的纹理坐标[-1,1],xy值必须除以axisMajorValue以获得适当的[-1,1]范围。否则 //z坐标是面ID float3 GetCubeCordFloat3 viewDir,输出浮点axisMajorValue { //根据dx规范:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmPointSampling //选择输入向量的最大震级分量。将此值的震级称为AxisMajor。在平局的情况下,应出现以下优先级:Z、Y、X。 int=0; int=0; axisMajorValue=0.0; [unroll]对于int i=0;i<3;++i { 如果absviewDir[i]>=axisMajorValue { axisMajor=i; axisFlip=viewDir[i]<0.0f?1:0; axisMajorValue=absviewDir[i]; } } int faceId=axisMajor*2+axisFlip; //选择并镜像由TextureCube坐标空间定义的短轴。称此为新的2d坐标位置。 int axisMinor1=axisMajor==0?2:0;//第一个坐标是x或z int axisMinor2=3-axisMajor-axisMinor1; //通过将组件位置除以AxisMajor,将坐标投影到立方体上。 //浮点u=viewDir[axisMinor1]/axisMajorValue; //float v=-viewDir[axisMinor2]/axisMajorValue; //不要为getCubeDiff函数投影! 浮点u=viewDir[axisMinor1]; float v=-viewDir[axisMinor2]; 开关面ID { 案例0: 案例5: u*=-1.0f; 打破 案例2: v*=-1.0f; 打破 } 返回float3u,v,floatfaceId; } float3 getCubeDifffloat3光线,float3差异 { //发件人:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmLODCalculation //使用TC,确定哪个分量的大小最大,就像计算纹理位置时一样。如果任何分量相等,优先级如下:Z、Y、X。该分量的绝对值将被称为AxisMajor。 //选择并镜像由TextureCube坐标空间定义的TC短轴,以生成TC'.uv 主要原因; float3 tuv=getcubecordray,axisMajor; //选择并镜像由TextureCube坐标空间定义的偏导数向量的短轴,生成2个新的偏导数向量dX'.uv&dY'.uv。 浮动衍生主体; float3 duv=GetCubeCordDiff,导数主要值; //计算2个新的dX和dY矢量,以便将来进行计算,如下所示: //dX.uv=AxisMajor*dX'.uv-TC'.uv*导数主键/AxisMajor*AxisMajor 浮点数3; res.z=0.0; res.xy=Axismarjor*duv.xy-tuv.xy*派生主/Axismarjor*Axismarjor; 返回res*0.5; } //像素坐标中的dx,dy 浮动calcLodfloat2 dX,浮动2 dY { //发件人:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmLODCalculation 浮点数A=pow2dX.y+pow2dY.y; 浮动B=-2.0*dX.x*dX.y+dY.x*dY.y; 浮点数C=pow2dX.x+pow2dY.x; 浮点F=pow2dX.x*dY.y-dY.x*dX.y; 浮点数p=A-C; 浮点数q=A+C; 浮点数t=sqrtpow2p+pow2B; 浮动长度x=sqrtabsF*t+p/t*q+t+absF*t-p/t*q+t; 浮动长度=sqrtabsF*t-p/t*q-t+absF*t+p/t*q-t; 返回log2maxlengthX,冗长; }
我仍然不知道DDX和DDY需要哪些值,但是如果找到一个可以接受的解决方法,可以计算我的渐变的详细程度。不幸的是,此解决方案的质量不如具有各向异性滤波的真实样本函数。

如果有人需要: 计算过程如下所述:

我的HLSL实现:

//计算反射光线 float3 REFLARY=反射viewDir,正常; //反射贴图查找 float3 dxr=ddxreflRay; 浮动3 dyr=ddyreflRay; //用于lod计算的立方体映射大小 浮动宽度、浮动高度; reflectionMap.GetDimensionsreflWidth、reflHeight; //基于raydiffs计算lod 浮动lod=CalClodgetCubeDiffRefray,dxr.xy*reflWidth,GetCubeDiffRefray,dyr.xy*reflHeight; 返回reflectionMap.samplelevellinearsample、reflRay、lod.rgb; 助手功能:

浮动功率浮动x{ 返回x*x; } //计算视图方向的纹理坐标[-1,1],xy值必须除以axisMajorValue以获得适当的[-1,1]范围。否则 //z坐标是面ID float3 GetCubeCordFloat3 viewDir,输出浮点axisMajorValue { //根据dx规范:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmPointSampling //选择输入向量的最大震级分量。将此值的震级称为AxisMajor。在平局的情况下,应出现以下优先级:Z、Y、X。 int=0; int=0; axisMajorValue=0.0; [unroll]对于int i=0;i<3;++i { 如果absviewDir[i]>=axisMajorValue { axisMajor=i; axisFlip=viewDir[i]<0.0f?1:0; axisMajorValue=absviewDir[i]; } } int faceId=axisMajor*2+axisFlip; //选择并镜像由TextureCube坐标空间定义的短轴。称此为新的2d坐标位置。 int axisMinor1=axisMajor==0?2:0;//第一个坐标是x或z int axisMinor2=3-axisMajor-axisMinor1; //通过将组件位置除以AxisMajor,将坐标投影到立方体上。 //浮点u=viewDir[axisMinor1]/axisMajorValue; //float v=-viewDir[axisMinor2]/axisMajorValue; //不要为getCubeDiff函数投影! 浮点u=viewDir[axisMinor1]; float v=-viewDir[axisMinor2]; 开关面ID { 案例0: 案例5: u*=-1.0f; 打破 案例2: v*=-1.0f; 打破 } 返回float3u,v,floatfaceId; } float3 getCubeDifffloat3光线,float3差异 { //发件人:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmLODCalculation //使用TC,确定哪个分量的大小最大,就像计算纹理位置时一样。如果任何分量相等,优先级如下:Z、Y、X。该分量的绝对值将被称为AxisMajor。 //选择并镜像由TextureCube坐标空间定义的TC短轴,以生成TC'.uv 主要原因; float3 tuv=getcubecordray,axisMajor; //选择并镜像由TextureCube坐标空间定义的偏导数向量的短轴,生成2个新的偏导数向量dX'.uv&dY'.uv。 浮动衍生主体; float3 duv=GetCubeCordDiff,导数主要值; //计算2个新的dX和dY矢量,以便将来进行计算,如下所示: //dX.uv=AxisMajor*dX'.uv-TC'.uv*导数主键/AxisMajor*AxisMajor 浮点数3; res.z=0.0; res.xy=Axismarjor*duv.xy-tuv.xy*派生主/Axismarjor*Axismarjor; 返回res*0.5; } //像素坐标中的dx,dy 浮动calcLodfloat2 dX,浮动2 dY { //发件人:https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htmLODCalculation 浮点数A=pow2dX.y+pow2dY.y; 浮动B=-2.0*dX.x*dX.y+dY.x*dY.y; 浮点数C=pow2dX.x+pow2dY.x; 浮点F=pow2dX.x*dY.y-dY.x*dX.y; 浮点数p=A-C; 浮点数q=A+C; 浮点数t=sqrtpow2p+pow2B; 浮动长度x=sqrtabsF*t+p/t*q+t+absF*t-p/t*q+t; 浮动长度=sqrtabsF*t-p/t*q-t+absF*t+p/t*q-t; 返回log2maxlengthX,冗长; }