OpenGL纹理数组有时会使用GL_TEXTURE_2D

时间:2018-10-30 16:50:16

标签: java opengl textures lwjgl

因此,由于使用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));
}

0 个答案:

没有答案