glClear() выдает GL_OUT_OF_MEMORY на Intel HD 4000 (GL 4.0), но не на GeForce (GL 4.2)... почему?
Теперь, это очень странное поведение.
TL; DR - в настройке рендеринга в текстуру при изменении размера окна (кадровый буфер 0) только самый следующий вызов glClear(GL_COLOR_BUFFER_BIT) для связанного кадрового буфера 0 (клиентская область окна) дает GL_OUT_OF_MEMORY, только для одного из двух Графические процессоры, однако рендеринг по-прежнему происходит правильно и правильно.
Теперь все мелкие детали:
Так что это на Vaio Z с двумя графическими процессорами (которые можно переключить с помощью физической кнопки на машине):
OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE / PCIe / SSE2 (GLSL: 4.20 NVIDIA через компилятор Cg)
OpenGL 4.0.0 - сборка 9.17.10.2867 @ Intel Intel® HD Graphics 4000 (GLSL: 4.00 - сборка 9.17.10.2867)
Моя программа находится в Go 1.0.3 64-bit под Win 7 64-bit, используя GLFW 64-bit.
У меня довольно простой и понятный мини-конвейер рендеринга в текстуру. Во-первых, нормальная трехмерная геометрия визуализируется с помощью простейших шейдеров (без освещения, ничего, только с текстурированными треугольными сетками, которые представляют собой просто количество кубов и плоскостей) в кадровый буфер, который имеет буфер рендеринга глубины / трафарета как прикрепление глубины / трафарета и texture2D в качестве цветовой привязки. Для текстуры вся фильтрация отключена, как и mip-карты.
Затем я рендерил полноэкранный квад (фактически один "полноразмерный" полноэкранный три), просто сэмплировав из указанной текстуры кадрового буфера (цветное вложение) с помощью texelFetch(tex, gl_FragCoord.xy, 0), чтобы обертывание не использовалось.
Оба графических процессора прекрасно справляются с этим, как при использовании профиля ядра, так и без него. Об этом никогда не сообщалось об ошибках GL, все отрисовки также ожидаемые. За исключением случаев, когда я изменяю размер окна при использовании рендерера GL 4.0 Intel HD 4000 GPU (как в профиле Core, так и в профиле Comp). Только в этом случае одно изменение размера будет записывать ошибку GL_OUT_OF_MEMORY непосредственно после следующего вызова glClear(GL_COLOR_BUFFER_BIT) для кадрового буфера 0 (экран), но только один раз после изменения размера, а не на каждой последующей итерации цикла.
Интересно, что я даже не делаю никаких ассигнований на изменение размера! Я временно отключил ВСЕ логику, возникающую при изменении размера окна, то есть, сейчас я просто полностью игнорирую событие изменения размера окна, то есть кадровый буфер RTT и его разрешения по глубине и цвету вложения даже не изменяются / воссоздаются. Это означает, что следующий glViewPort будет по-прежнему использовать те же измерения, что и при первом создании окна и контекста GL, но в любом случае ошибка возникает в glClear() (не раньше, только после, только один раз - я дважды и трижды проверил).
Будет ли это ошибкой в драйвере, или я могу что-то сделать здесь неправильно?
1 ответ
Интересный глюк в драйвере GL HD, кажется:
Когда я переключился на настройку рендеринга в текстуру, я также установил биты глубины / трафарета при создании контекста GL для основного кадрового буфера 0 (т. Е. Экрана / окна) на 0. Это когда я начал видеть эту ошибку и частота кадров стала довольно вялой по сравнению с предыдущей.
Я экспериментально установил (строго говоря ненужные) биты глубины на 8, и обе эти проблемы исчезли. Похоже, что текущая версия драйвера HD 4000 GL 4.0 просто не любит значение 0 для битов буфера глубины при создании контекста GL.