0

フラグメント シェーダーに少し手を加えて、テクスチャ レンダリングとカラー レンダリングの両方を可能にしました。変更を行った後、すべてのテクスチャが非常にピクセル化されており (古い 8 ビット ゲームのように)、テクスチャ座標の精度を中程度まで上げなければなりませんでした。これにより、パフォーマンスも向上しました。そもそもなぜ突然精度を変更しなければならなかったのかわかりません。

「元の」シェーダーは次のとおりです。

varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;

uniform lowp float opacity;

void main(void) {
    gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}

変更後のシェーダーは次のようになります。

varying mediump vec2 TexCoordOut;
uniform sampler2D Texture;

uniform lowp vec4 color;
uniform lowp float opacity;
uniform int colorRender;

void main(void) {
    if (colorRender == 1)
    {
        gl_FragColor = color;
    } else {
        gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
    }
}
4

3 に答える 3

6

lowp最小精度は約8ビットしかないため、テクスチャが128x128以上の場合はアーティファクトが表示され始め、テクスチャが256x256より大きい場合は、一部のテクセルが完全に失われます(説明した深刻なピクセル化)。

mediump最小精度は 11 ビットであるため、最大 1024x1024 テクセルまで問題ないはずです (浮動小数点型ですが、テクスチャ座標が正規化されていない場合はピクセレーションが発生する可能性があります)。

highp最小精度は 24 ビット (IEEE 単精度浮動小数点数と同じ) であるため、さらに優れています。

これらの精度は仕様による最小値であることに注意してください。ハードウェアは、より高速な場合、これらのいずれかに対してより高い精度を使用する場合があります。

于 2012-10-02T16:17:23.983 に答える
2

mediump への切り替えによるパフォーマンスの低下を非難しますが、シェーダーに分岐も追加しました。1 つの描画呼び出しのすべてのフラグメントが常に同じパスをたどることを考えると、分岐のない 2 つの異なるシェーダーを用意する必要があります。

于 2012-10-02T19:12:12.840 に答える
1

テクスチャ座標は、フラグメントごとに個別に評価されます。ただし、精度が低いと、数値はフラグメント単位で量子化されます。これは、多くの隣接するフラグメントが、実際にはまったく同じ量子化されたテクスチャ座標に評価されることを意味します。原則として、テクスチャ座標変数の精度は、サンプリングされた方向のテクスチャ内のピクセル/テクセルの数よりも多くの量子化ステップを許可する必要があります。

于 2012-10-02T15:29:52.367 に答える