Я хотел бы выполнить 3D-рендеринг на своем компьютере Debian и перенести результат в память на стороне клиента.
Я создал приложение на C ++, GLX и GLEW, для которого не требуется окно. Я получаю дисплей с glXOpenDisplay
, используйте его, чтобы найти правильный кадровый буфер с glXChooseFBConfig
(прохождение DefaultScreen
отображения), получить визуальную информацию с glXGetVisualFromFBConfig
и передать соответствующую информацию glXCreateContext
, Я делаю этот контекст актуальным & инициализировать GLEW.
В качестве начального теста я просто очищаю стандартный буфер кадров различными цветами; Я хотел бы теперь запросить результат попиксельно, предположительно с glReadPixels
,
Но здесь я, кажется, что-то неправильно понимаю: каковы размеры стандартного кадрового буфера? Я никогда не определяю начальную высоту или ширину для него, и я не вижу способа сделать это.
Ответы, такие как этот подразумевается, что окно «определяет» размеры. В моем приложении это DefaultScreen
определение размеров? Если это так, что я могу сделать, чтобы стандартный кадровый буфер был больше, чем особенно маленький экран?
и передать соответствующую информацию в glXCreateContext. Затем я инициализирую GLEW.
То, что у вас есть контекст, не означает, что вы можете немедленно использовать его. Подумайте, что произойдет, если у вас более одного контекста. Прежде чем вы сможете делать вызовы OpenGL, вы должны активизировать контекст в текущем потоке, используя glXMakeCurrent
или же glXMakeContextCurrent
, Если вы посмотрите на подписи этих функций, то увидите, что они принимают Drawable в качестве параметра в дополнение к контексту OpenGL. Так что тебе это тоже нужно.
Для работы без окон GLX предлагает PBuffers, которые предлагают рисовать без окон. Или вы можете использовать окно, которое вы не отображаете на экране. PBuffers позволяют выполнять закадровый рендеринг без использования объектов кадрового буфера, но использование их основного кадрового буфера немного сложнее. Я рекомендую использовать PBuffer размером 0 × 0 и объект framebuffer.
Вам нужно использовать объекты кадрового буфера. Они используют текстуры, размеры которых вы указали. Например:
// Generate framebuffer ID
GLuint fb;
glGenFramebuffers(1, &fb);
// Make framebuffer active
glBindFramebuffer(GL_FRAMEBUFFER, fb);
// Attach color and depth textures (must have same dimensions)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_tex, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_tex, 0);
// Check framebuffer is valid
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);