我目前正在尝试在HLSL中从SM2实施HW Alpha测试。
我知道有很简单的方法可以达到这个目的,即 clip(alphaVal< = alphaRef?-1:1);
然而,在尝试这些技术时,我注意到它们偏离了HW Alpha测试返回的结果(由额外的或更少的像素受影响证明)。
我目前使用的技术涉及以下操作:
float alphaVal = readFromTexture(uv).a;
float alphaRef = 0.5;
float enableLessTest = 0.0; // 1.0 (off/on)
float enableGreaterTest = 1.0;
float enableEqualTest = 0.0;
// Greater test
clip((alphaRef - alphaVal) * enableGreaterTest);
// Less test
clip((alphaVal - alphaRef) * enableLessTest);<br />
// Equal test
float equality = (alphaVal == alphaRef) ? -1 : 1
clip(equiality * enableEqualTest);
现在上面展示了所描述的问题,其中alpha测试区域边缘的像素被HW丢弃,但包含在SW版本中。
我很确定这是一个与执行此计算的精度相关的问题,我假设HW中的alpha测试使用Integer比较而不是float,但是,我试图保持此着色器ps_2兼容。
我尝试在alphaVal上执行以下操作: alphaVal = trunc(alphaVal * 255)/ 255; 没有运气。
我也试过在剪辑函数中进行地板/ truncing各种计算,但是我似乎无法获得完全正确的像素返回,总会有更多或更少的像素返回。
有没有人有任何想法?我敢肯定以前有人必须这样做过吗?
我开始怀疑这是否也可能是硬件特定的。有谁知道吗?
由于
约什