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 код работал нормально без каких-либо изменений.

мораль:

всегда использовать последние версии драйверов.