OpenGL fbo blitting несовместим между Intel и Nvidia

Я показываю сцену в OpenGL с низким разрешением в фреймбуфер. Затем я намереваюсь нарисовать эту версию на весь экран (масштабируется с помощью GL_NEAREST). Я делаю это, используя текстуру blitting (glBlitFramebuffer). На моем графическом процессоре Nvidia это работает, но при выполнении одного и того же кода на моей интегрированной графике Intel i7 y-Position на целевом фреймбуфере кажется неправильным (т.е. Изображение отображается слишком далеко).

glGetError не возвращает ошибку. Поскольку драйвер Nvidia имеет тенденцию быть очень прощающим, я ожидаю, что мне не хватает незначительных деталей в спецификации OpenGL, о которой Nvidia не заботится. Я искал интернет и stackoverflow и не мог найти подобную проблему. Оба драйвера сообщают о поддержке OpenGL 3.0

Мой код чертежа:

//setup viewport for small image
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0, 0, image.getWidth(), image.getHeight());

//bind small framebuffer
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
glDrawBuffers(GL_COLOR_ATTACHMENT0);
glClear(GL_COLOR_BUFFER_BIT);

//draw
renderRotatedFull(1);//nothing interesting at all happening here

//reset Viewport
glPopAttrib();

//prepare and execute blitting
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glReadBuffer(GL_COLOR_ATTACHMENT0);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glDrawBuffers(GL_BACK_LEFT);

glBlitFramebuffer(0, 0, image.getWidth(), image.getHeight(), 0, 0, Game.width,
    Game.height, GL_COLOR_BUFFER_BIT, GL_NEAREST);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

//throws exception if there is an OpenGL error
org.lwjgl.opengl.Util.checkGLError();

Инициализация выполняется следующим образом:

fbo =glGenFramebuffers();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

rbo = glGenRenderbuffers();
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, image.getWidth(), image.getHeight());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);

assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

Ответы

Ответ 1

Это может быть известная проблема с Intel HD Graphics. Посмотрите здесь эту программу - http://www.realtech-vr.com/glview/download.php

Эта программа, рассказывающая вам, какую версию OpenGL поддерживает ваша видеокарта, иногда Intel HD поддерживает только 1.1 (это странно, я знаю!), но иногда он может сказать, что он поддерживает более высокий уровень, но с ошибками.

Удачи!