OpenGL 1.2+ в системе, которая поддерживает OpenGL 4.1 [НЕ дубликат] - PullRequest
0 голосов
/ 18 марта 2020

Я работаю с GLFW в Xcode 11.3.

Мой MacBook Pro (13 дюймов, середина 2012 г.) под управлением MacOS 10.15 Catalina не будет поддерживать любые шейдеры #version выше 120, и я действительно хотел бы использовать более новую версию.

Как мне сказать, чтобы моя система использовала более новую версию OpenGL вместо 1.2?


Люди продолжают ссылаться на этот сайт: https://www.glfw.org/faq.html#41 --- how-do-i-create-an-opengl-30-context

Однако приведенный ниже код ничего не меняет для меня.

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

Изначально я посмотрел на этот ответ , снова с тем же кодом, что и выше. Поскольку у меня это не сработало, я решил задать новый вопрос о том, как это исправить. Это не «дубликат», так как это новая проблема, когда оригинальное решение не работает.


Глядя на Поддержка Apple Я обнаружил, что мой конкретный MacBook Pro ( 13-дюймовый, середина 2012 г.) имеет Intel HD Graphics 4000, которая поддерживает OpenGL 4.1 и OpenCL 1.2. Глядя на Википедию , я обнаружил, что OpenGL 4.1 поддерживает #version 410.

Таким образом, реализуя эту информацию:

bool Window::init()
{
    glewExperimental = GL_TRUE;

    if (!glfwInit())
    {
        std::cout << "Failed to initialize GLFW!" << std::endl;
        return false;
    }

    m_Window = glfwCreateWindow(m_Width, m_Height, m_Title, NULL, NULL);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    // glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    if (!m_Window)
    {
        glfwTerminate();
        std::cout << "Failed to create GLFW window!" << std::endl;
        return false;
    }

    glfwMakeContextCurrent(m_Window);
    glfwSetWindowUserPointer(m_Window, this);
    glfwSetWindowSizeCallback(m_Window, window_resize);
    glfwSetKeyCallback(m_Window, key_callback);
    glfwSetMouseButtonCallback(m_Window, mouse_button_callback);
    glfwSetCursorPosCallback(m_Window, cursor_position_callback);

    if (glewInit() != GLEW_OK)
    {
        std::cout << "Failed to initialize GLEW!" << std::endl;
        return false;
    }

    std::cout << "OpenGL " << glGetString(GL_VERSION) << std::endl;

    return true;
}
#version 410 core

layout (location = 0) in vec4 position;

uniform mat4 pr_matrix;
uniform mat4 vw_matrix = mat4(1.0);
uniform mat4 ml_matrix = mat4(1.0);

void main()
{
    gl_Position = pr_matrix * vw_matrix * ml_matrix * position;
}

Получает следующий вывод:

OpenGL 2.1 INTEL-14.2.16
Failed to compile vertex shader!
ERROR: 0:1: '' :  version '410' is not supported
ERROR: 0:1: '' : syntax error: #version
ERROR: 0:3: 'layout' : syntax error: syntax error

Очевидно, что 2.1 меньше, чем 4.1 (и 3.2, что я также пробовал, прежде чем искать две вышеупомянутые статьи); так что нет, код, который все продолжают бросать, не работает для меня. Следовательно, почему это не дубликат Работающей программы ma c os x c ++, работающей с OpenGL 3.3 .

...