0

テクスチャのバンプマップとともに高さマップをテクスチャリングするために、複数のテクスチャ 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);
4

1 に答える 1

0

使用している

glBindTexture(GL_TEXTURE_3D, textures);

GL_TEXTURE_2D_ARRAY配列テクスチャの正しいバインド ターゲットは(パラメータを設定してデータを指定したときに正しく) であるため、これは wringです。実際には、コードはデフォルトのテクスチャ オブジェクト (名前は 0 で、テクスチャ オブジェクトがまったくなかった GL 1.0 の時代からの古風な残骸) で動作しているだけで、デフォルトではすべてのテクスチャ ユニットのテクスチャ配列ターゲットにバインドされています。作成して 3D テクスチャとしてバインドしたテクスチャ オブジェクトは、実際には使用されませんでした。

于 2013-10-31T14:31:24.120 に答える