因此,由于使用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
srgb解码GL_DECODE_EXT
depthMode 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
depthMode 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));
}