Всегда полноэкранный на втором мониторе с использованием OpenGL на Ubuntu 14.04

У меня есть два монитора с разными собственными разрешениями с одинаковой частотой обновления, с графическим процессором Nvidia Titan X (версия драйвера 375.66) в Ubuntu 14.04. Я хотел бы в режиме реального времени показывать захваченное изображение во весь экран на втором мониторе и одновременно управлять графическим интерфейсом камеры на основном мониторе.

Минимальное воспроизведение с использованием glfw а также OpenGL является:

#include <stdio.h>
#include <stdlib.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

GLFWwindow* open_window(const char* title, GLFWmonitor* monitor)
{
    const GLFWvidmode* mode = glfwGetVideoMode(monitor);

    glfwWindowHint(GLFW_RED_BITS, mode->redBits);
    glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
    glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);

    GLFWwindow* window = glfwCreateWindow(mode->width, mode->height, title, monitor, NULL);
    if (!window)
        return NULL;

    glfwMakeContextCurrent(window);
    gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);

    glfwSwapInterval(1);
    glfwShowWindow(window);

    return window;
}

GLuint create_texture(GLFWmonitor* monitor)
{
    const GLFWvidmode* mode = glfwGetVideoMode(monitor);
    int width  = mode->width;
    int hieght = mode->height;

    char pixels[width * hieght];
    GLuint texture;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    for (int y = 0;  y < hieght;  y++)
        for (int x = 0;  x < width;  x++)
            pixels[y * width + x] = rand() % width;

    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, width, hieght, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    return texture;
}

void draw_quad(GLuint texture)
{
    int width, height;
    glfwGetFramebufferSize(glfwGetCurrentContext(), &width, &height);

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.f, 1.f, 0.f, 1.f, 0.f, 1.f);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glBegin(GL_QUADS);

    glTexCoord2f(0.f, 0.f);
    glVertex2f(0.f, 0.f);

    glTexCoord2f(1.f, 0.f);
    glVertex2f(1.f, 0.f);

    glTexCoord2f(1.f, 1.f);
    glVertex2f(1.f, 1.f);

    glTexCoord2f(0.f, 1.f);
    glVertex2f(0.f, 1.f);

    glEnd();
}

int main(int argc, char** argv)
{
    if (!glfwInit())
        exit(EXIT_FAILURE);

    // detect and print monitor information
    int monitor_count;
    GLFWmonitor** monitors = glfwGetMonitors(&monitor_count);
    printf("Number of monitors detected: %d\n", monitor_count);
    if (monitor_count < 2)
    {
        printf("The second monitor is not connected.\n");
        return false;
    }

    // open a window fullscreen on second monitor
    GLFWwindow *window = open_window("Captured image", monitors[1]);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    // the loop
    while (!glfwWindowShouldClose(window))
    {
        // create the image (say, the captured image via camera App)
        GLuint texture = create_texture(monitors[1]);

        // show the image
        draw_quad(texture);
        glfwSwapBuffers(window);
    }

    glfwTerminate();
    exit(EXIT_SUCCESS);
}

Проблема в том, что строка заголовка Ubuntu появляется, когда я переключаю текущий фокус на графический интерфейс камеры или на терминал. Например: полноэкранный не полный экран Вверху: сфокусируйтесь на окне (на весь экран отлично). Внизу: фокус на терминале; обратите внимание, что теперь отображается нежелательная верхняя строка заголовка (отмечена красным).

X воспринимает два монитора как один большой экран, поэтому мои снимки экрана содержат дополнительные черные пиксели: Настройка экрана

Я обнаружил https://bugs.launchpad.net/unity/+bug/853865 котором говорится, что верхняя панель на втором дисплее не может быть скрыта, и это рассматривается как реализуемая функция для Unity.

Как я могу преодолеть эту проблему в течение glfw? Если нет, то любой другой OpenGL рамки альтернативы предложения? Я хотел бы сохранить мультиплатформенность.

0 ответов

Другие вопросы по тегам