Версия OpenGL PyOpenGL для MacOs
Мне сказали переключить устаревший профиль на основной профиль из других сообщений stackru, но я не могу найти способ сделать это. Так что я выкладываю более обновленное сообщение об ошибке, чтобы помочь мне найти выход.
КОД:
import glfw, numpy
from OpenGL.GL import *
import OpenGL.GL.shaders
def main():
if not glfw.init():
return
window = glfw.create_window(800,600,"My OpenGL Window", None, None)
if not window:
glfw.terminate()
return
glfw.make_context_current(window)
triangle = [-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
0.0, 0.5, 0.0]
triangle = numpy.array(triangle, dtype = numpy.float32)
vertex_shader = """
#version 460
in vec3 position;
void main()
{
gl_Position = position;
}
"""
fragment_shader = """
#version 460
void main()
{
gl_FragColor = vec4(1.0f,0.0f,0.0f,1.0f);
}
"""
shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER),
OpenGL.GL.shaders.compileShader(fragment_shader,GL_FRAGMENT_SHADER))
VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, 36, triangle, GL_STATIC_DRAW)
position = glGetAttribLocation(shader, "position")
glVertexAttribPoint(position, 3, GL_FLOAT, GL_FALSE, 0, None)
glEnableVertexAttribArray(position)
glUseProgram(shader)
glClearColor(0.2, 0.3, 0.2, 1.0)
while not glfw.window_should_close(window):
glfw.poll_events()
glClear(GL_COLOR_BUFFER_BIT)
glDrawArrays(GL_TRIANGLES, 0, 3)
glfw.swap_buffers(window)
glfw.terminate()
if __name__ == "__main__":
main()
Я продолжаю получать эту ошибку
Traceback (последний вызов был последним):
File "/Users/Datboi/Desktop/Python/Opengl/main.py", line 71, in <module> main() File "/Users/Datboi/Desktop/Python/Opengl/main.py", line 43, in main shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER), File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 226, in compileShader shaderType, RuntimeError: ('Shader compile failure (0): b"ERROR: 0:2: \'\' : version \'460\' is not supported\\n"', [b'\n #version 460\n in vec3 position;\n \n void main()\n {\n gl_Position = position;\n }\n\n '], GL_VERTEX_SHADER)
Я не могу найти что-то, чтобы решить эту проблему. Я новичок в OpenGL/PyOpenGL и не могу найти ни одной записи, которая задала бы примерно тот же вопрос
1 ответ
ОШИБКА: 0:2: \'\': версия \'460\' не поддерживается
вызвано тем, что вы не указываете версию OpenGL перед созданием окна. Поскольку ваша система поддерживает только версию 4.1 OpenGL, вы должны добавить следующие строки кода. Смотрите также Разработка OpenGL на OS X:
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 4)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 1)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
window = glfw.create_window(800,600,"My OpenGL Window", None, None)
Если вы решите эту проблему, вы столкнетесь со следующей проблемой:
В то время как gl_Position
однородные координаты, входная переменная вершинного шейдера position
имеет тип vec3
,
Назначение gl_Position = position
вызывает ОШИБКУ:
присвоение несовместимых типов
Вы можете решить эту проблему, изменив вершинный шейдер. Либо измените назначение
#version 410 core
in vec3 position;
void main()
{
gl_Position = vec4(position, 1.0);
}
или измените тип входной переменной:
#version 410 core
in vec4 position;
void main()
{
gl_Position = position;
}
поскольку gl_FragColor
устарела в базовой версии 4.60, вы должны объявить выходную переменную фрагментного шейдера вместо использования устаревшей встроенной выходной переменной gl_FragColor
:
#version 410 core
out vec4 frag_color;
void main()
{
frag_color = vec4(1.0f,0.0f,0.0f,1.0f);
}
Далее в вашей программе есть опечатка. Должно быть glVertexAttribPointer
вместо glVertexAttribPoint
,
Обратите внимание, что в профиле ядра OpenGL Context необходимо использовать объект массива вершин, поскольку объект массива вершин по умолчанию 0 недопустим в профиле ядра.
хорошо, я получаю эту ошибку сейчас
kages/OpenGL/GL/shaders.py", строка 108, в check_validate glGetProgramInfoLog( self), RuntimeError: Ошибка проверки (0): b'Validation Failed: объект привязки массива вершин не связан.\n'
Создайте и привяжите объект массива вершин после того, как контекст OpenGL станет текущим:
glfw.make_context_current(window)
VAO = glGenVertexArrays(1)
glBindVertexArray(VAO)
shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER),
OpenGL.GL.shaders.compileShader(fragment_shader,GL_FRAGMENT_SHADER))