我试图将一个GL_TEXTURE_2D复制到GL_TEXTURE_2D_ARRAY纹理的选定切片中。
我尝试将通常的Texture_2D绑定到一个帧缓冲区,只将一片Texture_2D_Array绑定到另一个帧缓冲区(两者都具有相同的大小(宽度,高度,GL_RGB,GL_UNSIGNED_BYTE))。
之后我想glBlitFramebuffer
将这个纹理复制到这一个切片中...但我想我误解了glFramebufferTexture3D
命令。
BTW:正确加载了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 现有的纹理对象。
第一:这种方式是否正确地将纹理复制到数组中?或者有更好的方法吗?
第二:是否可以只绑定GL_TEXTURE_2D_ARRAY的一个片段?
第三:GL_TEXTURE_2D_ARRAYs是否需要glFramebufferTexture3D
命令或glFramebufferTexture2D
命令?
答案 0 :(得分:3)
假设“这是我的代码”实际上确实包含了你的所有代码,它不起作用,因为在调用glTexImage3D
为它分配存储空间之前你没有绑定2D数组纹理。
但是,您不必渲染或blit来复制纹理数据。您可以按... 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
。