2025, Nov 18 15:02

Как исправить предупреждение GLSL «does not contain a #version line» в Ursina/Panda3D: переименуйте шейдеры в .vert и .frag

Разбираем, почему в Ursina/Panda3D GLSL-шейдеры дают «does not contain a #version line» при #version 150, и как исправить: переименуйте файлы в .vert и .frag.

GLSL‑шейдеры в Ursina (работает поверх Panda3D) могут выдать сбивающее с толку предупреждение даже когда файлы шейдеров выглядят совершенно корректными. Запускаете сцену — и вместо аккуратного рендера получаете сообщение, что ваш шейдер «does not contain a #version line», хотя в начале файлов стоит #version 150. Хитрость в том, что дело вовсе не в самом GLSL.

Симптом

:shader(warning): GLSL shader created-shader does not contain a #version line!

Исходники вершинного и фрагментного шейдера начинаются с #version 150, но предупреждение не исчезает.

Минимальная конфигурация, воспроизводящая предупреждение

Следующий фрагмент на Ursina загружает GLSL из файлов с расширением .glsl. Сцена самая обычная: небо, источник света, две сферы и пользовательский шейдер, применённый к обоим объектам.

from ursina import *
import numpy as np
SCR_W, SCR_H = 1080, 600
game = Ursina(size=(SCR_W, SCR_H))
window.vsync = False
window.title = "BONDING POTENTIAL TEST"
window.borderless = False
window.fullscreen = False
window.fps_counter.enabled = True
window.exit_button.enabled = False
window.color = color.black
EditorCamera()
skybox = Sky()
pivot_node = Entity()
DirectionalLight(parent=pivot_node, y=1.5, z=3, shadows=True, rotation=(65, -15, 45))
use_alt_view = True
fx = Shader(Shader.GLSL, vertex="testVertexShader.glsl", fragment="testFragShader.glsl")
atom_a = Entity(
    model='sphere',
    scale=1.0,
    world_position=np.array([1, -10, 35]),
    color=color.red,
    shader=fx
)
atom_b = Entity(
    model='sphere',
    scale=1.0,
    world_position=np.array([34, -10, 15]),
    color=color.blue,
    shader=fx
)

Что происходит на самом деле

В данном случае предупреждение вводит в заблуждение. Корневая причина — соглашение об именовании файлов. Panda3D ожидает расширения .vert и .frag для исходников GLSL и не принимает .glsl. После копирования и переименования файлов соответствующим образом предупреждение исчезает, а шейдер применяется к сцене и камере.

Исправление

Переименуйте исходники шейдеров, чтобы использовать .vert и .frag, и укажите эти имена при создании шейдера.

from ursina import *
import numpy as np
SCR_W, SCR_H = 1080, 600
game = Ursina(size=(SCR_W, SCR_H))
window.vsync = False
window.title = "BONDING POTENTIAL TEST"
window.borderless = False
window.fullscreen = False
window.fps_counter.enabled = True
window.exit_button.enabled = False
window.color = color.black
EditorCamera()
skybox = Sky()
pivot_node = Entity()
DirectionalLight(parent=pivot_node, y=1.5, z=3, shadows=True, rotation=(65, -15, 45))
use_alt_view = True
fx = Shader(Shader.GLSL, vertex="testVertexShader.vert", fragment="testFragShader.frag")
atom_a = Entity(
    model='sphere',
    scale=1.0,
    world_position=np.array([1, -10, 35]),
    color=color.red,
    shader=fx
)
atom_b = Entity(
    model='sphere',
    scale=1.0,
    world_position=np.array([34, -10, 15]),
    color=color.blue,
    shader=fx
)

Это всё изменение: оставьте GLSL как есть, с #version 150 в первой строке, и убедитесь, что имена файлов оканчиваются на .vert и .frag.

Почему это важно

Расширение файла определяет, как движок обрабатывает исходники шейдера. Если назвать файлы иначе, можно долго искать не ту проблему — править заголовки GLSL и сверять версии — в то время как настоящая причина лежит на поверхности, в файловой системе. В данном случае не было явного сообщения с подсказкой сменить расширения; единственным заметным симптомом было предупреждение о строке версии, из‑за чего диагностика легко уводит в сторону и отнимает время.

Я встречал такие ошибки, когда файл шейдера начинается с невидимых символов (например, с метки BOM в Windows), которые не отображаются в редакторе

Полезно помнить, что похожие предупреждения могут вызываться и кажущимися безобидными деталями на уровне файлов.

Выводы

Если вы подключаете GLSL в Ursina/Panda3D и видите предупреждение «does not contain a #version line», несмотря на #version 150 в начале файлов, в первую очередь проверьте имена. Используйте .vert для вершинных шейдеров и .frag для фрагментных. После переименования движок перестанет ругаться, и шейдер корректно привяжется. Держите заголовок GLSL строго в самом начале файла и учитывайте, как движок находит ресурсы: небольшое расхождение в соглашении об именовании легко превращает рабочий конвейер в тихой сбой.