2

ここに画像の説明を入力

これは、このプログラムが 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 の実装が適切か、コードに問題があるかを誰か教えてもらえますか? 上記のコードは単なる例であり、シェーダーのエラー部分のみを示しています。

4

1 に答える 1

2

Tegra 3 デバイスでのみ、アンチエイリアシングが適用された後、三角形のワイヤー フレーム アーティファクトがフォントの上に表示されるという、非常によく似た問題がありました。fwidth() 関数から返される結果に問題を絞り込みました。残念ながら、私は問題の根本を見つけることができませんでした (三角形の辺で導関数が間違って大きくなっていることに関係していると思いますか?)。

しかし、私は回避策を見つけました。色の変化を使用して、fwidth によって返される幅が .2 より大きい場合にアーティファクトが表示されることを確認しました。次に、.2 より大きい値を無視し、より合理的なハードコードされた fwidth 値に置き換えました。ユース ケースに適した値を見つけるには、いじる必要があるかもしれません。私にとっては 0.025 で十分でした。

シェーダー コードで if 分岐を回避するために、必要に応じて 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 の代わりにこの幅を使用すると、アーティファクトなしでテキストを表示することができました。

于 2014-12-08T11:29:24.560 に答える