2016-12-05 10 views
0

私は単一のテクスチャを格納するためにlwjglのフレームバッファオブジェクトを処理しています。私は現時点では2つの問題を持っている、という最初の問題は、フレームバッファ内のテクスチャは以下に示すように、次のフレームをレンダリングする前にクリアしていないように見えるということである(正しい用語をゴーストさ?):LWJGL - フレームバッファテクスチャ

FrameBuffer Texture result

glCheckFrameBufferStatusは、このFBOに対してGL_FRAMEBUFFER_COMPLETEを返します。

各フレームレンダラコール:

GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

(シェーダーが実行される前に、その最初の呼び出し)任意のレンダリングがすべてで起こるので、私はそのがこのように動作し、なぜわからないの前に。

次のようにフレームバッファのためのテクスチャが作成されます。

private int createTexAttachment() 
    { 
     int texture = GL11.glGenTextures(); 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture); 

     GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_RGB32F, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_FLOAT, (FloatBuffer)(null)); 
     GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, texture, 0); 

     return texture; 
    } 

レンダラーがFBOが、それはそうのようなFBOをバインド渡すレンダリング達した場合:

public void bind() 
    { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
     //ensure an unbound texture 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); 
     GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer); 
    } 

し、それが後に続いて未結合でありますレンダリングパス:

public void unbind() 
    { 
     GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); 
     GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); 
    } 

私の2番目の問題は、私はworを書くことを試みています

//vertex shader 
#version 140 

in vec3 position; 

out vec4 worldSpacePosition; 

uniform mat4 projMatrix; //projection matrix 
uniform mat4 viewMatrix; //camera view matrix 
uniform mat4 modelMatrix; //transformation (model) matrix 

void main(void) 
{ 
    vec4 worldPos = modelMatrix * vec4(position, 1.0); 
    vec4 pos = projMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); 

    gl_Position = pos; 
    worldSpacePosition = worldPos; 
} 

//fragment shader 
#version 140 

in vec4 worldSpacePosition; 

out vec4 out_colour; 

void main(void) 
{ 
    out_colour = worldSpacePosition; 
} 

究極の目標:LD空間テクスチャにレンダリングにおける各フラグメントの位置が、それを見ることができる上記の画像から、それが動作していないが、以下の私は、このパスに使用する頂点とフラグメントシェーダですFBOテクスチャの特定のピクセルをサンプリングして(glReadPixelsを使用して)、世界でその位置を抽出することです。私はGL11.glReadPixels(x, y, 1, 1, GL30.GL_RGB32F, GL11.GL_FLOAT, fb);でこれを達成しようとしましたが、どのピクセルがサンプリングされても0,0,0のxyz/rgb値を生成します。また、0と1の間のxyz/rgb値を提供するGL11.glReadPixels(x, y, 1, 1, GL11.GL_RGB, GL11.GL_FLOAT, fb);希望の結果。

このFBOパスでレンダリングするときにデプステストを行っていないことも発見しました。そのため、私はその理由を調べてみます。

誰もが私のFBOのテクスチャがゴーストとどのようにFBOテクスチャのRGBチャンネルにフラグメントのXYZ位置を格納することですなぜあなたは:)

を助けてくださいことができれば何か提案が適切に私は感謝される可能性がありますのIF乾杯!

答えて

1

問題1(クリア)について:glClearを呼び出す前にフレームバッファをバインドしますか?クリア操作は、現在バインドされているフレームバッファ(またはFBOがバインドされていない場合はバックバッファ)に対して常に実行されます。 ISSE 2について

:あなたのテクスチャのみを加えて0と1の間の値を格納することを可能にする8ビット正規化された形式でフォーマットGL_RGBAを、持っている、あなたの内部形式(GL_RGBが)あなたのフォーマットに適合しない(GL_RGBA) 。 4チャンネルまたは3チャンネルが必要ですが、互換性がなければなりません。

世界の空間位置を保存する場合は、おそらく0と1の間ではないことになりますが、浮動小数点テクスチャ(およびチャンネルあたりのビット数)を使用する必要があります。 GL_RGB32FまたはGL_RGBA32Fがあなたが探しているものかもしれません。

+0

FBOがバインドされた後、私はクリアを思い出しました!私は間違いなくそれを覚えています。 はGL_RGB32Fを使用するように、私はGL_RGB32Fに内部形式を設定しGL_RGB32Fにフォーマットし、得られたレンダリングされた画像は 'GL11.glTexImage2D(GL11.GL_TEXTURE_2D、0、GL30.GL_RGB32F、幅、高さ、0完全に黒である、GL30 .GL_RGB32F、GL11.GL_FLOAT、(FloatBuffer)(null)); ' – whatsthisnow

+0

ドキュメントを見てください!内部フォーマットだけがサイズ付きフォーマットであることができ、フォーマットは 'GL_RGB'でなければなりません。世界の空間位置を色として出力するにはいくつかの問題があります。たとえば、負の位置は黒です。 1より大きなものはすべて飽和状態になります。シーンとテクスチャに書き込んでいる値を知らなくても、黒は正しいかもしれません。 – BDL

+0

上記のテクスチャからglReadPixelsを使用して、指定されたピクセルのワールド空間を読み込もうとしていますが、GLRGB32Fとしてテクスチャを保存していても、結果値はGLRGBで読み込んだ場合0〜1、GLRGB32Fで読み込んだ場合は常に0です。私はその視覚的表現には関心がありません。視覚的なデバッグのためにのみ使用しました。私は何時間もドキュメントを読むことに費やしましたが、ドキュメンテーションを読むことによる理解は私の強い訴訟ではありません。私はデモンストレーションを通して学びます。 – whatsthisnow