首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fwidth() tegra 3 glsl

fwidth() tegra 3 glsl
EN

Stack Overflow用户
提问于 2012-12-27 11:12:42
回答 1查看 782关注 0票数 2

这是这个程序在Tegra 3设备上渲染几个四边形的结果:

代码语言:javascript
复制
#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实现是否正确,或者我的代码有什么问题?上面的代码只是一个例子,只显示了着色器的错误部分。

EN

回答 1

Stack Overflow用户

发布于 2014-12-08 19:29:25

我遇到了一个非常类似的问题,只有在Tegra 3设备上应用了抗锯齿后,我们的字体上才会出现三角形线框伪影。我将问题的范围缩小到从fwidth()函数返回的结果。不幸的是,我找不到问题的根源(我希望这与导数在三角形边缘错误地变大有关?)。

然而,我确实找到了一份工作。我使用颜色变化来确定当fwidth返回的宽度大于.2时会出现伪像。然后我忽略了大于.2的值,并用一个更合理的硬编码fwidth值来替换它们-你可能需要做一些修改才能找到一个适合你的用例,对我来说0.025就足够了。

为了避免在我的着色器代码中出现分支,我在需要时使用了mix和step的组合来替换fwidth值:

代码语言:javascript
复制
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

虽然不是很理想,但在应用平滑步骤抗锯齿时,使用此宽度而不是原始fwidth,可以让我显示没有任何瑕疵的文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14048927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档