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);
}
ユニフォームmatrix
とVPmatrix
は、次のように取得された ModelView および Projection マトリックスです。
float matrix[16];
float VPmatrix[16];
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
glGetFloatv(GL_PROJECTION_MATRIX, VPmatrix);
ユニフォームmatrixPrev
とVPmatrixPrev
は、レンダリング後に次のように取得された以前の 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.xyz
、previousPos.xyz
レンダリング中H.xyz
に色付きの画面がpreviousPos.xyz
生成され、同じ色の画面が生成されますが、カメラが回転すると色が反転するように見えるため、深さからワールド位置を抽出することに何か問題があると思われます。
ここで何か不足していますか?どんな助けでも大歓迎です。