2017-03-05 10 views
0

私のシーンをテクスチャにレンダリングし、そのテクスチャを使用してウィンドウにレンダリングするWebGL OpenGL ESプロジェクトで作業しています。テクスチャFBOテクスチャにレンダリングするときにわずかにオフになる

これは、テクスチャの端に奇妙な光沢があることに気付きました。私がプロジェクトをウィンドウに直接レンダリングに戻すと、ちらつきがなくなります。

FBOはウィンドウと同じサイズに設定され、テクスチャはピクセルのウィンドウピクセルに描画されます。

何が起こっているのですか?それは修正可能ですか?私はFBOテクスチャではGL_NEARESTを、他のテクスチャではGL_LINEARを使用しています。 GL_CLAMP_TO_EDGEは、他の問題の原因になるので、むしろ使用しないでください。

[render to screen] render to fbo

フレームバッファの作成

/* Returns true if a framebuffer object is created */ 
Display.prototype.createFramebuffer = function(name) { 
    var gl = this.gl; // Sanity Save 

    var size = 1024; 

    var fb = gl.createFramebuffer(); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 
    fb.width = size; 
    fb.height = size; 

    var tex = gl.createTexture(); 
    gl.bindTexture(gl.TEXTURE_2D, tex); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, fb.width, fb.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 

    var rb = gl.createRenderbuffer(); 
    gl.bindRenderbuffer(gl.RENDERBUFFER, rb); 
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, fb.width, fb.height); 
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); 
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rb); 

    if(gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { return false; } 

    this.fbo[name] = {fb: fb, rb: rb, tex: tex}; 

    gl.bindTexture(gl.TEXTURE_2D, null); 
    gl.bindRenderbuffer(gl.RENDERBUFFER, null); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

    return true; 
}; 

右方向(およびトンの豊富でプッシュした後

/* Draw Geometry */ 
gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo.world.fb); // Enable world framebuffer 
gl.viewport(0, 0, this.window.width, this.window.height); // Resize to canvas 
gl.clearColor(0.5, 0.5, 0.5, 1.0); // Opaque grey backdrop 
+0

FBOはどのように設定されていますか?画面と同じサイズとフォーマットですか? OpenGLまたはOpenGL-esを使用していますか?関連するコードを表示します。 – BDL

+0

@BDLセットアップコードを追加しました。それは画面と同じサイズとフォーマットです。 OpenGL ESはWebGLが使用するものです。 –

+0

実際にはWebGLですか? Desktop-OpenGL、OpenGL-es、WebGLの3つのバージョンはそれぞれ独自の制限と制限があります。あなたの質問に適切なタグを付けると、あなたの環境に当てはまらない回答が得られなくなります。 – BDL

答えて

0

シーンを描画する前にrialとerror)私は問題を理解しました。

これは、FBOテクスチャにレンダリングするときにハードウェアアンチエイリアスが無効になっているためです。それを修正するには、あなた自身のAAを実装する必要があります。

私のプロジェクトでこれを修正するには、FBAレンダリングとウィンドウ解像度の2倍のアップスケーリングとの組み合わせで粗MSAAポストシェーダを試してみました。

FXAAは別の良い解決策かもしれませんが、私は個人的に働くことができませんでした。

もしこれについて行くよりよい方法があれば教えてください!

+1

私はそれを別の方法で言うでしょう。問題は、あなたがやっていることはアンチエイリアスに敏感だということです。 FBOでアンチエイリアスを行う方法ではなく、アンチエイリアスを気にしないようにしようと思っています。 – gman

+0

@gman私が読んだことからWebGLはFBOテクスチャにレンダリングするときにアンチエイリアスをサポートしていません。この情報源のいくつかは少し古い(1〜2年)ものでした。あなたはそれに反するいくつかの確固たる言及を見つけることができるなら、私はこれを処理するより良い方法を見つけることが大好きです。私は自分のAAメソッドを非効率的なものとして使用する必要はありません。また、本当に助けに感謝します。私はここで頻繁に完全に無視されるように感じる。 –

関連する問題