1

フラグメント シェーダーを使い始めたばかりで、いくつかの単純なプラズマ エフェクトを実行した後、行き詰まりました。フラグメントの X、Y、Z を取得できることは既に知っていますが、Z に従ってフラグメントに色を付けるシェーダーを構築することを考えていました。

これが私がこれまでに持っているものです:

void main() {
    float z = gl_FragCoord.z;
    float t = (sin(z) + 1) * 0.5;

    gl_FragColor = vec4(t, t, t, 1);
}

問題は、これを三角形でテストしていて、どのように回転させても同じ一定の色を持っているため、自分自身に (そして SO で) 自問し始めていることです: なぜ三角形は 1 つの単一色なのですか? この Z はフラグメント単位ではないのでしょうか?

4

1 に答える 1

2

gl_FragCoord の z 座標は、0 と 1 の間で正規化されます (0 はニアプレーンに対応し、1 はファープレーンに対応します)。透視投影を使用すると、このマッピングは非線形であり、ニアプレーンが優先されます。これは、三角形が回転しても同じ色にマッピングされる可能性が高いことを意味します。

あなたの一般的なアイデアがうまく機能することを指摘する価値があります(私のGLSLシェーダーエディターで作成されました): http://goo.gl/32Voo

ここでは、深度の視覚化を向上させるために直交投影を使用していることに注意してください。投影に切り替えると、色がほぼ同じになります (数パーセントしか変化しません)。

于 2012-10-21T12:47:29.443 に答える