这是该程序在Tegra 3设备上渲染几个四边形的结果:
#extension GL_OES_standard_derivatives : enable
precision mediump float;
uniform sampler2D sampler2d;
varying vec2 textureCoord;
void main()
{
vec4 texColor = texture2D(sampler2d,textureCoord);
gl_FragColor = vec4(fwidth(texColor.a),0.0,0.0,1.0);
}
我正在使用的纹理是一个空的,透明的png,但是无论我在此纹理中放置什么,这些线框始终可见。
Mali-400设备上的相同代码可以正常工作。
有人可以告诉我Tegra fwidth实现是否正确,或者我的代码有问题吗?
上面的代码仅是一个示例,仅显示了着色器的错误部分。
最佳答案
我遇到了一个非常相似的问题,即在仅使用Tegra 3设备上应用了抗锯齿之后,三角形线框伪像显示在我们的字体上。我将问题缩小为fwidth()函数返回的结果。不幸的是,我找不到问题的根源(我希望这与导数在三角形边缘处的大小不正确有关吗?)。
但是,我确实找到了解决方法。我使用颜色更改来确定当fwidth返回的宽度大于2时出现伪像。然后,我忽略了大于.2的值,并用更合理的硬编码fwidth值替换了它们-您可能需要做些麻烦才能找到一个适合您的用例的值,对我来说0.025足够了。
为了避免在着色器代码中出现分支,我在需要时结合使用了mix和step来替换fwidth值:
mediump float dist = texture2D(Texture, TexCoordOut).a;
mediump float width = fwidth(dist);
width = mix(width, 0.025, step(0.2, width)); // if (width > 0.2) width = 0.025
虽然不理想,但是在应用平滑步抗锯齿时使用此宽度而不是原始宽度可以使我显示文本时没有任何伪像。
关于android - fwidth()积分3 glsl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14048927/