OpenGL Texture Array иногда инициализируется с помощью GL_TEXTURE_2D - PullRequest
0 голосов
/ 30 октября 2018

Итак, я перешел с обычного текстильного атласа на текстуру массива, так как с ним проще работать, используя mipmapping и жадное построение сетки. Проблема, с которой я столкнулся, заключается в том, что, хотя все массивы генерируются с одной и той же функцией, мои нормальные и зеркальные массивы имеют неправильное состояние текстуры. Единственная разница между диффузным массивом и нормальным / зеркальным массивом состоит в том, что в диффузном массиве используется GL_RGBA и обычный / зеркальный массив GL_RGB.

Это метод, который я использую для создания массива:

@Override
public void init(int layerCount, boolean supportsAlpha, int textureSize) {
    this.textureId = glGenTextures();
    this.maxLayer = layerCount;
    this.mipmap = Client.getInstance().getConfig().getGraphics().isMipmap();
    this.anisotropicLevel = OpenGLThread.getInstance().isAnisotropicSupported() ? Client.getInstance().getConfig().getGraphics().getAnisotropicFiltering() : 0;

    int internalFormat = supportsAlpha ? GL_RGBA8 : GL_RGB8;
    this.format = supportsAlpha ? GL_RGBA : GL_RGB;

    glBindTexture(GL_TEXTURE_2D_ARRAY, this.textureId);
    glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, internalFormat, textureSize, textureSize, layerCount, 0, this.format, GL_UNSIGNED_BYTE, 0);

    int errorCode = glGetError();
    if (errorCode != 0) LOGGER.error("Error while generating texture array. {}", GLHelper.errorToString(errorCode));
}

Когда я генерирую диффузный атлас, renderdoc сообщает мне следующую информацию о текстуре:

внутренний формат GL_RGBA8
isView False
ширина 32
высота 32
глубина 278
образцы 0
дим 3
введите GL_TEXTURE_2D_ARRAY
mips 1
baseLevel 0
maxLevel 1000
minLod -1000.00
maxLod 1000,00
srgbDecode GL_DECODE_EXT
глубинаMode GL_NONE
compareFunc GL_LEQUAL
compareMode GL_NONE
minFilter GL_NEAREST
magFilter GL_NEAREST

Что отлично работает, потому что тип GL_TEXTURE_2d_ARRAY, как я определил. При генерации двух других атласов (порядок не имеет значения между прочим) renderdoc сообщает мне следующую информацию:

внутренний формат GL_RGB8
isView False
ширина 1
высота 1
глубина 278
образцы 0
дим 3
тип GL_TEXTURE_2D mips 1
baseLevel 0
maxLevel 0
minLod 0,00
maxLod 0,00
srgbDecode GL_NONE
глубинаMode GL_NONE
CompareFunc GL_NONE
compareMode GL_NONE
minFilter GL_NONE
magFilter GL_NONE

Это нечто совершенно другое, хотя использовался тот же метод. Даже если я переключаю два атласа на RGBA, они не работают, и я не понимаю, почему openGL внезапно решает использовать параметр, отличный от указанного в методе glTexImage3D ().

Это метод, который добавляет новые слои текстуры, если это помогает:

@Override
public void upload(ITextureLayer textureLayer) {
    if (textureLayer.getLayer() >= this.maxLayer) {
        LOGGER.error("Tried uploading a texture with a too big layer.");
        return;
    } else if (this.textureId == 0) {
        LOGGER.error("Tried uploading texture layer to uninitialized texture array.");
        return;
    }

    glBindTexture(GL_TEXTURE_2D_ARRAY, this.textureId);

    // Tell openGL how to unpack the RGBA bytes
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    // Upload the texture data
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, textureLayer.getLayer(), textureLayer.getWidth(), textureLayer.getHeight(), 1, this.format, GL_UNSIGNED_BYTE, textureLayer.getPixels());

    if (this.mipmap) {
        glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
        glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        if (this.anisotropicLevel > 0) {
            float amount = Math.min(this.anisotropicLevel, glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT));
            glTexParameterf(GL_TEXTURE_2D_ARRAY, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, amount);
        } else {
            glTexParameterf(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_LOD_BIAS, -1);
        }
    } else {
        glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    }

    int errorCode = glGetError();
    if (errorCode != 0) LOGGER.error("Error while uploading texture layer {} to graphics card. {}", textureLayer.getLayer(), GLHelper.errorToString(errorCode));
}
...