GLSL, блок интерфейса
Проблема:
учусь OpenGL от http://www.arcsynthesis.org/gltut/index.html учебник, и мне было очень трудно получить Учебник 13: Геометрия Самозванцы работает (6 + часов), и теперь он работает после действительно незначительного изменения в коде, который на самом деле должен быть no-op, и мне нужна ваша помощь, чтобы узнать, почему это что-то меняет.
объяснение - редактировал:
проблема в том, что с неизмененный код шейдер фрагментов не получил правильного ввода от шейдера геометрии, но с заменой шейдера геометрии out блок интерфейса для разделения переменных или предоставления блоку имени экземпляра программа работает нормально. Но эти изменения должны быть нет.
проблема, вероятно, в столкновении имен.
как это не работает:
in VertexData
{
vec3 cameraSpherePos;
float sphereRadius;
} vert[];
out FragData
{
flat vec3 cameraSpherePos;
flat float sphereRadius;
smooth vec2 mapping;
};
void main()
{
mapping =
cameraSpherePos =
sphereRadius =
EmitVertex();
/* mapping's value doesn't get to the fragment shader correctly */
}
но либо давая FragData имя экземпляра, как frag, и используя фраг.mappaing вместо внесения картирования, или используя 3 отдельных переменных решает проблему.
почему он не работает без имени экземпляра?
Edit: похоже, это проблема с драйвером.
3 ответов
создайте имена экземпляров для всех интерфейсных блоков, таких как:
FragData { // .. } gs2fs;
и затем:
gs2fs.cameraCornerPos = vec4(vert[0].cameraSpherePos, 1.0);
работа с образцами GLSL часто становится утомительной из-за неприятных проблем с версией.
некоторые общие советы по отладке:
- убедитесь, что вы включили правильные теги версии в источник шейдера
- убедитесь, что ваш драйвер OpenGL действительно поддерживает эту версию, вызвав
glGetString(GL_SHADING_LANGUAGE_VERSION)
- создать средство шейдерной перекомпиляции среды выполнения (например, назначив это ключевому событию)
- и прежде всего: используйте
glGetShaderInfoLog()
иglGetProgramInfoLog()
!
проблема на самом деле заключалась в том, что не использовался последний драйвер.
я запускал это на linux и получил последний драйвер от менеджера пакетов Ubuntu: NVIDIA 310-experimental. Но даже несмотря на то, что он экспериментальный, он довольно старый. При ручной установке 319 с сайта nvidia код работал нормально без каких-либо изменений.
мораль:
всегда использовать последние версии драйверов.