1

GPU Gems 3 の第 27 章で説明されているモーション ブラー ポスト プロセッシング エフェクトを実装しようとしましたが、カメラを動かすとブラーがジッターし、期待どおりに動作しないため、問題が発生しています。これは私のフラグメントシェーダーです:

varying vec3 pos;
varying vec3 normal;
varying vec2 tex;
varying vec3 tangent;
uniform mat4 matrix;
uniform mat4 VPmatrix;
uniform mat4 matrixPrev;
uniform mat4 VPmatrixPrev;
uniform sampler2D diffuseTexture;
uniform sampler2D zTexture;
void main() {
    vec2 texCoord = tex;
    float zOverW = texture2D(zTexture, texCoord).r;
    vec4 H = vec4(texCoord.x * 2.0 - 1.0, (1 - texCoord.y) * 2.0 - 1.0, zOverW, 1.0);
    mat4 inv1 = inverse(matrix);
    mat4 inv2 = inverse(VPmatrix);
    vec4 D = H*(inv2*inv1);
    vec4 worldPos = D/D.w;
    mat4 prev = matrixPrev*VPmatrixPrev;
    vec4 previousPos = worldPos*prev;
    previousPos /= previousPos.w;
    vec2 velocity = vec2((H.x-previousPos.x)/2.0, (H.y-previousPos.y)/2.0);
    vec3 color = vec3(texture2D(diffuseTexture, texCoord));
    for(int i = 0; i < 16; i++) {
        texCoord += velocity;
        vec3 color2 = vec3(texture2D(diffuseTexture, texCoord));
        color += color2;
    }
    color /= 16;
    gl_FragColor = vec4(color, 1.0);
}

ユニフォームmatrixVPmatrixは、次のように取得された ModelView および Projection マトリックスです。

float matrix[16];
float VPmatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
glGetFloatv(GL_PROJECTION_MATRIX, VPmatrix);

ユニフォームmatrixPrevVPmatrixPrevは、レンダリング後に次のように取得された以前の ModelView と Projection マトリックスです: (以下のコードでmatrixPrevは、VPmatrixPrevグローバル変数です)

for(int i = 0; i < 16; i++) {
    matrixPrev[i] = matrix[i];
    VPmatrixPrev[i] = VPmatrix[i];
}

4 つのマトリックスはすべて、次のようにシェーダーに渡されます。

glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrix"), 16, GL_FALSE, matrix);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "VPmatrix"), 16, GL_FALSE, VPmatrix);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrixPrev"), 16, GL_FALSE, matrixPrev);
glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "VPmatrixPrev"), 16, GL_FALSE, VPmatrixPrev);

シェーダーでは、均一な zTexture は、フレーム バッファーの深度値を含むテクスチャです。(Wで割り切れるかは不明)

シェーダーが機能することを願っていましたが、代わりに得られたのは、ぼかしの周りでカメラを回転させると、微妙な回転で非常に速くジッターが発生することです。zTexture をレンダリングしてみましたが、得られる結果はグレースケール イメージなので、問題ないようです。また、フラグメントの色をに設定しようとしましたがH.xyzpreviousPos.xyzレンダリング中H.xyzに色付きの画面がpreviousPos.xyz生成され、同じ色の画面が生成されますが、カメラが回転すると色が反転するように見えるため、深さからワールド位置を抽出することに何か問題があると思われます。

ここで何か不足していますか?どんな助けでも大歓迎です。

4

2 に答える 2

0

申し訳ありませんが、答えはありませんが、手がかりがあります。私はあなたとまったく同じ問題を抱えています。私はグーグルが指摘したのと同じ素材を使用したと思います.あなたと同じように、カメラが回転したときにのみぼやけが存在します.

しかし、私には手がかりがあります (実際にはあなたのものと同じです): ネットの glsl シェーダーが深度テクスチャに z/w が含まれていると想定しているためだと思いますが、私のように、固定パイプラインを使用して満たされた本物の深度テクスチャを使用しました。したがって、最初のステップで z しかなく、w がありません。"texture2D(zTexture, texCoord).r" には z のみが含まれているため、zOverW を取得するための計算が失敗します。最終的に、ウィンドウ空間からクリップ空間への途中で立ち往生しています。

私はこれを見つけました: https://www.opengl.org/wiki/Compute_eye_space_from_window_space#From_NDC_to_clip しかし、私の透視投影行列は要件を満たしていません。おそらくそれが役立つでしょう。

于 2015-01-20T20:40:13.503 に答える
0

私の以前の答えを忘れてください、マトリックスエラーです:

行列の乗算の順序が間違っているか、そうでなければ、転置行列を送信する必要があります (混乱した場所で、カウント、変換/スケール コンポーネントで回転のみが取得された理由を説明します):

glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrix"), 16, GL_FALSE, matrix);

になる

glUniformMatrix4fvARB(glGetUniformLocationARB(postShader, "matrix"), 1, GL_TRUE, matrix);

(注16はマトリックスサイズではなくマトリックス数なので、ここでは1つだけにする必要があります)

別の注意: ピクセル シェーダーではなく、メイン アプリケーションで逆行列と project*view 結果行列を計算する必要があります。これはピクセルごとに 1 回実行されますが、フレームごとに 1 回だけ実行する必要があります!)

過去の投稿メモ: Google " RuinIsland_GLSL_Demo.zip ": 多くの優れた glsl サンプルが含まれており、この問題の解決に役立ちました

于 2015-01-21T23:31:09.093 に答える