Получение FramebufferIncompleteMultisample при попытке создать мультидискретизированный буфер кадра

Я использую следующий код для создания текстуры + фреймбуфера (используя openTK в C #):

    public void Create(int width, int height, SurfaceFormat format)
    {
        bool multisample = format.Multisample > 1;
        int samples = Math.Max(1, Math.Min(format.Multisample, 4));
        TextureTarget target = multisample ? TextureTarget.Texture2DMultisample : TextureTarget.Texture2D;
        Width = width;
        Height = height;
        textureHandle = GL.GenTexture();
        //bind texture
        
        GL.BindTexture(target, textureHandle);
        Log.Error("Bound Texture: " + GL.GetError());
        GL.TexParameter(target, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest);
        GL.TexParameter(target, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
        GL.TexParameter(target, TextureParameterName.TextureWrapS, (int)format.WrapMode);
        GL.TexParameter(target, TextureParameterName.TextureWrapT, (int)format.WrapMode);
        
        Log.Error("Created Texture Parameters: " + GL.GetError());
        if (format.Multisample < 2)
            GL.TexImage2D(target, 0, format.InternalFormat, Width, Height, 0, format.PixelFormat, format.SourceType, format.Pixels);
        else
            GL.TexImage2DMultisample(TextureTargetMultisample.Texture2DMultisample, samples, format.InternalFormat, Width, Height, false);
        Log.Error("Created Image: " + GL.GetError());
        //unbind texture
        GL.BindTexture(target, 0);
        //create depthbuffer
        if (format.DepthBuffer)
        {
            GL.GenRenderbuffers(1, out dbHandle);
            GL.BindRenderbuffer(RenderbufferTarget.RenderbufferExt, dbHandle);
            
            if(multisample)
                GL.RenderbufferStorageMultisample(RenderbufferTarget.RenderbufferExt, samples, RenderbufferStorage.Depth24Stencil8, Width, Height);
            else
                GL.RenderbufferStorage(RenderbufferTarget.RenderbufferExt, RenderbufferStorage.DepthComponent24, Width, Height);
        }

        //create fbo
        fboHandle = GL.GenFramebuffer();
        GL.BindFramebuffer(FramebufferTarget.FramebufferExt, fboHandle);
        GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, target, textureHandle, 0);
        
        if(format.DepthBuffer)
            GL.FramebufferRenderbuffer(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, RenderbufferTarget.RenderbufferExt, dbHandle);
        Log.Debug("Framebuffer status: " + GL.CheckFramebufferStatus(FramebufferTarget.FramebufferExt));
        Log.Error("Created Framebuffer: " + GL.GetError());
        GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);
    }

И я получаю следующие ошибки:

[ОШИБКА]: Созданные параметры текстуры: InvalidEnum

[ЖУРНАЛ]: Статус буфера кадра: FramebufferIncompleteMultisample

когда я пытаюсь создать поверхность с мультисэмплингом (2)

Любые идеи, что происходит не так? Код работает с ms ‹2.


person pixartist    schedule 13.07.2014    source источник


Ответы (1)


Ошибка GL_INVALID_ENUM возникает из-за того, что GL_TEXTURE_2D_MULTISAMPLE недопустим в качестве первого аргумента вызовов TexParameter().

К мультисэмпловым текстурам можно получить доступ только в шейдерах с функцией texelFetch(). Они не поддерживают MIP-карты, линейную выборку или любые другие атрибуты выборки. Следовательно, GL_TEXTURE_2D_MULTISAMPLE не является допустимой целью для glTexParameteri().

В случае ошибки GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE это, скорее всего, вызвано последним аргументом этого вызова:

GL.TexImage2DMultisample(TextureTargetMultisample.Texture2DMultisample, samples,
                         format.InternalFormat, Width, Height, false);

Последний аргумент - fixedsamplelocations, поэтому вызов отключает фиксированные местоположения выборки.

Раздел о полноте кадрового буфера в спецификациях OpenGL включает следующее состояние ошибки:

Значение TEXTURE_FIXED_SAMPLE_LOCATIONS одинаково для всех прикрепленных текстур; и, если прикрепленные изображения представляют собой смесь буферов рендеринга и текстур, значение TEXTURE_FIXED_SAMPLE_LOCATIONS должно быть TRUE для всех прикрепленных текстур. {FRAMEBUFFER_INCOMPLETE_MULTISAMPLE}

Это именно то состояние, в котором вы находитесь. Вложения вашего FBO представляют собой смесь текстур и буферов рендеринга. Чтобы избежать этой ошибки, текстура должна использовать фиксированные местоположения сэмплов. Это делается путем изменения последнего аргумента в приведенном выше вызове на true:

GL.TexImage2DMultisample(TextureTargetMultisample.Texture2DMultisample, samples,
                         format.InternalFormat, Width, Height, true);
person Reto Koradi    schedule 14.07.2014
comment
Я все еще получаю FramebufferIncompleteMultisample, когда удаляю параметры tex; ( - person pixartist; 14.07.2014
comment
Когда я использую true вместо false для fixedSampleLocations, я все равно получаю ту же ошибку :( - person pixartist; 20.07.2014
comment
Я пытался найти ответ относительно fixed_sample_locations дольше, чем мне хотелось бы признать. Спасибо. - person Tim Kane; 23.10.2019