0

次の式が当てはまる場合、ピクセルの色が黒になるシェーダーを作成する必要があります。

(ピクセルの x 座標) mod 2 == 1

false の場合、ピクセルは白になります。そのため、ウェブを検索しましたが、うまくいきませんでした。

詳細: 解像度 800 x 600 の OpenGL シーンとその中にティーポットがあります。ティーポットは赤。次に、シマウマの外観を作成する必要があります。ここに私が書いたいくつかのコードがありますが、うまくいきませんでした:

フラグメントシェーダー:

void main(){
    if (mod(gl_FragCoord[0].x * 800.0 , 2.0) == 0){

        gl_FragColor = vec4(1.0,1.0,1.0,1.0);

    }else{
        gl_FragColor = vec4(0.0,0.0,0.0,1.0);
    }
}

頂点シェーダー:

void main(void)
{
    gl_Position = ftransform();
    gl_TexCoord[0]  =   gl_MultiTexCoord0;
}

私の知る限り、gl_FragCood.x は range(0,1) にあるため、幅を掛ける必要があります。

4

2 に答える 2

3

興味深いことに、幅を掛ける必要があると述べていますが* 800.0、そこに を入れずに試しましたか? の範囲はgl_FragCoord、隣接するピクセル間の距離が 1.0 になるようなもの[0.0, 800.0]です[0.5, 800.5]

幅の乗算を削除して、機能するかどうかを確認します。

于 2012-07-10T21:20:47.607 に答える
1

0と直接比較する代わりに、1.0に対してテストを実行してみてください。

void main(){
    if (mod(gl_FragCoord[0].x , 2.0) >= 1.0){

        gl_FragColor = vec4(1.0,1.0,1.0,1.0);

    }else{
        gl_FragColor = vec4(0.0,0.0,0.0,1.0);
    }
}

これにより、精度エラーと丸めのコストを回避できます。

emackey指摘するように、はgl_FragCoordウィンドウ座標で指定されます。これは次のとおりです。

...ビューポートによる正規化されたデバイス座標のスケーリングと変換の結果。glViewport()およびglDepthRange()のパラメーターは、この変換を制御します。ビューポートを使用すると、正規化されたデバイス座標キューブをウィンドウおよび深度バッファー内の任意の場所にマップできます。

したがって、実際には800を掛けたくありません—入力座標はすでにピクセル単位です。

于 2012-07-10T21:27:30.667 に答える