Xna 如何获得HLSL中的纹理大小?

Xna 如何获得HLSL中的纹理大小?,xna,textures,hlsl,Xna,Textures,Hlsl,对于我正在使用的HLSL着色器(用于实践),如果纹理坐标(在模型上)超过各自大小的一半(即x>width/2或y>height/2),我将尝试执行部分代码。我熟悉C/C++并了解HLSL的基本知识(最基本的知识)。如果没有其他解决方案,我将使用XNA手动设置纹理大小(事实上,我正在使用着色器)。有更好的解决办法吗?如果可能的话,我会尽量保持在着色器模型2.0中。默认的纹理坐标空间被标准化为0..1,因此x>width/2应该是texcoord.x>0.5在这里要小心。tex2d()和其他纹理调用

对于我正在使用的HLSL着色器(用于实践),如果纹理坐标(在模型上)超过各自大小的一半(即
x>width/2
y>height/2
),我将尝试执行部分代码。我熟悉C/C++并了解HLSL的基本知识(最基本的知识)。如果没有其他解决方案,我将使用XNA手动设置纹理大小(事实上,我正在使用着色器)。有更好的解决办法吗?如果可能的话,我会尽量保持在着色器模型2.0中。

默认的纹理坐标空间被标准化为0..1,因此
x>width/2
应该是
texcoord.x>0.5
在这里要小心。tex2d()和其他纹理调用不应在if()/else子句中。因此,如果您有一个像素着色器输入“IN.UV”并且您的目标是“OUT.color”,那么您需要这样做:

float4 aboveCol = tex2d(mySampler,some_texcoords);
float4 belowCol = tex2d(mySampler,some_other_texcoords);
if (UV.x >= 0.5) {
   OUT.color = /* some function of... */ aboveCol;
} else {
   OUT.color = /* some function of... */ belowCol;
}

而不是将tex()调用放在if()块中。

我明白了。你能告诉我为什么会这样吗?因为纹理单元跨相邻像素工作,以正确计算适当的过滤器大小/MIP级别——也就是说,它们需要评估屏幕空间X和Y中的UV方差(因此HLSL中存在ddx()和ddy()函数)。if()语句具有无限高的潜在频率。如果可以将tex2D()放在If()子句中,则会出现纹理/过滤错误。只是为了确保-您知道这在unity中是否也是正确的吗?也就是说,vertex.uv向量是一个具有0..1个条目的float2?