OpenGL Framebuffer не завершен на Nvidia при использовании Cube Map Textures - PullRequest
0 голосов
/ 24 октября 2018

Редактировать: я сузил причину и упростил проблему

Я заметил, что при работе с многоуровневым рендерингом OpenGL у драйверов / графических процессоров Nvidia возникают проблемы с кадровыми буферами, имеющими карту кубов.текстуры связаны с ними.У Intel IGPU нет проблем с этим, но когда я переключаюсь на свой выделенный графический процессор, я получаю ошибку

Код ниже воссоздает ошибку:

GLuint environment = 0; glCreateTextures(GL_TEXTURE_CUBE_MAP, 1, &environment);

constexpr GLsizei resolution = 512;
glTextureStorage2D(environment, 1, GL_RGB32F, resolution, resolution);
glTextureParameteri(environment, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTextureParameteri(environment, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTextureParameteri(environment, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTextureParameteri(environment, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTextureParameteri(environment, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTextureParameteri(environment, GL_TEXTURE_BASE_LEVEL, 0);
glTextureParameteri(environment, GL_TEXTURE_MAX_LEVEL, 0);

GLuint capture_fbo = 0; glCreateFramebuffers(1, &capture_fbo);
GLuint capture_rbo = 0; glCreateRenderbuffers(1, &capture_rbo);
glNamedRenderbufferStorage(capture_rbo, GL_DEPTH_COMPONENT32F, resolution, resolution);

glNamedFramebufferTexture(capture_fbo, GL_COLOR_ATTACHMENT0, environment, 0);
glNamedFramebufferRenderbuffer(capture_fbo, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, capture_rbo);

if (glCheckNamedFramebufferStatus(capture_fbo, GL_DRAW_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE)
{
    fmt::print("Framebuffer Complete!\n");

    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, capture_fbo);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else fmt::print("Framebuffer Not Complete!\n");

Когда я запрашиваю кадровый буфер после попыткичтобы запустить приведенный выше код, он говорит, что он не завершен, пока я не откреплю / не перепривязаю кадровый буфер.После чего он говорит, что он снова завершен, хотя ничего не изменилось.

Вывод консоли на Nvidia:

Manufacturer: NVIDIA Corporation
GPU: GeForce GTX 1060 with Max-Q Design/PCIe/SSE2
OpenGL Version: 4.5.0 NVIDIA 416.34
GLSL Version: 4.50 NVIDIA
Framebuffer Complete!
OpenGL [API Error 1286] (High): GL_INVALID_FRAMEBUFFER_OPERATION error generated. Operation is not valid because a bound framebuffer is not framebuffer complete.

Вывод консоли на Intel:

Manufacturer: Intel
GPU: Intel(R) UHD Graphics 630
OpenGL Version: 4.5.0 - Build 23.20.16.4973
GLSL Version: 4.50 - Build 23.20.16.4973
Framebuffer Complete!

AmЯ сталкиваюсь с ошибкой?Поскольку он работает на одном поставщике, а не на другом, есть ли какая-то специальная спецификация для кадровых буферов Nvidia?

1 Ответ

0 голосов
/ 24 октября 2018

Текстуры Cubemap эффективно имеют 6 слоев.Поэтому при вызове glNamedFramebufferTexture кубическая карта будет прикреплена как a слоистое изображение .И для того, чтобы кадровые буферы были полными, либо все прикрепленные изображения являются слоистыми, либо нет из них.Изображения Renderbuffer никогда не являются слоистыми, поэтому у вас есть кадровый буфер, который не должен быть полным.

Так что, хотя glCheckNamedFramebufferStatus не должен был возвращать "complete", NVIDIA ближе к правильности, чем Intel (не удивительно).

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