Нарушение доступа после создания GL_TEXTURE_2D_ARRAY - PullRequest
1 голос
/ 14 апреля 2020

У меня нарушение прав доступа при каждом вызове gl после этой инициализации текстуры (на самом деле последнее GLCALL(glBindTexture(m_Target, bound)); также вызывает нарушение доступа, поэтому код в верхней части - это то, что, вероятно, вызывает его):

Texture2D::Texture2D(unsigned int format, unsigned int width, unsigned int height, unsigned int unit, unsigned int mimapLevels, unsigned int layers)
        : Texture(GL_TEXTURE_2D_ARRAY, unit)
    {
        unsigned int internalFormat;
        if (format == GL_DEPTH_COMPONENT)
        {
            internalFormat = GL_DEPTH_COMPONENT32;
        }
        else
        {
            internalFormat = format;
        }
        m_Format = format;
        m_Width = width;
        m_Height = height;
        unsigned int bound = 0;
        glGetIntegerv(GL_TEXTURE_BINDING_2D_ARRAY, (int*)&bound);
        GLCALL(glGenTextures(1, &m_ID));
        GLCALL(glActiveTexture(GL_TEXTURE0 + m_Unit));
        GLCALL(glBindTexture(m_Target, m_ID));
        GLCALL(glTexParameteri(m_Target, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
        GLCALL(glTexParameteri(m_Target, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
        GLCALL(glTexStorage3D(m_Target, mimapLevels, internalFormat, width, height, layers));
        for (size_t i = 0; i < layers; i++)
        {
            glTexSubImage3D(m_Target, 0, 0, 0, i, m_Width, m_Height, 1, m_Format, s_FormatTypeMap[internalFormat], NULL);
        }
        GLCALL(glBindTexture(m_Target, bound));
    }

Указатели OGL инициализируются с радостью в начале программы:

        if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
        {
            std::cout << "Failed to initialize GLAD" << std::endl;
            return -1;
        }

И это происходит только с GL_TEXTURE_2D_ARRAY, даже когда это первая строка моего кода (после инициализации курса), пример кода:

auto t = Texture2D(GL_DEPTH_COMPONENT, 1024, 1024, 10, 1, 4);

Есть идеи, что может быть причиной этого?

Заранее спасибо!

1 Ответ

2 голосов
/ 14 апреля 2020

Вы передаете NULL для последнего аргумента glTexSubImage3D, но OpenGL не позволяет:

TexSubImage * D и TextureSubImage * D аргументы ширина , высота , глубина , формат , тип и данные сопоставляют соответствующие аргументы с соответствующей командой TexImage * D (где эти аргументы существуют), что означает, что они принимают одинаковые значения и имеют одинаковые значения. Исключением является то, что указатель NULL data не представляет неопределенное содержимое изображения.

... и нет текста, который допускает NULL указатель, поэтому вы не можете передать NULL.

Неясно, чего вы пытаетесь достичь с помощью этих glTexSubImage3D вызовов. Поскольку вы используете неизменяемую текстуру (glTexStorage3D), вам не нужно делать ничего лишнего. Если вместо этого вы хотите очистить текстуру, вы можете использовать glClearTexSubImage, который принимает NULL для данных , что означает «очистить с нулями».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...