所以我正在编写一个程序,它将使用framebuffers动态设置一些立方体贴图,我希望将其打包成一个数组,以便在我的着色器中使用。我目前设置的代码允许使用单元立方体贴图,但我无法使其适用于cubemaparrays。
我对cubemapArray的设置功能:
void createCubemapArray(GLuint& cubemap)
{
//Generate an array texture
glGenTextures(1, &cubemap);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubemap);
//Create storage for the texture. (4 layers of 1x1 texels)
glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY,
1, //No mipmaps as textures are 1x1
GL_RGB8, //Internal format
width, height, //width,height
4 //Number of layers
);
for (unsigned int i(0); i != 4; ++i)
{
glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY,
0, //Mipmap number
0, 0, i, //xoffset, yoffset, zoffset
1, 1, 1, //width, height, depth
GL_RGB, //format
GL_UNSIGNED_BYTE, //type
0); //pointer to data
}
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
这在我的主要功能中调用。我希望我已将其设置为允许在运行时添加纹理。
这是我如何添加帧缓冲纹理:
vec3 position = mirrorCam.getPosition();
view = look_at(position, position + normalise(viewsX[i]), vec3(0.0, -0.5, -0.5));
drawloop(view, proj, fb[0][i].framebuffer);
glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemapArray, 0, 0);
drawloop()是我的主渲染循环,它将大部分场景渲染到我传递给它的帧缓冲区。 mirrorCam是我为立方体贴图设置的相机对象。
然后,为了将它传递给我的着色器,我有以下几行:
glBindTexture(GL_TEXTURE_2D, cubemapArray);
glUniform1i(glGetUniformLocation(reflectiveShaderID, "cube_array"), 0);
最后,我的着色器代码。缩短到重要部分:
uniform samplerCubeArray cube_array;
//....
void main()
{
//...
fragment_color = texture(cube_array, vec4(textureCoordinates, 0));
}
当渲染所有这些时,我得到一个黑色物体,即没有纹理。但是,当我交换单个立方体贴图时,它工作正常,所以我确信问题在于我的数组初始化,或者我如何将图像绑定到数组。有什么想法吗?
答案 0 :(得分:2)
首先,让我们明白一点:
uniform samplerCube cube_texture;
如果您想阅读cubemap array,则必须use samplerCubeArray
as your sampler type。
现在,稍微不那么明显了:
glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemapArray, 0, 0);
如果您尝试渲染到立方体贴图数组的每个面,那不是如何做到的。目前还不清楚i
代表什么,但如果它应该是立方体贴图数组中第一层的面,那就不是你做的了。
请参阅立方体贴图阵列纹理永远不会使用立方体贴图面部目标。相反,他们使用图层面。此外,立方体贴图阵列纹理不使用glFramebufferTexture3D
;它们仅允许glFramebufferTexture
或glFramebufferTextureLayer
。你可能想要使用后者。
因此,如果您希望i
表示立方体贴图中第一个图层的面部索引,则可以执行以下操作:
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapArray, 0, i);