Я работаю с 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 .