多个GL_TEXTURE_2D_ARRAY代

时间:2013-10-31 04:40:08

标签: opengl textures

我正在尝试创建多个纹理2D数组,用于纹理高度图以及纹理的凹凸贴图。

问题是当我加载多个数组时,它会覆盖第一个数组的纹理数据。

#include "TextureArray.h"
#include "Debug.h"

TextureArray::TextureArray(const char* directory, int number)
{
    initBuffers();

    int width = 0;
    int height = 0;

    for(int i = 0; i < number; i++)
    {
        char buffer[256];
        sprintf(buffer, "%s%i.png", directory, i);

        if(!this->LoadFile(buffer, number, i, &width, &height))
        {
            Destroy();
            return;
        }
    }
}

void TextureArray::initBuffers()
{
    glGenTextures(1, &textures);
    glBindTexture(GL_TEXTURE_3D, textures);

    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_REPEAT);
}

void TextureArray::Destroy()
{
    glDeleteTextures(1, &textures);
}

bool TextureArray::LoadFile(char* file, int size, int index, int* width, int* height)
{
    Texture* texture = LoadTextureFromFile(file, false);

    if(texture == NULL)
    {
        return false;
    }

    unsigned char* data = texture->data;

    if(data)
    {
        if(index == 0)
        {
            *width = texture->width;
            *height = texture->height;

            glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, texture->bitDepth == ImageType::RGBA ? GL_RGBA : GL_RGB, *width, *height, size, 0, texture->bitDepth == ImageType::RGBA ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, NULL);
            checkError("I==0");
        }

        if(texture->width != *width || texture->height != *height)
        {
            return false;
        }

        glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, index, texture->width,  texture->height, 1, texture->bitDepth == ImageType::RGBA ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, data);
        checkError(file);

        free(data);
    }

    free(texture);

    return true;
}

以下是对此代码的调用:

textureArray = new TextureArray("textures/", "bumpmaps/", TEXTURE_ARRAY_SIZE);
//bumpMapArray = new TextureArray("bumpmaps/", TEXTURE_ARRAY_SIZE);

1 个答案:

答案 0 :(得分:0)

您正在使用

glBindTexture(GL_TEXTURE_3D, textures);
由于数组纹理的正确绑定目标是GL_TEXTURE_2D_ARRAY(在设置参数并指定数据时正确),因此

正在拧紧。实际上,你的代码只是使用默认的texure对象(名为0,并且从GL 1.0时代开始时没有纹理对象),这默认绑定到所有纹理单元的纹理数组目标。您创建并绑定为3D纹理的纹理对象从未真正使用过。