渲染Dynamic CubemapArray

时间:2017-01-19 23:35:29

标签: opengl glsl

所以我正在编写一个程序,它将使用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));   
}

当渲染所有这些时,我得到一个黑色物体,即没有纹理。但是,当我交换单个立方体贴图时,它工作正常,所以我确信问题在于我的数组初始化,或者我如何将图像绑定到数组。有什么想法吗?

1 个答案:

答案 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;它们仅允许glFramebufferTextureglFramebufferTextureLayer。你可能想要使用后者。

因此,如果您希望i表示立方体贴图中第一个图层的面部索引,则可以执行以下操作:

glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapArray, 0, i);