fwidth()tegra 3 glsl

时间:2012-12-27 03:12:42

标签: android opengl-es-2.0 glsl tegra

enter image description here

这是该程序在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实现是否正确或我的代码有问题? 上面的代码只是一个示例,仅显示着色器的错误部分。

1 个答案:

答案 0 :(得分:2)

我遇到了一个非常类似的问题,在应用了抗锯齿之后,我们的字体上显示了三角线框架伪影,仅在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

虽然远非理想,但在应用smoothstep抗锯齿时使用此宽度而不是原始fwidth允许我显示没有伪影的文本。