Итак, я перешел с обычного текстильного атласа на текстуру массива, так как с ним проще работать, используя 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));
}