2017-09-20 10 views
0

GL_TEXTURE_2D_ARRAYテクスチャの選択したスライスに1つのGL_TEXTURE_2Dをコピーしようとしています。GL_TEXTURE_2DをGL_TEXTURE_2D_ARRAYの1つのスライスにコピーするテクスチャ

通常のTexture_2Dを1つのフレームバッファにバインドし、Texture_2D_Arrayのスライスのみを別のフレームバッファ(同じサイズ(幅、高さ、GL_RGB、GL_UNSIGNED_BYTE))にバインドしようとします。 その後、glBlitFramebufferはこのテクスチャをこのスライスにコピーすると思っていましたが、私はglFramebufferTexture3Dコマンドを誤解していると思います。

ところで:GL_TEXTURE_2Dが正しくロードされ、私も(作品)、それをプリントアウトし

ここに私のコード:

//Create 2 FBOs for copying textures 
glGenFramebuffers(1, &nFrameBufferRead); //FBO for texture2D 
glGenFramebuffers(1, &nFrameBufferWrite); //FBO for one slice of the texture2d_array 
CBasics::GetOpenGLError(); 

//generate the GL_TEXTURE_2D_ARRAY with given values (glgentextures is already called for this texture) 
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, nWidth, nHeight, countSlices, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
CBasics::GetOpenGLError(); 

//Bind the Texture2D to the readFramebuffer 
glBindFramebuffer(GL_READ_FRAMEBUFFER, nFrameBufferRead); 
glFramebufferTexture(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture2D_ID, 0); 
CBasics::GetOpenGLError(); 

//try to bind the Texture2D_Array to the drawFramebuffer 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, nFrameBufferWrite); 
CBasics::GetOpenGLError(); //till here everything works (no glerror) 
glFramebufferTexture3D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_ARRAY, texture2D_Array_ID, 0, slicenumber); // here the error appears 
CBasics::GetOpenGLError(); 

//because of the error one step earlier here will be the next error... 
glBlitFramebuffer(0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
CBasics::GetOpenGLError(); 

glFramebufferTexture3Dでエラーが表示されます。GL_INVALID_VALUE 私はそれがあるためだと思います

テクスチャがゼロでない場合、またはの名前である場合にGL_INVALID_VALUEが生成されます既存のテクスチャオブジェクト。

第1回:テクスチャを正しく配列にコピーする方法はありますか?それとももっと良い方法がありますか?

第2回:GL_TEXTURE_2D_ARRAYのスライスを1つだけバインドできますか?

3番目:GL_TEXTURE_2D_ARRAYにはglFramebufferTexture3DコマンドまたはglFramebufferTexture2Dコマンドが必要ですか?

+1

実際にデータをコピー*しようとしていますか?その配列レイヤーにレンダリングしますか?これらは2つの非常に異なる*操作であるためです。 –

+0

@NicolBolas私はデータをコピーしようとしています... TEXTURE_2D_ARRAY内のこのメソッドの後、1つのスライスはTEXTURE_2D – Thomas

答えて

3

実際にはすべてのコードが含まれていると仮定して、glTexImage3Dを呼び出す前に2D配列テクスチャをバインドしていないため、機能しません。

ただし、テクスチャデータのレンダリングやブリットを行う必要はありません。 ... copying texture dataによってテクスチャデータをコピーすることができます。 glCopyImageSubData関数は、異なる配列レイヤ数のテクスチャ間でレイヤをコピーできます。あなたの場合:

glCopyImageSubData(
    texture2D_ID, GL_TEXTURE_2D, 0, 0, 0, 0, 
    texture2D_Array_ID, GL_TEXTURE_2D_ARRAY, 0, 0, 0, slicenumber, 
    nWidth, nHeight, 1); 

これには、OpenGL 4.3以上、またはARB/NV_copy_image拡張子のいずれかが必要です。 NVIDIA拡張は実際にはかなり広く実装されています。

でも、glTexImage3Dを正しく使用する必要があります。

+0

にすべきです。 glCopyImageSubDataが機能します!内部には間違いが1つあります。最後のパラメータは '0'ではなく '1'でなければなりません。ありがとう! – Thomas

関連する問題