Вчера я исследовал странный сбой в настройке моего объекта Vertex Buffer. Я только что переключился с простых цветов на текстуры, поэтому мой объект Vertex Buffer теперь содержит массив
struct VertexData { glm::vec4 pos; glm::vec2 texCoord; }
вместо
struct VertexData { glm::vec4 pos, color; }
На моей системе (чип Intel) все прошло гладко, но другая система с картой Radeon, использующей проприетарный драйвер Linux (fglrx), потерпела крах в настройке VBO. В конце концов мы отследили его до вызова glEnableVertexAttribArray и обнаружили, что
glEnableVertexAttribArray(1); //attribute location for texcoord
glEnableVertexAttribArray(0); //attribute location for position
работает, пока
glEnableVertexAttribArray(0); //attribute location for position
glEnableVertexAttribArray(1); //attribute location for texcoord
вылетает при первом звонке. (Обратите внимание, что расположение атрибутов поменяно местами во втором фрагменте.) Как получилось? Единственным объяснением, которое мне удалось найти, была ошибка драйвера, но это кажется мне маловероятным, потому что все другие приложения OpenGL работают. Или я что-то забыл сделать?
Для справки, я прилагаю соответствующую часть моего apitrace . На данный момент я настроил свой контекст, включил GL_DEPTH_TEST, GL_CULL_FACE и GL_TEXTURE_2D, загрузил некоторые текстуры и подготовил мою шейдерную программу (без явного вызова glBindAttribLocation).
glGetAttribLocation(3, in_Position) = 0
glGetAttribLocation(3, in_TexCoord) = 1
glGenVertexArrays(1, [1])
glBindVertexArray(1)
glGenBuffers(1, [1])
glBindBuffer(GL_ARRAY_BUFFER, 1)
glVertexAttribPointer(0, 4, GL_FLOAT, false, 0x18, NULL)
glVertexAttribPointer(1, 2, GL_FLOAT, false, 0x18, 0x10)
glEnableVertexAttribArray(0) <-- this crashes with AMD/ATI fglrx driver
glEnableVertexAttribArray(1)
(glBufferData вызывается позже в течение первого кадра.)